機器學習 線性模型 普通最小二乘法 正規方程推導

線性模型 - 普通最小二乘法


廣義線性模型

目標值 y 是輸入變量 x 的線性組合

如果 y^\hat{y} 是預測值,那麼有:

y^(w,x)=w0+w1x1+...+wpxp\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p

在sklearn中,定義向量 w=(w1,...,wp)w = (w_1, ..., w_p) 爲係數(斜率) coef_ ,定義 w0w_0 爲截距 intercept_


普通最小二乘法

在sklearn中,LinearRegression 擬合一個帶有係數 w=(w1,...,wp)w = (w_1, ..., w_p) 的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。其數學表達式爲:

minwXwy22\min\limits_{w} || X w - y||_2^2

其係數的求解 - 正規方程:

w=(XTX)1XTyw = (X^TX)^{-1}X^Ty


正規方程的推導

f(w)=Xwy22f(w) = ||Xw - y||_2^2

由於向量2範數的公式爲:

X2=i=1nxi2||X||_2 = \sqrt{\sum\limits_{i = 1}^nx_i^2}

再根據矩陣運算法則,可將原公式變形爲:

f(w)=(Xwy)T(Xwy)f(w) = (Xw - y)^T(Xw - y)

展開:

f(w)=(wTXTyT)(Xwy)f(w) = (w^TX^T - y^T)(Xw - y)

f(w)=wTXTXwwTXTyyTXw+yTyf(w) = w^TX^TXw - w^TX^Ty - y^TXw + y^Ty

f(w)=wTXTXw2yTXw+yTyf(w) = w^TX^TXw - 2y^TXw + y^Ty

目的是求原函數的最小值,所以對其求導,令導數等於0即可

根據矩陣求導法則求導結果:

f(w)=2XTXw2XTyf'(w) = 2X^TXw - 2X^Ty

f(w)=0f'(w) = 0 ,則:

2XTXw2XTy=02X^TXw - 2X^Ty = 0

移項化簡:

XTXw=XTyX^TXw = X^Ty

兩邊同時左乘逆矩陣 (XTX)1(X^TX)^{-1}

(XTX)1(XTX)w=(XTX)1XTy(X^TX)^{-1}(X^TX)w = (X^TX)^{-1}X^Ty

最後可得正規方程:

w=(XTX)1XTyw = (X^TX)^{-1}X^Ty


實例驗證

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

如果需要截距,我們用正規方程求解時,需要把截距 w0w_0 對應的特徵 11 也加在數據 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模型的擬合原理正是最小二乘法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章