线性回归梯度下降中参数b发散问题及修复方法咨询
问题修复方案
核心错误:误差项符号错误
你的梯度下降代码中,误差计算部分出现了符号错误。线性回归的预测值应为 ŷ = w*x[i] + b,真实值与预测值的误差是 y[i] - ŷ = y[i] - w*x[i] - b,但你写成了 y[i] - w*x[i] + b,这直接导致梯度计算的方向完全反转,参数 b 的更新持续朝着错误的方向累积,最终发散至无穷大。
修复后的代码
1. 修正符号错误(随机梯度下降版本)
def gradient_descent(x, y, alpha, epochs): w = 0.0 b = 0.0 n = len(x) for a in range(epochs): if a % 100 == 0: print(f"Epoch {a}: w={w:.4f}, b={b:.4f}") for i in range(n): # 修正误差项的符号 error = y[i] - (w * x[i] + b) new_w = (-2 * alpha * x[i] * error) / n new_b = (-2 * alpha * error) / n w -= new_w b -= new_b return w, b
2. 更稳定的批量梯度下降版本(推荐)
逐个样本更新的随机梯度下降容易震荡,批量梯度下降先累加所有样本的梯度再更新,收敛更稳定:
def batch_gradient_descent(x, y, alpha, epochs): w = 0.0 b = 0.0 n = len(x) for a in range(epochs): if a % 100 == 0: print(f"Epoch {a}: w={w:.4f}, b={b:.4f}") # 初始化梯度累加器 dw = 0.0 db = 0.0 for i in range(n): error = y[i] - (w * x[i] + b) dw += x[i] * error db += error # 计算平均梯度并更新参数 w += (2 * alpha / n) * dw b += (2 * alpha / n) * db return w, b
额外优化建议
- 特征缩放:你的
x取值范围是-500到500,数值跨度大,会导致梯度值波动大。可以对x做归一化处理,这样能让梯度下降收敛更快,学习率也更容易调整:x_normalized = (x - x.mean()) / x.std() - 调整学习率:如果使用归一化后的特征,学习率可以适当调大(比如
alpha=0.01),收敛速度会更快。
内容的提问来源于stack exchange,提问作者Iya Lee
相关产品推荐
相关产品推荐

