前言
很多演算法在参数计算时,常会使用最小平方法(OLS)或最大概似法(MLE)求解,因此,努力K了一下,把心得记录下来,希望能与同好分享。
其中,涉及数学证明,希望能以浅显的角度说明,如不够精準,还请不吝指正。
最小平方法(Ordinary least squares, OLS)
最小平方法最常被使用在线性迴归模型上,以下图为例:
图片来源:tirthajyoti/Machine-Learning-with-Python
蓝色的圆点为实际值,红色为迴归线,误差(ε) = 实际值 - 预测值(迴归线),我们期望误差总和越小越好,但为避免正、负误差抵销,所以,通常会将误差取平方和,再除以样本数,就得到上图的均方误差(MSE)公式,我们就称之为损失函数(Loss Function)、目标函数(Object Function)或成本函数(Cost function)。
假设一个线性模型如下:
可以简化为:
又因
可进一步简化为:
迴归线求解的问题,就可以定义为『在极小化损失函数时,参数 β = ?』。
求解
损失函数 MSE,其中分母n为常数,不影响极小化,故拿掉如下:
简化为:
利用微分,一阶导数为0时,有最小值:
移项后,得到β:
到此,我们就可以利用矩阵计算 β 值了。如要更详细的推导过程,可参考『这里』。
撰写程式
import numpy as npimport pandas as pdfrom sklearn.datasets import load_boston# 载入 scikit-learn 内建的房屋估价资料集boston_dataset = load_boston()X = boston_dataset.data# 设定 b 对应的 X,固定为 1b=np.ones((X.shape[0], 1))# X 结合 b 对应的 XX=np.hstack((X, b))# y 改为二维,以利矩阵运算y = boston_dataset.targety = y.reshape((-1, 1))# 计算 BetaBeta = 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 npimport pandas as pd# 载入 scikit-learn 内建的房屋估价资料集from sklearn.datasets import load_bostonboston_dataset = load_boston()X=boston_dataset.datay = boston_dataset.target# 计算 Betafrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error# 训练模型lin_model = LinearRegression()lin_model.fit(X, y)# 计算RMSE、判定係数 from sklearn.metrics import r2_scorey_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)』。
程式码可由此下载。