scipy 中用于计算相对熵的 3 个函数。有什么不同?

3 functions for computing relative entropy in scipy. What's the difference?

Scipy in python 提供了以下似乎计算相同信息论度量的函数,即 Kullback-Leibler 散度,也称为相对熵:

为什么三个相同的东西?有人可以解释一下它们之间的区别吗?

在离散概率向量之间计算 KL-divergence 的默认选项是 scipy.stats.entropy

相比之下,scipy.special.rel_entrscipy.special.kl_div 都是“element-wise 函数”,可以与通常的数组运算结合使用,并且必须先求和才能得出聚合相对熵值。

虽然两者的总和相同(当与适当的概率向量一起使用时,其元素总和为 1),但第二个变体 (scipy.special.kl_div) 的不同之处在于 element-wise 添加了 - x +y 项,即

(x log(x/y)) - x + y

在总和中抵消了。

例如

from numpy import array
from scipy.stats import entropy
from scipy.special import rel_entr, kl_div

p = array([1/2, 1/2])
q = array([1/10, 9/10])

print(entropy(p, q))
print(rel_entr(p, q), sum(rel_entr(p, q)))
print(kl_div(p, q), sum(kl_div(p, q)))

产量

0.5108256237659907
[ 0.80471896 -0.29389333] 0.5108256237659907
[0.40471896 0.10610667] 0.5108256237659906

我不熟悉 scipy.special.kl_div element-wise extra-terms 背后的基本原理,但文档指向一个可能解释更多的参考。

参见: https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.kl_div.html#scipy.special.kl_div