我有两个包含40000个样本的数据集。我想在python中计算这两个数据集之间的Kullback-Leibler散度。是否有一种有效的方法可以在python中实现?
我有两个包含40000个样本的数据集。我想在python中计算这两个数据集之间的Kullback-Leibler散度。是否有一种有效的方法可以在python中实现?
编辑:
好的,我发现它在输入空间中不起作用。所以旧的解释可能是错误的,但我仍然会保留它。
以下是我的新想法:
在我的毕业项目中,我使用了名为AugMix的算法。在这个算法中,他们计算了两个增强图像之间的Shannon-Jensen分歧,这是KL分歧的对称形式。
他们使用模型输出作为数据集的概率分布。其思想是将模型拟合到数据集,然后将模型的输出解释为概率密度函数。
例如,您在不过度拟合的情况下拟合了一个数据集。然后(假设这是一个分类问题),您将每个类别的逻辑回归(最后一层的输出)馈送到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)训练两个不同的模型(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) 是经过适当标签训练而没有过拟合的 dataset_1 训练的模型 model_1 的 softmax 输出。
对我来说,后者听起来更合理,但我也不确定哪个方法更好。我自己找不到一个恰当的答案。
我要解释的内容源自Jason Brownlee的博客machinelearningmastery.com KL散度
据我所知,首先,您必须将数据集转换为概率分布,以便计算来自两个数据集并集(或交集?)中每个样本的概率。
KL(P || Q)= sum x in X P(x)* log(P(x)/Q(x))
然而,大多数时候,数据集的交集都不存在。例如,如果您想衡量CIFAR10和ImageNet之间的差异,那么没有任何共同样本。您可以计算这个度量的唯一方法是从同一个数据集中进行取样以创建两个不同的数据集。因此,您可以拥有同时存在于两个数据集中的样本,并计算KL散度。
最后,也许您想检查在GAN中用于比较源分布和目标分布的Wasserstein散度。