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