最小二乘法中的「二乘」代表平方,最小二乘也就是最小平方。例如,使用最小二乘法求解平方損失函數最小值,推導如下:首先,平方損失函數為:
求取平方損失函數𝑚𝑖𝑛(𝑓) 最小時,對應的 𝑤。首先求 𝑓 的 1 階偏導數:
令
即為平方損失函數最小時對應的 w 參數值,也就是最佳擬合直線。
使用Python實現:
def w_calculator(x, y):
n = len(x)
w1 = (n*sum(x*y) - sum(x)*sum(y))/(n*sum(x*x) - sum(x)*sum(x))
w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))
return w0, w12 使用scipy.optimize.leastsq求解leastsq就是使用最小二乘法求解的工具包。
關於 scipy.optimize.leastsq() 的具體使用介紹,可以閱讀 官方文檔。特別注意的是,上面我們定義的 p_init 並不是官方文檔中最小化初始參數的意思,因為最小二乘法是解析解,其不會涉及到從某個參數開始迭代的過程。實際上,這裡 p_init 的具體取值不會影響求解結果,所以我們使用了隨機值,但是其值的個數決定了最終多項式的次數。具體來說,n 個值則最終求解出的是 n−1 次多項式。
本例是求解一元線性回歸,因此n取2,即w0和w1。
from scipy.optimize import leastsq
import numpy as np
w_init = np.random.randn(2)
def loss_func(w, x, y):
w0, w1 = w
y_hat = w0 + w1*x
loss = y_hat - y
return loss
W = leastsq(loss_func, w_init, args=(x, y))3 使用sklearn.linear_model.LinearRegression求解sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)- fit_intercept: 默認為 True,計算截距項。
- normalize: 默認為 False,不針對數據進行標準化處理。
- copy_X: 默認為 True,即使用數據的副本進行操作,防止影響原數據。
- n_jobs: 計算時的作業數量。默認為 1,若為 -1 則使用全部 CPU 參與運算from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x.reshape(len(x), 1), y) # 注意,fit必須要求x的shape為n行1列,y的shape沒有這個要求
model.intercept_, model.coef_其實,LinearRegression求解過程中不僅使用了最小二乘法,還融合了部分嶺回歸,LASSO回歸等。