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

实现简单线性回归梯度下降时遇double_scalars溢出错误求助

解决梯度下降中的"overflow encountered in double_scalars"错误

嘿,这个溢出问题我之前也踩过坑!本质是你的梯度下降过程里参数b和m在不断发散,数值大到超出了浮点数的范围,主要有两个常见诱因,我给你一步步拆解解决:

核心问题分析

  1. 学习率(alpha)设置过大:梯度下降的步长太猛,每次更新参数直接"迈过头",导致参数值越变越大,最后直接炸掉。
  2. 特征未做标准化/归一化:如果你的特征X数值范围很大(比如X是房屋面积,从几十到几千),计算梯度时的项会被放大,参数更新幅度直接失控。

具体修复方案

1. 先给特征做标准化处理

这是最关键的一步!把特征缩放到相近尺度,能让梯度更新瞬间稳定。推荐用Z-score标准化(把数据转换成均值为0、标准差为1的分布),修改你的get_data函数:

def get_data(df, feature, predict):
    X = df[feature]
    Y = df[predict]
    # 添加Z-score标准化
    X = (X - np.mean(X)) / np.std(X)
    X = np.float64(X)
    Y = np.float64(Y)
    return X, Y

2. 调整学习率alpha

别一开始就用0.1或者更大的值,从极小的数值开始试:比如0.001、0.01,然后观察损失函数变化——如果损失持续下降,说明这个alpha合适;如果损失反而飙升,那就再调小。

3. 完善梯度下降函数,添加收敛判断

无限迭代也可能导致参数发散,最好加上停止条件:当梯度变化小到可以忽略(比如小于1e-6),或者达到设定的最大迭代次数就停止。同时用向量化操作替代循环,既高效又减少出错概率:

def compute_gradient(X, Y, b, m):
    # 向量化计算,比循环快很多
    error = b + m * X - Y
    grad_b = np.mean(error)
    grad_m = np.mean(error * X)
    return grad_b, grad_m

def gradient_descent(X, Y, initial_b, initial_m, alpha, max_iterations):
    b = initial_b
    m = initial_m
    for i in range(max_iterations):
        grad_b, grad_m = compute_gradient(X, Y, b, m)
        # 更新参数
        b -= alpha * grad_b
        m -= alpha * grad_m
        # 每100轮打印一次损失,观察收敛情况
        if i % 100 == 0:
            loss = np.mean((b + m*X - Y)**2) / 2
            print(f"迭代次数 {i}: 损失值 = {loss:.4f}, b = {b:.4f}, m = {m:.4f}")
        # 当梯度足够小时,提前停止
        if np.abs(grad_b) < 1e-6 and np.abs(grad_m) < 1e-6:
            print(f"在第 {i} 轮迭代收敛")
            break
    return b, m

调试小技巧

  • 一定要打印每轮的损失值:如果损失越来越大,立刻停手,要么是alpha太大,要么是没做标准化。
  • 初始参数设为0没问题,但如果数据没处理,还是会出问题,所以标准化优先。

内容的提问来源于stack exchange,提问作者Agam Dogra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:09:49