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

使用SciPy fmin_bfgs()处理正则化数据时出现警告求助

嘿,我看你在用带正则化的逻辑回归cost和gradient函数调用Scipy的fmin_bfgs()时碰到警告了,结合你给出的代码片段,我梳理了几个最可能的问题点和修复方案:

常见问题与修复建议

1. 梯度函数的维度不匹配(最容易触发警告)

fmin_bfgs()会把初始theta当成一维数组传入你的函数,但你的cost函数里把它reshape成了(1, len(theta))的二维结构。如果梯度函数处理不当,返回的梯度可能是二维数组,而fmin_bfgs()期望梯度是一维的,这会直接触发维度不匹配的警告。

给你补全并修正后的gradient函数示例:

def gradient(theta, x, y, lam):
    theta = theta.reshape(1, len(theta))
    m = len(x)
    predictions = sigmoid(np.dot(x, np.transpose(theta))).reshape(m, 1)
    
    # 计算基础梯度
    base_grad = np.dot(np.transpose(x), predictions - y) / m
    
    # 处理正则化:偏置项(theta[0])不参与正则化
    reg_term = (lam / m) * np.transpose(theta)
    reg_term[0] = 0  # 跳过第一个参数的正则化
    
    # 合并后转成一维数组返回(关键!)
    total_grad = base_grad + reg_term
    return total_grad.flatten()

2. 数值稳定性问题导致的NaN/Inf

当sigmoid的输出接近0或1时,log(predictions)或log(1-predictions)会变成负无穷,导致cost函数返回NaN,进而让fmin_bfgs()抛出收敛警告。你可以给预测值加一个极小的边界值来避免:

predictions = sigmoid(np.dot(x, np.transpose(theta))).reshape(len(x), 1)
# 限制预测值在[1e-10, 1-1e-10]之间,避免log(0)的情况
predictions = np.clip(predictions, 1e-10, 1 - 1e-10)

3. 正则化项的计算一致性

你的cost函数里正则化项是(lam / (2*m)) * sum(theta[1:]^2),对应的梯度正则化项应该是(lam/m)*theta[1:],一定要保证两者的系数一致,否则会导致优化方向错误,触发收敛缓慢或警告。

4. 调用fmin_bfgs()的参数传递

确保你调用时把额外参数(x、y、lam)通过args传入,比如:

initial_theta = np.zeros(x.shape[1])
optimized_theta = fmin_bfgs(cost, initial_theta, fprime=gradient, args=(x, y, lam))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:27:57