scipy.stats.

wasserstein_distance_nd#

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

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

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

在 1.13.0 版本中添加。

参数:
u_values二维类数组

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

v_values二维类数组

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

u_weights, v_weights一维类数组,可选

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

返回:
distance浮点数

分布之间计算的距离。

另请参见

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]

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

参考文献

[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