我试图了解 scipy.stats.wasserstein_distance中使用的实现
对于p=1
并且没有权重,使用u_values
,v_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_values
和v_values
,
但我不明白如何在 scipy 实现中评估这个积分。
特别是,
a) 为什么它们乘以 (6) 中的增量来求解积分?
b)在 (5) 中,累积分布函数 U 和 V 如何v_cdf
?u_cdf
此外,通过这种实现,分布的元素顺序u_values
不会v_values
被保留。在一般的 Wasserstein 距离定义中不应该是这种情况吗?
谢谢您的帮助!