Sci*_*ist 6 python statistics entropy scipy
我试图使用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分歧距离)的任何见解?
Bre*_*arn 18
numpy.random.normal(-2.5,0.1,1000)是来自正态分布的样本.它只是随机顺序的1000个数字.该文档的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)
Run Code Online (Sandbox Code Playgroud)
然后:
>>> 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
Run Code Online (Sandbox Code Playgroud)
你可以看到,随着分布进一步分开,他们的KL分歧增加了.(事实上,使用你的第二个例子会给出KL的分歧,inf因为它们重叠得很少.)
| 归档时间: |
|
| 查看次数: |
12429 次 |
| 最近记录: |