sklearn linear_model拟合水平线数据得到非零斜率的问题排查
问题
使用sklearn的linear_model.LinearRegression拟合一组y值全为0.17的水平线数据,模型返回的斜率却不是0,而是[-3.06072077e-32],代码如下:
import numpy as np from sklearn import linear_model reg = linear_model.LinearRegression() X=[[733803], [733831], [733862], [733892], [733923], [733953], [733984], [734015], [734045], [734076], [734106], [734137], [734168], [734196]] y=[0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17,0.17] reg.fit(X,y) print(reg.coef_)
预期斜率应为0,但实际返回上述极小值。绘图代码及结果如下:
plt.scatter(X, y,color='g') plt.plot(X, reg.predict(X),color='k') plt.show()

解答
这是浮点数数值计算的精度误差导致的,并非代码逻辑问题:
- 当所有y值完全相同时,理论最优拟合斜率确实是0,但sklearn线性回归底层采用矩阵运算求解,浮点数在计算机存储和计算过程中存在微小精度损耗,最终得到一个无限趋近于0的极小值(
-3.06e-32属于可忽略的数值噪声量级)。 - 可以验证模型截距
reg.intercept_,其值会非常接近0.17;同时用模型预测X的结果也会与0.17几乎完全一致,说明模型已正确拟合水平线。 - 若需要严格将这类极小值视为0,可手动添加阈值判断,例如当系数绝对值小于
1e-10时,直接认定为0。
内容的提问来源于stack exchange,提问作者storeguy
相关产品推荐
相关产品推荐

