为什么scipy.stats.entropy(a,b)返回inf而scipy.stats.entropy(b,a)没有返回?

时间:2019-07-29 22:10:45

标签: python scipy

In [15]: a = np.array([0.5, 0.5, 0, 0, 0])

In [16]: b = np.array([1, 0, 0, 0, 0])

In [17]: entropy(a, b)
Out[17]: inf

In [18]: entropy(b, a)
Out[18]: 0.6931471805599453

由于给定的等式为inf,因此我希望他们都从documentation返回S = sum(pk * log(pk / qk), axis=0)。第18行出现非无限输出的原因是什么?

3 个答案:

答案 0 :(得分:2)

entropy(b, a)函数计算第一对:

1 * np.log(1/0.5)

其结果为0.6931471805599453

对于entropy(a, b),存在一种除以零的情况,0.5/0导致无限解。

对于其他情况,entropy()假设0 * np.log(0/0)等于0

答案 1 :(得分:2)

研究Kullback-Leibler散度的定义,似乎是由于其定义。

这是来自维基百科:

  

每当P(x)为零时,相应项的贡献就解释为零,因为   the limit goes to zero(单击方程式的链接)。

答案 2 :(得分:0)

当同时提供 p 和 q 时,熵函数计算 KL 散度。 KL 散度是不对称的,这意味着 KL(p,q)!=KL(q,p) 除非 p==q。因此你会得到不同的答案。

进一步,正如其他答案解释了这样一个事实,即您的分布中有零意味着我们将根据 KL 散度的定义除以零。

    KL(p,q) = sum(p * log(p/q))