python - scipy.stats.wasserstein_distance 实现
问题描述
我试图了解 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 距离定义中不应该是这种情况吗?
谢谢您的帮助!
解决方案
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,而是需要一个有序特征的数据点或某种测量特征之间距离的方法,在这种情况下,您会以不同的方式计算它。
推荐阅读
- javascript - JavaScript:数组的重复数据删除和计数属性
- azure - 重命名现有的 Azue 数据工厂
- reactjs - 反应原生 TextField 更新
- docker - 如何解决 Docker Pull 上“无法在此平台上使用 Image OS 'Linux'”的问题?
- javascript - 访问复杂的 js 对象
- python - 具有平均差(基尼)的性能 numpy 与 for 循环
- python - 如何在 QuantLib-Python 中为 Cliquet 期权定价?
- python - 首次完成 Discord Bot 后如何播放下一首歌曲
- optimization - CNN中超参数的优化
- r - Tidyverse 和 dplyr- 错误包或命名空间