使用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
相关产品推荐
相关产品推荐

