scipy.stats.

wasserstein_distance_nd#

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

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

Wasserstein 距离,也称为 Earth mover’s 距离或最优传输距离,是两个概率分布之间的相似性度量 [1]。在离散情况下,Wasserstein 距离可以理解为将一个分布转换为另一个分布的最佳传输计划的成本。成本计算为移动的概率质量的数量与它被移动的距离的乘积。一个简短而直观的介绍可以在 [2] 中找到。

1.13.0 版本新增。

参数:
u_values2d 类数组

来自概率分布的样本或概率分布的支持(所有可能值的集合)。沿轴 0 的每个元素是一个观察或可能的值,轴 1 表示分布的维度;即,每行是一个向量观察或可能的值。

v_values2d 类数组

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

u_weights, v_weights1d 类数组,可选

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

返回:
distancefloat

分布之间的计算距离。

参见

wasserstein_distance

计算两个 1D 离散分布之间的 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\):对于所有 \(i\)\(\sum_j \gamma_{ij} = u(x_i)\) 成立,对 \(\Gamma\) 的列求和应给出目标分布 \(v\):对于所有 \(j\)\(\sum_i \gamma_{ij} = v(y_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]

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

参考文献

[2]

Lili Weng, “What is Wasserstein distance?”, Lil’log, https://lilianweng.github.io/posts/2017-08-20-gan/#what-is-wasserstein-distance.

[3]

Hermann, Vincent. “Wasserstein GAN and the Kantorovich-Rubinstein Duality”. https://vincentherrmann.github.io/blog/wasserstein/.

[4]

Peyré, Gabriel, and Marco Cuturi. “Computational optimal transport.” Center for Research in Economics and Statistics Working Papers 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