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

问题描述

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_entrscipy.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