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

dev*_*ist 2 python entropy information-theory scipy.stats

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

  • scipy.stats.entropy,如果qk=None
  • scipy.special.rel_entr
  • scipy.special.kl_div

为什么是三个一样的东西?有人能解释一下它们之间的区别吗?

Mar*_*ley 6

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

相反, 和scipy.special.rel_entr都是scipy.special.kl_div“逐元素函数”,可以与通常的数组运算结合使用,并且必须在生成聚合相对熵值之前对其进行求和。

虽然两者的总和相同(当与适当的概率向量一起使用时,其元素之和为 1),但第二个变体 ( scipy.special.kl_div) 在元素方面有所不同,因为它添加了 -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)))
Run Code Online (Sandbox Code Playgroud)

产量

0.5108256237659907
[ 0.80471896 -0.29389333] 0.5108256237659907
[0.40471896 0.10610667] 0.5108256237659906
Run Code Online (Sandbox Code Playgroud)

我不熟悉按元素附加条款背后的基本原理,scipy.special.kl_div但文档指出了可能解释更多信息的参考资料。

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