【问题标题】:Interpreting scipy.stats.entropy values解释 scipy.stats.entropy 值
【发布时间】:2014-12-31 19:38:53
【问题描述】:

我正在尝试使用 scipy.stats.entropy 来估计两个分布之间的 Kullback–Leibler (KL) 散度。更具体地说,我想使用 KL 作为衡量两个分布是否一致的指标。

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

t1=numpy.random.normal(-2.5,0.1,1000)

t2=numpy.random.normal(-2.5,0.1,1000)

scipy.stats.entropy(t1,t2)

0.0015539217193737955

那么,

t1=numpy.random.normal(-2.5,0.1,1000)

t2=numpy.random.normal(2.5,0.1,1000)

scipy.stats.entropy(t1,t2)

= 0.0015908295787942181

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

t1=numpy.random.normal(-2.5,0.1,1000)

t2=numpy.random.normal(25.,0.1,1000)

scipy.stats.entropy(t1,t2)

= 0.00081111364805590595

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

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

【问题讨论】:

    标签: python statistics scipy entropy


    【解决方案1】:

    numpy.random.normal(-2.5,0.1,1000) 是一个来自正态分布的样本。它只是随机顺序的1000个数字。 documentation for entropy 说:

    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)
    

    然后:

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

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

    【讨论】:

    • 在 x 轴上有“对齐”的元素是关键!非常感谢。
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2020-07-15
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多