利用python手動寫最小二乘估計

2021-07-05 20:17:52 字數 2810 閱讀 5200

今天朋友請我吃完晚飯回來,剛剛乙個python群問起最小二乘回歸估計的問題,他不知道在python裡面怎麼實現,我告訴他有很多方法去實現,比如說sklean庫裡面有關於最小二乘估計現成模組,利用pyper呼叫r軟體裡面lm,再或者利用sas裡面的proc  reg過程,最後還是不知道怎麼弄,不得不說從原理到實現跟他講了一遍,說最小二乘估計最後就是矩陣求逆和求轉置相乘估計出來,最後利用numpy庫根據原理自己寫code重新實現一遍,資料是用的鳶尾花的資料(iris,r裡面自帶的),直接上程式:

#i是矩陣求逆  ,t是表示矩陣轉置在numpy庫中

import numpy as np

import pandas as pd

test=pd.read_csv("c:\\users\\administrator\\desktop\\iris.csv")

ols_matrix_x=np.matrix(test.iloc[:,2:4],dtype=np.float64)

ols_matrix_y=np.matrix(test.iloc[:,1],dtype=np.float64).t

b=(ols_matrix_x.t*ols_matrix_x).i*ols_matrix_x.t*ols_matrix_y

print u"引數項矩陣為".format(b)

i=0parameter=

while i<2:

i+=1

temp_e=ols_matrix_y-ols_matrix_x*b

mye=temp_e.sum()/temp_e.size

e=np.matrix([mye,mye,mye]).t

print "%f*sepal.width+%f*petal.length"%(parameter[0],parameter[1])

結果:最小二乘法估計的引數為[[ 1.20291972]

[ 0.56905789]]

1.202920*sepal.width+0.569058*petal.length

別急利用pyper庫呼叫r裡面的lm方法進行驗證比較,直接上**:

import pyper as pr

import pandas as pd

mpg=pd.read_csv("c:\\users\\administrator\\desktop\\iris.csv")

r=pr.r(rcmd="d:\\program files\\r\\r-3.1.3\\bin\\r",use_dict=true,use_pandas=true,use_numpy=true)

r.assign("rmpg",mpg)

# print r("summary(rmpg)")

print r("colnames(rmpg)")

r("result_lm<-lm(sepal.length~ 0+sepal.width + petal.length ,data=rmpg)")

print r("summary(result_lm)")

結果是:

try()

[1] "unnamed..0" "sepal.length" "sepal.width" "petal.length" "petal.width"

[6] "species"

try()

call:

lm(formula = sepal.length ~ 0 + sepal.width + petal.length, data = rmpg)

residuals:

min 1q median 3q max

-1.08398 -0.26510 0.05398 0.34020 1.07735

coefficients:

estimate std. error t value pr(>|t|)

sepal.width 1.20292 0.02233 53.86 <2e-16 ***

petal.length 0.56906 0.01662 34.24 <2e-16 ***

---signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

residual standard error: 0.4148 on 148 degrees of freedom

multiple r-squared: 0.9951, adjusted r-squared: 0.9951

f-statistic: 1.51e+04 on 2 and 148 df, p-value: < 2.2e-16

估計出來的引數是不一模一樣?

當存在共線性時可以用到嶺回歸和lasso回歸來處理,如果不用到嶺回歸和lasso回歸,當變數共線性時矩陣可能不存在逆,這時候引數根本就無法估計正常情況下,還好學過高等代數的都知道,矩陣裡面存在一種求偽逆的方法,在python中是np.linalg.pinv方法求矩陣的逆,如果矩陣是奇異矩陣,則可以通過np.linalg.pinv(x.t*x)的形式求出。

哈哈哈  希望能幫你們理解最小二乘估計原理,   上面過程是無截距項估計,要是要用到有截距項估計,在上面矩陣加入一列全部是1即可,  在lm方法中加入formula = sepal.length ~ 1+ sepal.width + petal.length,  即可,話說回來,在工業界做模型更多用的無截距項,r裡面估計出來的結果資訊比較多,t檢驗、f檢驗的結果都全部出來,但是自己寫的最小二乘估計就差遠了,洗澡。。。。睡覺去了,不說了

原 python最小二乘

import numpy as np from scipy.optimize import leastsq 取樣點 xi,yi xi np.array 8.19,2.72,6.39,8.71,4.7,2.66,3.78 yi np.array 7.01,2.78,6.47,6.71,4.1,4.23...

最小二乘 加權最小二乘 matlab實現

最小二乘 最小二乘法 又稱最小平方法 是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小 最小二乘法還可用於曲線擬合,其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。加權最小...

最小二乘擬合 6 7 最小二乘擬合問題

資料擬合問題的一般形式 任給一組離散資料 注 這裡的擬合函式不一定為多項式函式 記殘量的平方和為 求使得殘量平方和最小得一組係數就是線性最小二乘問題,為最小二乘問題得基函式,求得的擬合函式為資料的最小二乘擬合。求解 利用偏導數為零得到極值點的原理可以得到最小二乘問題滿足的方程組,求解方程組中未知係數...