Linear Regression参数计算错误:梯度下降求参异常求助
梯度下降实现线性回归参数错误排查
你的问题核心在于未对输入特征做缩放处理,再加上学习率过小、迭代次数不足,导致梯度下降未能收敛到最优参数。以下是具体分析和修复方案:
问题分析
- 特征尺度差异过大:TV广告数据的范围是
~17到296,而sales的范围是~7到27。未缩放的特征会导致w和b的梯度尺度差异极大——w的梯度会被大尺度的x放大,而b的梯度尺度很小。此时用同一个学习率无法同时让两个参数高效收敛:学习率太小则b更新极慢,学习率太大则w会震荡。 - 学习率与迭代次数不匹配:你设置的
tmp_alpha=1e-5过小,即使迭代10000次,b也仅更新到0.17,远未达到最优值7.03;同时w的更新因为特征尺度大,看似有变化,但实际是在错误的方向上逼近。
修复方案
步骤1:特征标准化
对TV特征做标准化处理(减去均值除以标准差),消除尺度差异:
# 标准化TV特征 tv_mean = np.mean(tv_ad) tv_std = np.std(tv_ad) tv_ad_scaled = (tv_ad - tv_mean) / tv_std
步骤2:调整学习率与迭代次数
标准化后,梯度尺度统一,可以使用更大的学习率(比如0.1),同时减少迭代次数(比如1000)即可收敛:
w_init = 0 b_init = 0 iterations = 1000 tmp_alpha = 0.1 # 标准化后可使用更大的学习率 # 使用标准化后的特征运行梯度下降 w_scaled, b_scaled, j_hist, p_hist = gradient_descent(tv_ad_scaled, sales, w_init, b_init, tmp_alpha, iterations, compute_cost_func, compute_gradient)
步骤3:还原参数到原始尺度
因为训练用的是标准化后的特征,需要将参数转换回原始特征的尺度:
# 还原原始特征对应的w和b w_final = w_scaled / tv_std b_final = b_scaled - w_scaled * tv_mean / tv_std print(f"(w,b)还原后: ({w_final:8.4f},{b_final:8.4f})")
验证结果
运行修改后的代码,输出会接近statsmodels的结果:
(w,b)还原后: ( 0.0475, 7.0326)
额外建议
- 可以在梯度下降中加入收敛判断:当梯度的绝对值小于某个阈值(比如
1e-6)时提前停止迭代,避免不必要的计算。 - 你的
compute_gradient函数公式是正确的,无需修改。
内容的提问来源于stack exchange,提问作者fatihsarioglu164
相关产品推荐
相关产品推荐

