使用sklearn进行多元线性回归与成本函数的正规方程不匹配

我需要将我的数据拟合到一个多元线性模型中。但是,sklearn.linear_model给出的结果与正规方程预测的结果不同。以下是两种方法的代码:

   x=np.arange(12).reshape(3,4)   y=np.arange(3,6).reshape(3,1)   x=np.insert(x,0,1,axis=1)   def normal(X,y):       return np.dot(np.dot(linalg.pinv(np.dot(X.T,X)),X.T),y)   normal(x,y)   >>> [[ 0.4375 ]       [-0.59375]       [-0.15625]       [ 0.28125]       [ 0.71875]]   from sklearn import linear_model   reg=linear_model.LinearRegression()   reg.fit(x,y)   reg.coef_   >>> [[ 0.    ,  0.0625,  0.0625,  0.0625,  0.0625]]

我的代码是否正确?


回答:

发生的情况是,您在数据矩阵中包含了截距项。默认情况下,scikit-learn的LinearRegression类会自动找到截距项,因此您不需要在矩阵中插入1的列:

from sklearn import linear_modelx=np.arange(12).reshape(3,4)y=np.arange(3,6).reshape(3,1)    reg=linear_model.LinearRegression()reg.fit(x,y)

因此,我们得到的系数和截距项如下:

In [32]: reg.coef_Out[32]: array([[ 0.0625,  0.0625,  0.0625,  0.0625]])In [33]: reg.intercept_Out[33]: array([ 2.625])

我们可以通过将矩阵的每一行与系数进行点积运算,并在最后加上截距项来验证我们是否得到了正确的结果

In [34]: x.dot(reg.coef_.T) + reg.intercept_Out[34]:array([[ 3.],       [ 4.],       [ 5.]])

现在,如果您想要特别匹配正规方程给出的结果,那是可以的,您可以插入一列1。但是,您需要禁用查找截距,因为您已经手动插入了一个可以执行此操作的特征。

因此:

x=np.arange(12).reshape(3,4)y=np.arange(3,6).reshape(3,1)x=np.insert(x,0,1,axis=1)reg = linear_model.LinearRegression(fit_intercept=False)reg.fit(x,y)

这样做后,我们现在得到的系数是:

In [37]: reg.coef_Out[37]: array([[ 0.4375 , -0.59375, -0.15625,  0.28125,  0.71875]])

这与正规方程的输出相匹配。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注