问题描述
python中的Scipy提供了以下功能,这些功能似乎可以计算出相同的信息论指标Kullback-Leibler散度,也称为相对熵:
-
scipy.stats.entropy
,如果qk=None
可以切换到计算KL散度 -
scipy.special.rel_entr
-
scipy.special.kl_div
为什么三个相同?有人可以解释他们之间的区别吗?
解决方法
计算离散概率矢量之间的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,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