首页 > 解决方案 > 为什么KL散度给了nan?是一些数学错误还是我的输入数据不正确?

问题描述

在以下代码中,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)` 

标签: python-3.xnumpy

解决方案


首先,P并且Q应该描述概率质量函数,这意味着每个元素都应该在区间中[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无论如何都不存在。


推荐阅读