我需要将我的数据拟合到一个多元线性模型中。但是,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]])
这与正规方程的输出相匹配。