线性回归封闭形式解决方案的实现

Implementation of Linear Regression Closed Form Solution

不知道你们是否都知道 sklearn's LinearRegression 模块的后端是否使用不同的东西来计算最佳 beta 系数。我使用封闭式解决方案实现了自己的解决方案

    if self.solver == "Closed Form Solution":
        ### optimal beta = (XTX)^{-1}XTy
        XtX = np.transpose(X, axes=None) @ X
        XtX_inv = np.linalg.inv(XtX)
        Xty = np.transpose(X, axes=None) @ y_true
        self.optimal_beta = XtX_inv @ Xty

但是,当我打印与 sklearn 的系数相比时,我没有得到完全匹配。我认为有一个封闭形式的解决方案可以保证类似的结果(我的代码不处理不可逆)。

我注意到 MSE 相距并不远,但这让我怀疑我的实现是否错误(我考虑了偏差)

截距似乎出现了偏差:

SKLEARN INTERCEPT 1.2490009027033011e-15
HN INTERCEPT 4.440892098500626e-16
First Value HN 183.22200150945497
First Value SKLEARN 183.22200150945548
HN MSE 3.1084228599404546e-27
SKLEARN MSE 2.126667544039961e-25

数字是10^-15的顺序,也就是实际上都是0,一样的!

至于为什么 有区别:您正在通过直接反转 X.T @ X 矩阵来求解正规方程。另一方面,scikit-learn 使用 scipy.linalg.lstsq under the hood, which uses for example 一种基于 SVD 的方法。也就是说,那里的机制 not 反转矩阵,因此与你的机制不同。注意,线性最小二乘问题的求解方法有很多种。

但我们可以说您得到的结果与他们的方式相同,因为这些对矩阵的操作无论如何都会出现舍入误差,而您的结果与他们的“匹配” (反之亦然)许多有效数字。