当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.wasserstein_distance用法及代码示例


本文简要介绍 python 语言中 scipy.stats.wasserstein_distance 的用法。

用法:

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

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

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

参数

u_values 一维或二维数组

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

v_values 一维或二维数组

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

u_weights, v_weights 一维数组,可选

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

返回

distance 浮点数

分布之间的计算距离。

注意

给定两个概率质量函数 ,分布之间的第一个 Wasserstein 距离为:

其中 的(概率)分布集,其边际分别为第一个和第二个因子的 。对于给定值 给出 在位置 的概率,对于 也是如此。

在一维情况下,令 分别表示 的CDF,这个距离也等于:

有关这两个定义的等效性的证明,请参阅[3]。

在更一般(更高维)和离散的情况下,它也称为最优传输问题或蒙日问题。令有限点集 分别表示概率质量函数 的支持集。蒙日问题可以表示如下:

表示运输计划, 表示距离矩阵,

函数表示矢量化函数,通过垂直堆叠矩阵的列将矩阵转换为列向量。传送计划 是矩阵 ,其中 是表示从 传送到 的概率质量的量的正值。对 的行求和应给出源分布 : 对所有 均成立,对 的列求和应给出目标分布 : 对所有均成立 。距离矩阵 是矩阵 ,其中

给定 ,通过以 作为约束,以 作为最小化目标(成本之和),Monge 问题可以转化为线性规划问题,其中矩阵 有表格

通过求解上述线性规划问题的对偶形式(解为 ),Wasserstein 距离 可以计算为

上述解决方案的灵感来自于 Vincent Herrmann 的博客 [5]。有关更彻底的解释,请参阅 [4] 。

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

参考

[1]

“Wasserstein metric”、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]

Ramdas, Garcia, Cuturi “关于 Wasserstein 的两个样本检验和相关的非参数检验系列”(2015 年)。 arXiv:1509.02237

[4]

佩雷、加布里埃尔和马可·库图里。 “计算最优运输。”经济与统计研究中心工作论文2017-86(2017)。

[5]

赫尔曼、文森特. “Wasserstein GAN 和 Kantorovich-Rubinstein 对偶性”。https://vincentherrmann.github.io/blog/wasserstein/.

例子

>>> 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

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

>>> wasserstein_distance([[0, 2, 3], [1, 2, 5]], [[3, 2, 3], [4, 2, 5]])
3.0

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

>>> wasserstein_distance([[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

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.wasserstein_distance。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。