scipy.stats.

wasserstein_distance_nd#

scipy.stats.wasserstein_distance_nd(u_values, v_values, u_weights=None, v_weights=None)[источник]#

Вычислить расстояние Вассерштейна-1 между двумя N-мерными дискретными распределениями.

Расстояние Вассерштейна, также называемое расстоянием землекопа или расстоянием оптимального транспорта, является метрикой сходства между двумя распределениями вероятностей [1]. В дискретном случае расстояние Вассерштейна можно понимать как стоимость оптимального плана транспортировки для преобразования одного распределения в другое. Стоимость рассчитывается как произведение перемещаемой вероятностной массы и расстояния, на которое она перемещается. Краткое и интуитивное введение можно найти на [2].

Добавлено в версии 1.13.0.

Параметры:
u_values2d array_like

Выборка из вероятностного распределения или носитель (множество всех возможных значений) вероятностного распределения. Каждый элемент вдоль оси 0 представляет наблюдение или возможное значение, а ось 1 представляет размерность распределения; т.е. каждая строка является векторным наблюдением или возможным значением.

v_values2d array_like

Выборка из или носитель второго распределения.

u_weights, v_weights1d array_like, опционально

Веса или количества, соответствующие выборке, или вероятностные массы, соответствующие значениям поддержки. Сумма элементов должна быть положительной и конечной. Если не указано, каждому значению присваивается одинаковый вес.

Возвращает:
расстояниеfloat

Вычисленное расстояние между распределениями.

Смотрите также

wasserstein_distance

Вычисляет расстояние Вассерштейна-1 между двумя одномерными дискретными распределениями.

Примечания

Для двух функций вероятности масс, \(u\) и \(v\), первое расстояние Вассерштейна между распределениями с использованием евклидовой нормы:

\[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}\]

The \(\text{vec}()\) Функция обозначает функцию векторизации, которая преобразует матрицу в вектор-столбец путем вертикального объединения столбцов матрицы. План транспортировки \(\Gamma\) является матрицей \([\gamma_{ij}]\) в котором \(\gamma_{ij}\) является положительным значением, представляющим количество вероятностной массы, перенесенной из \(u(x_i)\) to \(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\) в качестве цели минимизации (сумма затрат), где матрица \(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^*\)), расстояние Вассерштейна \(l_1 (u, v)\) может быть вычислен как \(b^T y^*\).

Приведенное выше решение вдохновлено блогом Винсента Херрманна [3] . Для более подробного объяснения см. [4] .

Входные распределения могут быть эмпирическими, следовательно, полученными из выборок, чьи значения фактически являются входными данными функции, или они могут рассматриваться как обобщённые функции, в этом случае они являются взвешенными суммами дельта-функций Дирака, расположенных в указанных значениях.

Ссылки

[1]

«Метрика Вассерштейна», https://en.wikipedia.org/wiki/Wasserstein_metric

[2]

Lili Weng, "Что такое расстояние Вассерштейна?", 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).

Примеры

Вычислить расстояние Вассерштейна между двумя трехмерными выборками, каждая с двумя наблюдениями.

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