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

时间:2018-03-23 17:49:18

标签: python machine-learning scikit-learn linear-regression

我必须使我的数据适合多元线性模型。但是sklearn.linear_model产生的答案与Normal Normal预测的答案不同。这两个答案都有:

   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]]

我的代码是否正确?

1 个答案:

答案 0 :(得分:0)

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

from sklearn import linear_model
x=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.]])

现在,如果你想特定匹配正常方程给你的东西,那很好,你可以插入一列。但是,您需要禁用查找拦截,因为您手动插入了可以为您执行此操作的功能。

因此:

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]])

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