使用numpy数组计算长度不同的KL散度(Python)

8
我正在使用SciPy实现KL散度([http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html])来处理两个不同的numpy数组。第一个数组,假设为"base_freq",长度固定为2000。第二个数组,"test_freq"的长度取决于样本,所以假设它的长度为8000。
当这两个数组长度不同时,如何计算KL散度呢?我的想法是将第二个数组("test_freq")分成若干长度为2000的子数组。但是如何实现呢?当"test_freq"的长度为250时会发生什么呢?请给予指导。

我也尝试过numpy.resize [链接]http://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html,但我仍然不知道从“base_freq”中留下的数据会发生什么,哪些数据会被留下。实际上,我需要它们全部,所以我不能调整大小到“test_freq”。 - Iolkos
3个回答

2
我应该先说明一下我不是信息理论专家。在我使用KL散度的一个应用中,我逐像素比较两个图像以计算损失的位数。如果这些图像大小不同,你提出的方法要求对于较小图像中的每个像素,我需要选择较大图像中相应的像素,而不是任何旧像素。我的理解是,只有当你比较同样采样方式(即相同的时间或空间采样间隔)的两个信号时,KL散度才是有意义的。 如果您想执行您所提出的操作,可以使用numpy.random.choice
import numpy as np

def uneven_kl_divergence(pk,qk):
    if len(pk)>len(qk):
        pk = np.random.choice(pk,len(qk))
    elif len(qk)>len(pk):
        qk = np.random.choice(qk,len(pk))
    return np.sum(pk * np.log(pk/qk))

1
np.random.choice会干扰我的数据,我不想让它这样做。因为如果我的base_freq更小,我不希望它随机选择哪些数据应该被保留。无论如何,我将NaN作为结果,但还是感谢您的答案! - Iolkos
@lolkos:你的意思是在向量中[缺少元素的地方]填充了np.nan吗? - sAguinaga

2

在一些文章中,我看到人们在计算KL散度之前计算数组的直方图。

a = torch.tensor(np.histogram(np.array([0.1, 0.2, 0.3]))[-1])
b = torch.tensor(np.histogram(np.array([0.2, 0.4]))[-1])
loss = nn.KLDivLoss()
dist = loss(a, b)

1
免责声明:我不是统计专家。
KL散度是概率分布之间的度量。这意味着您必须确保熵函数的输入是来自同一样本空间的两个有效概率分布。
在您的情况下,您有有限数量的可能值,因此您有一个离散的随机变量。这也意味着您的每个变量结果可以被测量为一定次数的出现频率。
让我给你举一个简单的例子。假设您的随机变量表示一个非完美的骰子,它有6种可能的结果(6面)。您掷骰子100次。
想象一下,您得到了以下的绘图分布:
1: 10 times
2: 12 times
3: 08 times
4: 30 times
5: 20 times
6: 20 times

由于每个结果(面)都发生了多次,您只需将每个结果的计数除以100。这就是您的频率,也是您的概率。

因此,我们现在有:

P(side=1) = 10/100 = .10
P(side=2) = 12/100 = .12
P(side=3) = 08/100 = .08
P(side=4) = 30/100 = .30
P(side=5) = 20/100 = .20
P(side=6) = 20/100 = .20

最后,这是您的概率分布:

[.10, .12, .08, .30, .20, .20]

请注意它加起来等于1,因为这是概率分布期望的结果。

如果你做第二个实验,得出不同的概率分布,它仍然会有6个概率,即使这次试验的次数不是100。

这意味着从不同的样本空间比较两个概率分布是没有意义的。如果你有一种方法可以将一个样本空间转换成另一个样本空间,那么可能是可行的。但是,请确保您的概率分布是来自相同的样本空间。比较一个六面骰子和一个八面骰子的概率是没有意义的,因为它们代表不同的事物。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接