如何Kullback Leibler两个数据集的分歧

时间:2017-07-13 16:47:58

标签: python statistics distance entropy

我有两个包含40000个样本的数据集。我想在python中计算这两个数据集之间的Kullback-Leibler差异。有没有有效的方法在python中这样做?

1 个答案:

答案 0 :(得分:0)

编辑:
行。我发现它在输入空间中不起作用。所以旧的解释可能是错误的,但我还是会保留它。

这是我的新想法:

在我的高级项目中,我使用了名为 AugMix 的算法。在该算法中,他们计算了两个增强图像之间的 Shannon-Jensen 散度,这是 KL 散度的对称形式。

他们使用模型输出作为数据集的概率分布。其思想是将模型拟合到数据集,然后将模型的输出解释为概率密度函数。

例如,您拟合了一个没有过度拟合的数据集。然后(假设这是一个分类问题)您将 logits(最后一层的输出)提供给每个类的 softmax 函数(有时将 softmax 函数作为一层添加到网络的末尾,小心)。 softmax 函数(或层)的输出可以解释为 P(Y|X_{1}),其中 X_{1} 是输入样本,Y 是真实类。然后你对另一个样本 X_{2}、P(Y|X_{2}) 进行预测,其中 X_{1} 和 X_{2} 来自不同的数据集(比如 dataset_1 和 dataset_2),并且模型没有经过训练任何这些数据集。

那么dataset_1和dataset_2之间的KL散度可以计算为KL(dataset_1 || dataset_2) = P(Y|X_{1}) * log(P(Y|X_{1}) / P(Y|X_) {2}))

确保 X_{1} 和 X_{2} 属于同一类。

我不确定这是否是正确的方法。 或者,您可以使用不同的数据集(dataset_1 和 dataset_2)训练两个不同的模型(model_1 和 model_2),然后使用另一个名为 dataset_3 的数据集的样本计算这两个模型的预测的 KL 散度。换句话说:

KL(dataset_1 || dataset_2) = 数据集_3中的和x model_1(x) * log(model_1(x) / model_2(x))

其中model_1(x) 是model_1 的softmax 输出,它使用dataset_1 训练而没有过拟合,以获得正确的标签。

后者对我来说听起来更合理,但我不确定它们中的任何一个。我自己找不到合适的答案。


我要解释的内容摘自来自 machinelearningmastery.com KL Divergence

的 Jason Brownlee 的博客

据我所知,首先,您必须将数据集转换为概率分布,以便您可以从两个数据集的并集(或相交?)中计算每个样本的概率。

KL(P || Q) = sum x in X P(x) * log(P(x) / Q(x))

然而,大多数时候数据集的交集是没有的。例如,如果要测量 CIFAR10 和 ImageNet 之间的差异,则没有任何样本是共同的。计算此指标的唯一方法是从同一数据集中采样以创建两个不同的数据集。因此,您可以拥有同时存在于两个数据集中的样本,并计算 KL 散度。

最后,也许您想检查 GAN 中使用的 Wasserstein Divergence 以比较源分布和目标分布。