scipy.stats.

wasserstein_distance_nd#

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

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

Wasserstein 距离又称为 Earth Mover’s 距离或最优传输距离,它是一种用于衡量两个概率分布相似性的度量[1]。在离散情况下,Wasserstein 距离可以看作将一个分布转换为另一个分布的最优传输计划的成本。成本被计算为被移动的概率质量和它被移动的距离乘积。可以在 [2] 找到一个简短直观的介绍。

在 1.13.0 版本中添加。

参数:
u_values2d array_like

某个概率分布的样本或支持(所有可能值的集合)。axis 0 上的每个元素都是一个观测或可能值,而 axis 1 表示分布的维数;即,每一行都是一个观测或可能值的向量。

v_values2d array_like

第二个分布的样本或支持。

u_weights, v_weights1d array_like, 可选

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

返回:
距离float

分布之间计算的距离。

另请参阅

wasserstein_distance

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

备注

给定两个概率质量函数 \(u\)\(v\),使用欧几里得范数的分布之间的第一个 Wasserstein 距离为

\[l_1 (u, v) = \inf_{\pi \in \Gamma (u, v)} \int \| x-y \|_2 \mathrm{d} \pi (x, y)\]

其中 \(\Gamma (u, v)\)\(\mathbb{R}^n \times \mathbb{R}^n\) 上(概率)分布的集合,其边缘分别在第一个和第二个因子上是 \(u\)\(v\)。对于给定的值 \(x\)\(u(x)\) 提供了 \(u\) 在位置 \(x\) 的概率,\(v(x)\) 也是如此。

这也称为最优运输问题或 Monge 问题。令有限点集 \(\{x_i\}\)\(\{y_j\}\) 分别表示概率质量函数 \(u\)\(v\) 的支持集。Monge 问题可以表示如下,

\(\Gamma\) 表示传输计划,\(D\) 表示距离矩阵,

\[\begin{split}x = \text{vec}(\Gamma) \\ c = \text{vec}(D) \\ b = \begin{bmatrix} u\\ v\\ \end{bmatrix}\end{split}\]

\(\text{vec}()\) 函数表示向量化函数,该函数通过垂直堆叠矩阵的列将矩阵转换为列向量。传输计划 \(\Gamma\) 是一个矩阵 \([\gamma_{ij}]\),其中 \(\gamma_{ij}\) 是表示从 \(u(x_i)\) 传输到 \(v(y_i)\) 的概率质量大小的正值。对 \(\Gamma\) 的行求和应当得到源分布 \(u\)\(\sum_j \gamma_{ij} = u(x_i)\) 对所有 \(i\) 成立,对 \(\Gamma\) 的列求和应当得到目标分布 \(v\)\(\sum_i \gamma_{ij} = v(y_j)\) 对所有 \(j\) 成立。距离矩阵 \(D\) 是一个矩阵 \([d_{ij}]\),其中 \(d_{ij} = d(x_i, y_j)\)

已知 \(\Gamma\)\(D\)\(b\),通过将 \(A x = b\) 作为约束和 \(z = c^T x\) 作为最小化目标(成本总和),可以将 Monge 问题转换为线性规划问题,其中矩阵 \(A\) 的形式为

\[ \begin{align}\begin{aligned}\begin{array} {rrrr|rrrr|r|rrrr} 1 & 1 & \dots & 1 & 0 & 0 & \dots & 0 & \dots & 0 & 0 & \dots & 0 \cr 0 & 0 & \dots & 0 & 1 & 1 & \dots & 1 & \dots & 0 & 0 &\dots & 0 \cr \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \cr 0 & 0 & \dots & 0 & 0 & 0 & \dots & 0 & \dots & 1 & 1 & \dots & 1 \cr \hline\\ 1 & 0 & \dots & 0 & 1 & 0 & \dots & \dots & \dots & 1 & 0 & \dots & 0 \cr 0 & 1 & \dots & 0 & 0 & 1 & \dots & \dots & \dots & 0 & 1 & \dots & 0 \cr \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \cr 0 & 0 & \dots & 1 & 0 & 0 & \dots & 1 & \dots & 0 & 0 & \dots & 1 \end{array}\end{aligned}\end{align} \]

按照上述线性规划问题对偶形式(解为 \(y^*\))来解决,Wasserstein 距离 \(l_1 (u, v)\) 可计算为 \(b^T y^*\)

上述解的灵感来自 Vincent Herrmann 的博客 [3] 。更深入的解释,请参阅 [4]

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

参考资料

[1]

“Wasserstein 度量” ,https://en.wikipedia.org/wiki/Wasserstein_metric

[2]

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

[3]

Hermann,Vincent。“Wasserstein GAN 和 Kantorovich-Rubinstein 对偶” 。https://vincentherrmann.github.io/blog/wasserstein/

[4]

Peyré,Gabriel 和 Marco Cuturi。“计算最优传输”。经济与统计研究中心 2017-86 工作论文 (2017)。

示例

计算两个三维样本之间的 Wasserstein 距离,每个样本有两个观测值。

>>> from scipy.stats import wasserstein_distance_nd
>>> wasserstein_distance_nd([[0, 2, 3], [1, 2, 5]], [[3, 2, 3], [4, 2, 5]])
3.0

计算两个二维分布之间的 Wasserstein 距离,分别具有三个和两个加权观测值。

>>> wasserstein_distance_nd([[0, 2.75], [2, 209.3], [0, 0]],
...                      [[0.2, 0.322], [4.5, 25.1808]],
...                      [0.4, 5.2, 0.114], [0.8, 1.5])
174.15840245217169