線性模型 - 普通最小二乘法
廣義線性模型
目標值 y 是輸入變量 x 的線性組合
如果 是預測值,那麼有:
在sklearn中,定義向量 爲係數(斜率) coef_
,定義 爲截距 intercept_
普通最小二乘法
在sklearn中,LinearRegression
擬合一個帶有係數 的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。其數學表達式爲:
其係數的求解 - 正規方程:
正規方程的推導
令
由於向量2範數的公式爲:
再根據矩陣運算法則,可將原公式變形爲:
展開:
目的是求原函數的最小值,所以對其求導,令導數等於0即可
根據矩陣求導法則求導結果:
令 ,則:
移項化簡:
兩邊同時左乘逆矩陣 :
最後可得正規方程:
實例驗證
import numpy as np
from sklearn import linear_model
from sklearn import datasets
X, y = datasets.load_boston(True)
reg = linear_model.LinearRegression(fit_intercept=False)
reg.fit(X, y)
print('sklearn封裝好的LinearRegression模型計算的係數:', reg.coef_, sep='\n', end='\n\n')
coef = np.linalg.inv(X.T @ X) @ X.T @ y
print('自己用正規方程計算的係數:', coef, sep='\n')
結果:
sklearn封裝好的LinearRegression模型計算的係數:
[-9.28965170e-02 4.87149552e-02 -4.05997958e-03 2.85399882e+00
-2.86843637e+00 5.92814778e+00 -7.26933458e-03 -9.68514157e-01
1.71151128e-01 -9.39621540e-03 -3.92190926e-01 1.49056102e-02
-4.16304471e-01]
自己用正規方程計算的係數:
[-9.28965170e-02 4.87149552e-02 -4.05997958e-03 2.85399882e+00
-2.86843637e+00 5.92814778e+00 -7.26933458e-03 -9.68514157e-01
1.71151128e-01 -9.39621540e-03 -3.92190926e-01 1.49056102e-02
-4.16304471e-01]
我們發現,sklearn的LinearRegression模型計算的係數和我們直接用正規方程計算的係數一致,說明該模型的擬合的確用的是最小二乘法
但是這是忽略截距的情況,即 fit_intercept=False
如果需要截距,我們用正規方程求解時,需要把截距 對應的特徵 也加在數據 X
中(見文章開頭的廣義線性模型)求解:
import numpy as np
from sklearn import linear_model
from sklearn import datasets
X, y = datasets.load_boston(True)
reg = linear_model.LinearRegression()
reg.fit(X, y)
print('sklearn封裝好的LinearRegression模型計算的係數:', reg.coef_, sep='\n', end='\n\n')
print('sklearn封裝好的LinearRegression模型計算的截距:', reg.intercept_, sep='\n', end='\n\n')
# 截距w0對應的特徵爲1,所以添加一列值全爲1數組
x0 = np.ones(X.shape[0])
X = np.c_[x0, X]
intercept_coef = np.linalg.inv(X.T @ X) @ X.T @ y
print('自己用正規方程計算的係數:', intercept_coef[1:], sep='\n', end='\n\n')
print('自己用正規方程計算的截距:', intercept_coef[0], sep='\n')
結果:
sklearn封裝好的LinearRegression模型計算的係數:
[-1.08011358e-01 4.64204584e-02 2.05586264e-02 2.68673382e+00
-1.77666112e+01 3.80986521e+00 6.92224640e-04 -1.47556685e+00
3.06049479e-01 -1.23345939e-02 -9.52747232e-01 9.31168327e-03
-5.24758378e-01]
sklearn封裝好的LinearRegression模型計算的截距:
36.45948838509001
自己用正規方程計算的係數:
[-1.08011358e-01 4.64204584e-02 2.05586264e-02 2.68673382e+00
-1.77666112e+01 3.80986521e+00 6.92224640e-04 -1.47556685e+00
3.06049479e-01 -1.23345939e-02 -9.52747232e-01 9.31168327e-03
-5.24758378e-01]
自己用正規方程計算的截距:
36.459488385095966
我們發現,結果一致,說明sklearn中的LinearRegression模型的擬合原理正是最小二乘法。