首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释scipy.stats.entropy值

解释scipy.stats.entropy值
EN

Stack Overflow用户
提问于 2014-11-04 19:16:53
回答 1查看 16.5K关注 0票数 9

我试图使用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发散距离),有什么见解吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-04 19:42:07

numpy.random.normal(-2.5,0.1,1000)是一个正态分布的样本。只是1000个随机的数字。文档 for entropy说:

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

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

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

代码语言:javascript
复制
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)

然后:

代码语言:javascript
复制
>>> 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散度,因为它们的重叠非常少。)

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26743201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档