Python 解释scipy.stats.entropy值

Python 解释scipy.stats.entropy值,python,statistics,scipy,entropy,Python,Statistics,Scipy,Entropy,我试图使用scipy.stats.entropy来估计两个分布之间的Kullback–Leibler(KL)差异。更具体地说,我想使用KL作为衡量标准来决定两个分布的一致性 但是,我无法解释KL值。例如: t1=numpy.random.normal(-2.5,0.11000) t2=numpy.随机.正常(-2.5,0.11000) scipy.stats.entropy(t1,t2) 0.0015539217193737955 那么 t1=numpy.random.normal(-2.5,0

我试图使用scipy.stats.entropy来估计两个分布之间的Kullback–Leibler(KL)差异。更具体地说,我想使用KL作为衡量标准来决定两个分布的一致性

但是,我无法解释KL值。例如:

t1=numpy.random.normal(-2.5,0.11000)

t2=numpy.随机.正常(-2.5,0.11000)

scipy.stats.entropy(t1,t2)

0.0015539217193737955

那么

t1=numpy.random.normal(-2.5,0.11000)

t2=numpy.随机.正常(2.5,0.11000)

scipy.stats.entropy(t1,t2)

=0.0015908295787942181

基本上没有重叠的完全不同的分布如何具有相同的KL值

t1=numpy.random.normal(-2.5,0.11000)

t2=numpy.随机.正常(25,0.11000)

scipy.stats.entropy(t1,t2)

=0.000811113648055905

这一个给出了更小的KL值(即距离),我倾向于将其解释为“更一致”

关于如何在这种情况下解释scipy.stats.entropy(即KL发散距离)的任何见解?

numpy.random.normal(-2.5,0.11000)
是正态分布的样本。它只是随机排列的1000个数字。熵的表达式表示:

pk[i]
是事件
i
的(可能未规范化)概率

因此,为了得到一个有意义的结果,你需要将数字“对齐”,以便相同的索引对应于分布中的相同位置。在您的示例中,
t1[0]
t2[0]
没有关系。您的样本没有提供任何关于每个值的可能性的直接信息,这是您需要的KL散度;它只是提供一些从分布中获取的实际值

获得对齐值的最直接方法是在某个固定值集上计算分布的概率密度函数。要做到这一点,您需要使用
scipy.stats.norm
(它生成一个可以以各种方式操作的分布对象),而不是
np.random.normal
(它只返回采样值)。下面是一个例子:

t1 = stats.norm(-2.5, 0.1)
t2 = stats.norm(-2.5, 0.1)
t3 = stats.norm(-2.4, 0.1)
t4 = stats.norm(-2.3, 0.1)

# domain to evaluate PDF on
x = np.linspace(-5, 5, 100)
然后:

您可以看到,随着分布的进一步分离,它们的KL散度增加。(事实上,使用第二个示例将给出
inf
的KL散度,因为它们重叠太少。)

在x轴上“对齐”元素是关键!非常感谢。
>>> stats.entropy(t1.pdf(x), t2.pdf(x))
-0.0
>>> stats.entropy(t1.pdf(x), t3.pdf(x))
0.49999995020647586
>>> stats.entropy(t1.pdf(x), t4.pdf(x))
1.999999900414918