当一些预测概率为1时,Python numpy负对数似然计算

时间:2018-04-01 20:11:14

标签: python numpy

我正在尝试计算负对数似然。

我有一个真实标签的矢量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)  

但它不起作用

欢迎任何建议。非常感谢你

2 个答案:

答案 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)