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

线性回归梯度下降中参数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:18