【问题标题】:How to Kullback Leibler divergence of two datasets如何 Kullback Leibler 散度两个数据集
【发布时间】:2017-12-18 14:17:19
【问题描述】:

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

【问题讨论】:

  • this 你在找什么吗?
  • OP,请记住,KL 散度仅针对分布定义——如果您有样本数据,则必须将一些分布或分布拟合到数据中,然后从中计算 KL 散度。
  • 我怎样才能让一个数据集最适合分布?实际上我的问题是使数据集适合分布。
  • XY Problem 的经典示例:D
  • 参考我在本页的回答:stackoverflow.com/a/63370136/8653046

标签: python statistics distance entropy


【解决方案1】:

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

这是我的新想法:

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

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

例如,您在没有过度拟合的情况下拟合了数据集。然后(假设这是一个分类问题)你将你的 logits(最后一层的输出)提供给每个类的 softmax 函数(有时 softmax 函数作为层添加到网络的末端,小心)。您的 softmax 函数(或层)的输出可以解释为 P(Y|X_{1}),其中 X_{1} 是输入样本,Y 是 groundtruth 类。然后你对另一个样本 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) = sum x in dataset_3 model_1(x) * log(model_1(x) / model_2(x))

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

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


我要解释的东西来自machinelearningmastery.comKL Divergence的Jason Brownlee的博客

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

KL(P || Q) = X 中的总和 P(x) * log(P(x) / Q(x))

但是,大多数情况下,数据集的交集都没有。例如,如果要衡量 CIFAR10 和 ImageNet 之间的差异,则没有任何共同样本。计算此指标的唯一方法是从同一数据集中进行抽样以创建两个不同的数据集。因此,您可以拥有两个数据集中都存在的样本,并计算 KL 散度。

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

【讨论】:

  • 如何使用 scipy 在 python 中生成具有最小 KL 散度的概率分布生成器?
  • Idk 完全一致,但您可以使用我在编辑中提出的新技术进行计算。它需要一个训练有素的分类模型。
猜你喜欢
  • 2011-06-19
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多