numpy.random.normal(-2.5,0.1,1000)
is a sample从正态分布。它只是按随机顺序排列的 1000 个数字。这文档 http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html for entropy
says:
pk[i]
是事件的(可能是非标准化的)概率i
.
因此,为了获得有意义的结果,您需要“对齐”数字,以便相同的索引对应于分布中的相同位置。在你的例子中t1[0]
与以下没有关系t2[0]
。您的示例没有提供任何有关如何进行的直接信息probable每个值是 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)
Then:
>>> 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 散度会增加。 (事实上,使用你的第二个例子将会给出 KL 散度inf
因为它们重叠得很少。)