我正在尝试计算负对数似然。
我有一个真实标签的矢量y。我有一个估计概率的向量p。
我的NLL损失功能是:
NLL = - y.reshape(len(y), 1) * np.log(p) - (1 - y.reshape(len(y), 1)) * np.log(1 - p)
向量p中的一些概率是1.因此,某些np.log(1 - p)为0并且它给出了一个错误 在log
中遇到零除零如何解决这个问题?
请帮忙。
我试图做一个if else解决方案,以便
losslist = []
for i in range(y.shape[0]):
if y[i] == 1:
losslist.append(np.log(1 - p))
else:
losslist.append(np.log(p))
loss = np.array(losslist)
但它不起作用
欢迎任何建议。非常感谢你
答案 0 :(得分:1)
使用scipy.special.xlogy
。它正确处理零:
>>> import numpy as np
>>> from scipy import special
>>>
>>> p = np.array([0.5, 0.1, 0.0, 1.0, 0.0, 0.9])
>>> y = np.array([0, 1, 0, 1, 1, 1 ])
>>>
>>> -special.xlogy(y, p) - special.xlogy(1-y, 1-p)
array([ 0.69314718, 2.30258509, -0. , -0. , inf,
0.10536052])
答案 1 :(得分:0)
首先,您写了y[i] == 1
而不是p[i] == 1
。
您可以使用np.where
来模拟if/else
语句,也可以只替换问题值:
v = y.reshape(len(y), 1)
NLL = -v * np.log(p) - (1 - v) * np.log(1 - p)
NLL[NLL == -np.inf] = 0
替换问题值具有额外的好处,即即使对于p
的小值,它也可以使用,例如log(1e-324)
。
如果您想使用np.where
:
v = y.reshape(len(y), 1)
NLL = np.where(1 - p == 0,
-v * np.log(p) - (1 - v) * np.log(1 - p),
0)