用最小二乘法訓練神經網路 尋找最小二乘法

2021-10-18 16:53:36 字數 1621 閱讀 4617

今天聊最小二乘法的實現。

都知道線性回歸模型要求解權重向量w,最傳統的做法就是使用最小二乘法。

根據在scikit-learn的文件,模型sklearn.linear_model.linearregression,使用的就是最小二乘法(least squares ):

可是,最小二乘法在哪實現呢?

光看api肯定是看不出來的,要深入到原始碼中去。不過,要找最小二乘法,首先我們得要知道她長什麼樣。

這個問題有點複雜。準確來說,最小二乘法是一種解法,用來求當均方誤差最小時,權重向量w的閉式解。不過好在,我們知道閉式解長這樣:

如果用python來實現,對應的**應該長這樣:

np.linalg.inv(x.t.dot(x)).dot(x.t).dot(y)
好了,可以開始按圖索驥了。

api具體檔案路徑/sklearn/linear_model/_base.py,這是個近600行的大檔案,我們要找的linearregression類,在不同版本位置略有不同,目前最新的0.22.1版在375行,起頭長這樣:

linearregression類內容也不少,不過大多數都是各種分支判斷,一行行看找得太慢。好在我們知道,最小二乘法是線性回歸的優化方法,只是在模型的訓練階段時候登場。對應到api當中,就是最小二乘法的fit方法了,在467行:

不過,**還是很長...... 沒關係,還有辦法。根據api文件,模型的權重向量w,是儲存在屬性coef_(英文coefficients的縮寫,意為「係數」)中:

既然在類中,就找self.coef_的賦值好了。很快定位到532行:

這裡出現了x和y,主角都登場了,可是舞台卻是numpy的線性代數工具庫linalg,為什麼沒找到想要找的那段**呢?

因為,這裡的lstsq,就是numpy提供的最小二乘法計算工具:

看來scikit-learn選擇的是直接呼叫現成工具,不打算重複造輪子了。如果還不放心,可以用這段**反覆比較一下,w1和w2的值是完全相等的:

import numpy as np

x =np.random.rand(4,3)

y =np.random.rand(4)

w1=np.linalg.lstsq(x, y)[0]

w2=np.linalg.inv(x.t.dot(x)).dot(x.t).dot(y)

下回再聊。

python用最小二乘法擬合正弦函式

載入庫 import numpy as np from scipy.optimize import leastsq import pylab as pl 定義函式形式和誤差 def func x,p a,k,theta p return a np.sin 2 np.pi k x theta def ...

用最小二乘法來擬合資料

標籤 空格分隔 機器學習 向量x 1.1,1.9,3.1,3.9 向量y 0.1,0.2,0.3,0.4 xy x y 4其中 是點乘操作,向量x與向量y的點乘 xx x x 4向量的點乘,也叫向量的內積 數量積,對兩個向量執行點乘運算,就是對這兩個向量對應位一一相乘之後求和的操作,點乘的結果是乙個...

機器學習最基礎演算法之最小二乘法(最小平方法)

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