首页 > 解决方案 > scipy.stats.wasserstein_distance 实现

问题描述

我试图了解 scipy.stats.wasserstein_distance中使用的实现

对于p=1并且没有权重,使用u_valuesv_values两个一维分布,代码归结为

u_sorter = np.argsort(u_values)(1)
v_sorter = np.argsort(v_values)

all_values = np.concatenate((u_values, v_values))(2)
all_values.sort(kind='mergesort')

deltas = np.diff(all_values)(3)

u_cdf_indices = u_values[u_sorter].searchsorted(all_values[:-1], 'right')(4)
v_cdf_indices = v_values[v_sorter].searchsorted(all_values[:-1], 'right')

v_cdf = v_cdf_indices / v_values.size(5)
u_cdf = u_cdf_indices / u_values.size

return np.sum(np.multiply(np.abs(u_cdf - v_cdf), deltas))(6)

这个实现背后的原因是什么,是否有一些文献?我确实看过引用的论文,我相信它解释了为什么在一维的一般定义中计算 Wasserstein 距离等同于评估积分,


\int_{-\infty}^{+\infty} |U-V|,

与 U 和 V 分布的累积分布函数u_valuesv_values
但我不明白如何在 scipy 实现中评估这个积分。

特别是,
a) 为什么它们乘以 (6) 中的增量来求解积分?
b)在 (5) 中,累积分布函数 U 和 V 如何v_cdfu_cdf

此外,通过这种实现,分布的元素顺序u_values不会v_values被保留。在一般的 Wasserstein 距离定义中不应该是这种情况吗?

谢谢您的帮助!

标签: pythonscipyearth-movers-distance

解决方案


PDF、直方图或 KDE 的顺序被保留,并且在 Wasserstein 距离中很重要。如果您只传递 u_values 和 v_values,那么它必须计算 PDF、KDE ​​或直方图之类的东西。通常,您会提供 PDF 以及 U 和 V 的范围作为函数 wasserstein_distance 的 4 个参数。因此,在提供样本的情况下,您并没有传递一个真实的数据点,而只是一组重复的“实验”。代码块列表中的数字 1 和 4 基本上按离散值的数量对数据进行分类。CDF 是直到该点或 P(x<X) 的离散值的数量。CDF 基本上是 PDF、直方图或 KDE 的累积和。数字 5 将 CDF 标准化到 0.0 和 1.0 之间,或者说另一种方式,它将 bin 除以 bin 的数量。

因此,离散值的顺序被保留,而不是数据点中的原始顺序。

B)如果您使用上面的代码绘制数据点(例如图像文件)的 CDF,则可能更有意义。

然而,运输问题可能不需要 PDF,而是需要一个有序特征的数据点或某种测量特征之间距离的方法,在这种情况下,您会以不同的方式计算它。


推荐阅读