scipy.stats.

wasserstein_distance#

scipy.stats.wasserstein_distance(u_values, v_values, u_weights=None, v_weights=None)[source]#

计算两个一维离散分布之间的 Wasserstein-1 距离。

Wasserstein 距离,又称地球搬运工距离或最优传输距离,是两个概率分布之间的相似度度量 [1]。在离散的情况下,Wasserstein 距离可以理解成将一个分布转换为另一个分布的最优传输计划的成本。成本计算为移动的概率质量和移动距离的乘积。可以在 [2] 中找到一个简短直观的介绍。

在 1.0.0 版中添加。

参数:
u_values一维数组类

来自概率分布的样本或概率分布的支持集(所有可能值的集合)。每个元素都是观察值或可能值。

v_values一维数组类

来自或属于另一个分布的支持集的样本。

u_weights, v_weights一维数组类,可选

与样本相应的权重或计数或与支持值相应的概率质量。元素的总和必须为正且为有限值。如果未指定,则为每个值指定相同权重。

返回:
距离浮点数

在分布之间计算出的距离。

另请参阅

wasserstein_distance_nd

计算两个 N-D 离散分布之间的 Wasserstein-1 距离。

注释

给定两个 1D 概率质量函数 \(u\)\(v\),分布之间的第一个 Wasserstein 距离为

\[l_1 (u, v) = \inf_{\pi \in \Gamma (u, v)} \int_{\mathbb{R} \times \mathbb{R}} |x-y| \mathrm{d} \pi (x, y)\]

其中 \(\Gamma (u, v)\)\(\mathbb{R} \times \mathbb{R}\) 上(概率)分布的集合,其边际分别为 \(u\)\(v\),用于第一个和第二个因素。对于给定值 \(x\)\(u(x)\) 提供 \(u\) 在位置 \(x\) 的可能性,\(v(x)\) 也是如此。

如果 \(U\)\(V\) 分别是 \(u\)\(v\) 的相应 CDF,则此距离还等于

\[l_1(u, v) = \int_{-\infty}^{+\infty} |U-V|\]

参阅 [3],了解两个定义的等价性证明。

输入分布可能是经验的,因此来自样本,其值实际上是函数的输入,或者可以视为广义函数,在这种情况下,它们是位于指定值处的狄拉克 delta 函数的加权和。

参考

[2]

莉莉·翁,“什么是 Wasserstein 距离?”,Lil'log,https://lilianweng.github.io/posts/2017-08-20-gan/#what-is-wasserstein-distance

[3]

Ramdas、Garcia、Cuturi “关于 Wasserstein 二样本测试和相关的非参数测试族”(2015)。arXiv:1509.02237

实例

>>> from scipy.stats import wasserstein_distance
>>> wasserstein_distance([0, 1, 3], [5, 6, 8])
5.0
>>> wasserstein_distance([0, 1], [0, 1], [3, 1], [2, 2])
0.25
>>> wasserstein_distance([3.4, 3.9, 7.5, 7.8], [4.5, 1.4],
...                      [1.4, 0.9, 3.1, 7.2], [3.2, 3.5])
4.0781331438047861