Machine learning 线性回归闭式解的实现

Machine learning 线性回归闭式解的实现,machine-learning,scikit-learn,linear-regression,Machine Learning,Scikit Learn,Linear Regression,我想知道你们是否都知道sklearn的LinearRegression模块的后端是否使用了不同的方法来计算最佳beta系数。我使用封闭式解决方案实现了自己的解决方案 if self.solver == "Closed Form Solution": ### optimal beta = (XTX)^{-1}XTy XtX = np.transpose(X, axes=None) @ X XtX_inv = np.lina

我想知道你们是否都知道
sklearn的
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
,它使用基于SVD的方法。也就是说,那里的机制不会反转矩阵,因此与你的不同。请注意,有许多方法可以解决线性最小二乘问题


但是我们可以说,你得到的结果与他们的方法是相同的,因为这些对矩阵的运算无论如何都会有舍入误差,而你的“匹配”了他们(或相反)的许多有效数字。

谢谢!这就解释了!因此,上述方法保证即使XTX不是可逆的,它也能工作。@我很高兴能提供帮助!最小二乘问题总是有一个解;因此,是的,一种或另一种方法应该能够解决它(在可能的范围内,由于上述舍入问题)。