iT邦幫忙

3

優化雙雄 -- 最小平方法(OLS) vs. 最大概似法(MLE) , Part 1

  • 分享至 

  • xImage
  •  

前言

很多演算法在參數計算時,常會使用最小平方法(OLS)或最大概似法(MLE)求解,因此,努力K了一下,把心得記錄下來,希望能與同好分享。

其中,涉及數學證明,希望能以淺顯的角度說明,如不夠精準,還請不吝指正。

最小平方法(Ordinary least squares, OLS)

最小平方法最常被使用在線性迴歸模型上,以下圖為例:
https://ithelp.ithome.com.tw/upload/images/20200605/20001976VvAUuh66cT.png
圖片來源:tirthajyoti/Machine-Learning-with-Python

藍色的圓點為實際值,紅色為迴歸線,誤差(ε) = 實際值 - 預測值(迴歸線),我們期望誤差總和越小越好,但為避免正、負誤差抵銷,所以,通常會將誤差取平方和,再除以樣本數,就得到上圖的均方誤差(MSE)公式,我們就稱之為損失函數(Loss Function)、目標函數(Object Function)或成本函數(Cost function)。

假設一個線性模型如下:
https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20b0%20%2B%20b1%20*%20X1%20%2B%20b2*%20X2%20%2B%20...

可以簡化為:
https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20W%20*%20X%20%2B%20b

又因
https://chart.googleapis.com/chart?cht=tx&chl=b%20%3D%20b%20*%20X_%7B0%7D

可進一步簡化為:
https://chart.googleapis.com/chart?cht=tx&chl=y%20%3D%20%5Cbeta%20*%20X

迴歸線求解的問題,就可以定義為『在極小化損失函數時,參數 β = ?』。

求解

損失函數 MSE,其中分母n為常數,不影響極小化,故拿掉如下:
https://chart.googleapis.com/chart?cht=tx&chl=%24%5Csum_%7B%7D%20(y-y%5Chat%7B%7D)%5E%7B2%7D

簡化為:
https://ithelp.ithome.com.tw/upload/images/20200605/20001976gytJ83zWQB.png

利用微分,一階導數為0時,有最小值:
https://ithelp.ithome.com.tw/upload/images/20200605/20001976hjdDay69hg.png

移項後,得到β:
https://ithelp.ithome.com.tw/upload/images/20200605/20001976NLWmSCfFTE.png

到此,我們就可以利用矩陣計算 β 值了。如要更詳細的推導過程,可參考『這裡』

撰寫程式

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston

# 載入 scikit-learn 內建的房屋估價資料集
boston_dataset = load_boston()
X = boston_dataset.data
# 設定 b 對應的 X,固定為 1
b=np.ones((X.shape[0], 1))

# X 結合 b 對應的 X
X=np.hstack((X, b))

# y 改為二維,以利矩陣運算
y = boston_dataset.target
y = y.reshape((-1, 1))

# 計算 Beta
Beta = np.linalg.inv(X.T @ X) @ X.T @ y

# 計算RMSE, RMSE = MSE 開根號 
SSE = ((X @ Beta - y ) ** 2).sum() 
MSE = SSE / y.shape[0]
RMSE = MSE ** (1/2)
print(RMSE)

# 計算判定係數
y_mean = y.ravel().mean()
SST = ((y - y_mean) ** 2).sum()
R2 = 1 - (SSE / SST)
print(R2)

比較

使用 scikit-learn 迴歸函數比較。

import numpy as np
import pandas as pd

# 載入 scikit-learn 內建的房屋估價資料集
from sklearn.datasets import load_boston
boston_dataset = load_boston()
X=boston_dataset.data
y = boston_dataset.target

# 計算 Beta
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 訓練模型
lin_model = LinearRegression()
lin_model.fit(X, y)

# 計算RMSE、判定係數 
from sklearn.metrics import r2_score
y_predict = lin_model.predict(X)
rmse = (np.sqrt(mean_squared_error(y, y_predict)))
r2 = r2_score(y, y_predict)

print(rmse)
print(r2)

矩陣求解:
RMSE = 4.679191295697281
R2 = 0.7406426641094095

scikit-learn:
RMSE = 4.679191295697282
R2 = 0.7406426641094094

答案很接近,Ya !

結論

最小平方法不只用在迴歸求解,在許多方面也有相當多的應用,尤其是神經網路的梯度下降法,也充分利用此方式求解。
下一篇我們繼續探討『最大概似法(MLE)』。

程式碼可由此下載


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言