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

前言

很多演算法在参数计算时,常会使用最小平方法(OLS)或最大概似法(MLE)求解,因此,努力K了一下,把心得记录下来,希望能与同好分享。

其中,涉及数学证明,希望能以浅显的角度说明,如不够精準,还请不吝指正。

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

最小平方法最常被使用在线性迴归模型上,以下图为例:
http://img2.58codes.com/2024/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

简化为:
http://img2.58codes.com/2024/20001976gytJ83zWQB.png

利用微分,一阶导数为0时,有最小值:
http://img2.58codes.com/2024/20001976hjdDay69hg.png

移项后,得到β:
http://img2.58codes.com/2024/20001976NLWmSCfFTE.png

到此,我们就可以利用矩阵计算 β 值了。如要更详细的推导过程,可参考『这里』。

撰写程式

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)』。

程式码可由此下载。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章