Python 如何计算两个数据集的Kullback-Leibler散度

Python 如何计算两个数据集的Kullback-Leibler散度,python,statistics,distance,entropy,Python,Statistics,Distance,Entropy,我有两个包含40000个样本的数据集。我想用python计算这两个数据集之间的Kullback-Leibler差异。在python中有什么有效的方法可以做到这一点吗 编辑: 好啊我发现它在输入空间不起作用。所以旧的解释可能是错误的,但我还是会保留它 以下是我的新想法: 在我的高年级项目中,我使用了一种叫做。在该算法中,他们计算了两幅增强图像之间的香农-詹森散度,这是KL散度的对称形式 他们使用模型输出作为数据集的概率分布。其思想是将模型拟合到数据集,然后将模型的输出解释为概率密度函数 例如,拟

我有两个包含40000个样本的数据集。我想用python计算这两个数据集之间的Kullback-Leibler差异。在python中有什么有效的方法可以做到这一点吗

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

以下是我的新想法:

在我的高年级项目中,我使用了一种叫做。在该算法中,他们计算了两幅增强图像之间的香农-詹森散度,这是KL散度的对称形式

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

例如,拟合数据集时没有过度拟合。然后(假设这是一个分类问题),为每个类向softmax函数提供Logit(最后一层的输出)(有时softmax函数作为一个层添加到网络末端,请小心)。softmax函数(或层)的输出可以解释为P(Y | X{1}),其中X{1}是输入样本,Y是groundtruth类。然后对另一个样本X{2},P(Y{X{2})进行预测,其中X{1}和X{2}来自不同的数据集(比如数据集_1和数据集_2),并且该模型不使用任何这些数据集进行训练

然后,数据集_1和数据集_2之间的KL散度可以通过KL(数据集_1 | |数据集_2)=p(Y | X{1})*log(p(Y | X{1})/p(Y | X{2})来计算

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

我不确定这是不是正确的方法或者,您可以使用不同的数据集(数据集_1和数据集_2)训练两个不同的模型(模型_1和模型_2),然后使用另一个称为数据集_3的数据集的样本计算这两个模型预测的KL差异。换言之:

KL(数据集_1 | |数据集_2)=数据集_3模型_1(x)*日志(模型_1(x)/模型_2(x))中的x和

其中,模型_1(x)是模型_1的softmax输出,该模型使用数据集_1进行训练,无需过度拟合,以获得正确的标签

对我来说,后者听起来更合理,但我不确定两者是否都合理。我自己找不到合适的答案


我将要解释的内容是从杰森·布朗利的博客中引用的

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

KL(p | | Q)=x中x的和p(x)*log(p(x)/Q(x))

然而,大多数情况下,数据集的交集都是无交集的。例如,如果要测量CIFAR10和ImageNet之间的差异,则没有任何相同的示例。计算此度量的唯一方法是从同一数据集中采样,以创建两个不同的数据集。因此,您可以在两个数据集中都有样本,并计算KL散度


最后,为了比较源分布和目标分布,您可能需要检查GANs中使用的参数。

是您要查找的吗?请记住,KL发散仅定义为分布-如果您有样本数据,您必须将一些分布拟合到数据中,然后从中计算KL散度。如何才能将一个数据集最佳拟合到分布中?实际上,我的问题是将数据集拟合到分布。经典示例:请参阅我在本页上的答案:如何使用scipy在python中获得具有最小KL散度的概率分布生成器?Idk完全正确,但您可以使用我在编辑中提出的新技术进行计算。它需要一个训练有素的分类模型。