计算逻辑回归代价函数时出现RuntimeWarning的原因排查
解决逻辑回归代价函数的NaN与Log警告问题
问题根源
当sigmoid函数的输入z绝对值过大时,输出会趋近于严格的0或1:
- 若
z是极大正数,np.exp(-z)几乎为0,sigmoid(z)≈1 - 若
z是极小负数,np.exp(-z)极大,sigmoid(z)≈0
此时计算np.log(0)会得到-inf,代入代价公式后会触发除法警告,最终累加得到nan。
解决方案
1. 限制Sigmoid输出范围(核心修复)
通过np.clip将sigmoid的输出限制在[1e-10, 1-1e-10]区间,避免出现严格的0或1,确保log运算的输入合法。
2. 改用向量化运算(优化效率+稳定性)
替换循环为numpy向量化计算,既提升速度,又避免循环中单个标量异常导致的全局NaN。
修改后的完整代码
import numpy as np def linear(x, Q): return np.dot(x, Q) def sigmoid(z): # 先限制z的范围,避免exp(-z)溢出 z = np.clip(z, -500, 500) return 1 / (1 + np.exp(-z)) def costf(x, y, Q): m = y.shape[0] z = linear(x, Q) g = sigmoid(z) # 裁剪g的取值,彻底避免0或1 g = np.clip(g, 1e-10, 1 - 1e-10) # 向量化计算代价总和 cost = -y * np.log(g) - (1 - y) * np.log(1 - g) return np.mean(cost) # 调用示例(假设x、y、Q已定义) cost = costf(x, y, Q) print(cost)
关键说明
np.clip(z, -500, 500):防止z过大导致np.exp(-z)超出浮点数范围(exp(500)已远大于float64的最大值)np.clip(g, 1e-10, 1-1e-10):确保log(g)和log(1-g)的输入始终是有限值,不会触发除以零警告- 向量化计算替代循环:避免单个样本的异常值污染整个代价总和,同时计算效率提升数倍
内容的提问来源于stack exchange,提问作者Mridul Hemrajani
相关产品推荐
相关产品推荐

