我正在尝试使用 scipy.stats.entropy 来估计两个分布之间的 Kullback–Leibler (KL)差异。更具体地说,我想使用KL作为度量标准来确定两个分布的一致性。
但是,我无法解释KL值。例如:
然后,
基本上没有重叠的完全不同的分布如何具有相同的KL值?
这个给出的KL值甚至更小(即距离),我倾向于将其解释为“更一致”。
在这种情况下,如何解释scipy.stats.entropy(即KL发散距离)有什么见解?
最佳答案
numpy.random.normal(-2.5,0.1,1000)
是来自正态分布的样本。它只是随机排列的1000个数字。 entropy
的documentation表示:
因此,要获得有意义的结果,您需要对数字进行“对齐”,以使相同的索引对应于分布中的相同位置。在您的示例中,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差异很大,因为它们重叠得太少了。)关于python - 解释scipy.stats.entropy值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26743201/