为什么 KL 散度给出 nan?是数学错误还是我的输入数据不正确?

jer*_*rry 1 numpy python-3.x

在以下代码中 s 返回 nan。由于 Q<1 中的每个值,因此当我取其对数时,它会返回负值。这是否意味着我无法使用 P 和 Q 的这些值计算 KL 散度,或者我可以修复它吗?

`P= np.array([1.125,3.314,2.7414]) 
Q=np.array([0.42369288, 0.89152044, 0.60905852])

for i in range(len(P)):
    if P[i] != 0 and Q[i]!=0:
        s= P[i] *np.log(P[i]/Q[i])
        print("s: ",s)` 
Run Code Online (Sandbox Code Playgroud)

wal*_*nut 5

首先,PQ应该描述概率质量函数,这意味着每个元素都应该在区间内[0,1],并且它们的总和应该为1,但您的示例并非如此。

第二个np.log是错误的。你把它放在那里有什么原因或者是拼写错误吗?它应该是P[i]*np.log(P[i]/Q[i])。您还想对 的所有这些项求和i

最后还有一个技术问题:如果发生了该怎么办P[i] = 0。在那种情况下np.log(0)就会产生问题。该术语的实际贡献应该是0在这种情况下(因为lim_{x->0} x*log(x) = 0)。您可以保证这一点,例如通过使用条款专门处理这种情况if

的情况Q[i] = 0会导致类似的问题,但是 KL 散度不存在,如果Q[i] = 0,但P[i] = 0无论如何都不存在。