使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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