You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linear Regression参数计算错误:梯度下降求参异常求助

梯度下降实现线性回归参数错误排查

你的问题核心在于未对输入特征做缩放处理,再加上学习率过小、迭代次数不足,导致梯度下降未能收敛到最优参数。以下是具体分析和修复方案:

问题分析

  1. 特征尺度差异过大:TV广告数据的范围是~17到296,而sales的范围是~7到27。未缩放的特征会导致w和b的梯度尺度差异极大——w的梯度会被大尺度的x放大,而b的梯度尺度很小。此时用同一个学习率无法同时让两个参数高效收敛:学习率太小则b更新极慢,学习率太大则w会震荡。
  2. 学习率与迭代次数不匹配:你设置的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:09:30