使用梯度下降实现线性回归结果异常,与Sklearn结果不符求排查
梯度下降与Sklearn线性回归结果不一致的原因分析
1. 数据未做标准化处理
梯度下降对特征尺度极度敏感,而Sklearn的LinearRegression采用闭式最小二乘法求解,完全不受特征尺度影响。你的输入特征alcohol和目标变量total大概率数值范围差异较大,导致参数m(斜率)和c(截距)的梯度更新速率失衡——比如alcohol数值偏大,m的每轮更新幅度远大于c,1000轮迭代后模型还没收敛到最优状态,自然和闭式解结果差距大。
解决办法:先对alcohol做标准化处理(比如Z-score标准化:(x - x.mean())/x.std()),再运行梯度下降,参数收敛速度会大幅提升,结果也会和Sklearn的输出对齐。
2. 迭代次数不足
你设置的epochs=1000搭配learning_rate=0.0001,迭代次数明显不够。学习率极小意味着每轮参数更新幅度非常有限,需要更多迭代才能逼近最优解。
可以尝试将epochs调高到10000甚至100000,观察m和c是否逐渐接近Sklearn给出的2.0325和5.8578;也可以适当调大学习率(比如0.001),但要注意避免学习率过高导致参数震荡无法收敛。
3. 梯度计算逻辑验证
你的梯度下降公式是正确的:
- MSE损失对斜率
m的偏导:$\frac{\partial L}{\partial m} = \frac{2}{n}\sum -x_i(y_i - (m x_i + c))$,代码中dm的计算完全匹配,最终m = m_k - dm * learning_rate的更新逻辑正确。 - MSE损失对截距
c的偏导:$\frac{\partial L}{\partial c} = \frac{2}{n}\sum -(y_i - (m x_i + c))$,dc的计算也没问题。
所以梯度计算本身不是问题,核心矛盾还是收敛速度和尺度适配的问题。
内容的提问来源于stack exchange,提问作者Manu62
相关产品推荐
相关产品推荐

