为什么sklearn线性回归对通过(0,0)的直线给出非零截距?

时间:2015-11-30 18:30:01

标签: python scikit-learn linear-regression

给出 y = 3x 行的一些数据点:

from sklearn import datasets, linear_model
X = [[1],[2],[3],[4],[5]]
y = [[3],[6],[9],[12],[15]]
regr = linear_model.LinearRegression()
regr.fit(X,y)

然后:

regr.predict([[6], [7], [8], [9], [10]])

按预期给出:

array([[ 18.],
       [ 21.],
       [ 24.],
       [ 27.],
       [ 30.]])
正如预期的那样,

regr.coef_为3。但为什么regr.intercept_不是0?

regr.intercept_
array([ -3.55271368e-15])

2 个答案:

答案 0 :(得分:3)

这是一个浮点问题 - 数字非常接近0.您可以使用numpy的内置测试套件来检查

>>> from numpy.testing import assert_almost_equal
>>> assert_almost_equal(regr.intercept_, 0)

要回答为什么这个数字不为零,你可以去下面的兔子洞:

  • sklearn使用scipy.linalg.lstsq来拟合线性回归,
  • scipy.linalg.lstsq使用gelss中的LAPACK找到Ax = b的最小二乘解决方案,
  • gelss使用A的奇异值分解来解决。

我猜gelss是引入一点点错误的地方。

答案 1 :(得分:2)

-3.55271368e-15也可以写成0.000 000 000 000 003 552 713,因此您可以认为它为零并且舍入错误...

其余的只是假设,因为我没有阅读sklearn来源,但其原因并非真的为零

  • LinearRegression.fit()必须解决最小化问题(查找ab以最小化ax+b模型和数据集之间的平方误差。
  • 为了解决这个问题,可能会使用会聚到解决方案的迭代算法(梯度下降?)
  • 它的结束条件可能类似于Stop when abs(error(step n) - error(step n+1)) < epsilon。因为epsilon是一个固定的小值。

编辑: 话虽如此,这不是神经网络。 我非常确定通过推导平方误差表达式可以精确地求解线性(或多项式)回归。我觉得很奇怪,sklearn就是这样实现的。