计算离散概率向量之间的 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)))
产量
0.5108256237659907
[ 0.80471896 -0.29389333] 0.5108256237659907
[0.40471896 0.10610667] 0.5108256237659906
我不熟悉 scipy.special.kl_div 的元素额外术语背后的基本原理,但文档指向可能解释更多的参考。
见:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.kl_div.html#scipy.special.kl_div