给出 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])
答案 0 :(得分:3)
这是一个浮点问题 - 数字非常接近0.您可以使用numpy
的内置测试套件来检查
>>> from numpy.testing import assert_almost_equal
>>> assert_almost_equal(regr.intercept_, 0)
要回答为什么这个数字不为零,你可以去下面的兔子洞:
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()
必须解决最小化问题(查找a
和b
以最小化ax+b
模型和数据集之间的平方误差。Stop when abs(error(step n) - error(step n+1)) < epsilon
。因为epsilon是一个固定的小值。编辑: 话虽如此,这不是神经网络。 我非常确定通过推导平方误差表达式可以精确地求解线性(或多项式)回归。我觉得很奇怪,sklearn就是这样实现的。