scipy.stats.

wasserstein_distance_nd#

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

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

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

Added in version 1.13.0.

参数:
u_values2d array_like

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

v_values2d array_like

来自第二个发行版的样本或支持。

u_weights, v_weights1维数组类,可选

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

返回:
距离浮动

分布之间的计算距离。

参见

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)\) 也是如此。

这也被称为最优传输问题或蒙日问题。设有限点集 \(\{x_i\}\)\(\{y_j\}\) 分别表示概率质量函数 \(u\)\(v\) 的支撑集。蒙日问题可以表述如下,

\(\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\) 作为最小化目标(成本总和),将蒙日问题转化为线性规划问题,其中矩阵 \(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]

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

参考文献

[2]

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

[3]

赫尔曼, 文森特. “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