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

计算逻辑回归代价函数时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:03:34