Python - 遇到log中的无效数值

30

我有以下表达式:

log = np.sum(np.nan_to_num(-y*np.log(a+ 1e-7)-(1-y)*np.log(1-a+ 1e-7)))

这个表达式会给我以下警告:

RuntimeWarning: invalid value encountered in log
  log = np.sum(np.nan_to_num(-y*np.log(a+ 1e-7)-(1-y)*np.log(1-a+ 1e-7)))

我不明白哪个值是无效的,也不知道为什么会出现这种情况。非常感谢任何帮助。

注意:这是一个交叉熵损失函数,我添加了1e-7以避免log里面出现零。 ya都是numpy数组,numpy被导入为np


请注意,np.log(np.NaN) 也会出现类似的警告。例如,在处理带有缺失值的pandas数据框时。 - Giuppox
3个回答

32
你可能仍然在对数中有负数,这会导致在实数范围内为nan。 ay应该代表0到1之间的概率,因此需要检查为什么存在较小/较大的值。添加1e-7显示存在问题,因为np.log(0)给出了-inf,我认为这是你想要的值。

我认为加上1e-7将会防止除以0的错误? - WoodyDRN

4
您可以使用math.log()替换numpy.log(),这可能会引发错误。
>>> import numpy
>>> numpy.log(0)
-inf
>>> numpy.__version__
'1.3.0'
>>> import math
>>> math.log(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

2
一个小注释:math.log() 接受一个实数作为输入,而 numpy.log() 可以接受实数列表作为输入。当然,在 OP 的情况下,这种差异并不重要。 - RandomWalker

0

log(x)x<=0 边缘情况下的处理

np.log(0)

RuntimeWarning: divide by zero encountered in log

-inf

np.log(-1)

RuntimeWarning: invalid value encountered in log

nan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接