Ссылка на функцию расстояния вассерштейна в Python

Мы пытаемся вычислить расстояние между двумя дискретными одномерными распределениями. Наша цель - вычислить функцию расстояния, которая следует интуиции оптимального переноса: наши распределения представляют собой массы в "точках", то есть векторах, с важностью для порядка элементов в каждом векторе. Имея матрицу, которая описывает расстояния между любыми двумя точками, мы хотели бы найти транспорт с минимальными затратами в u, чтобы сделать его v.

Самый простой пример: пусть u,v будут распределениями: u=(0.5,0.2,0.3), v=(0.5,0.3,0.2)

Предположим, что матрица расстояний равна [[1,1,1],[1,1,1],[1,1,1]], что означает, что перемещение единицы массы между любыми двумя точками стоит 1. Очевидно, что оптимальный способ сделать u похожим на v - это перенести 0,1 из третьей точки во вторую. Стоимость в этом случае будет 1*0,1, что составляет 0,1.

Следуя этой интуиции, мы обратились к дистанции Вассерштейна. Мы пробовали как scipy.stats.wasserstein_1d, так и пакет POT, в частности ot.emd2. Однако на самом деле никто не вычисляет то, что мы хотим. Что касается приведенного выше примера, первый не учитывает порядок элементов в векторе, поэтому результат равен 0. Второй алгоритм возвращает 1.

Мы были бы очень признательны за любое объяснение, которое мы могли пропустить относительно работы этих двух функций Python, или любые другие ссылки или предложения.

  • Мы осознаем тот факт, что при несимметричной метрике расстояния это понятие "расстояние" не будет симметричным.

2 ответа

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

from scipy import stats

u = [0.5,0.2,0.3]
v = [0.5,0.3,0.2]

# create and array with cardinality 3 (your metric space is 3-dimensional and
# where distance between each pair of adjacent elements is 1
dists = [i for i in range(len(w1))]

stats.wasserstein_distance(dists, dists, u, v)

Этот код обрабатывает то, что вы называете "распределениями", как веса над распределениями со значениями. [0,1,2]. Проще говоря, ваши примеры дистрибутивов выглядят так в моей трактовке.

  u         v

|         |
|         |
|   |     | |
| | |     | | |
| | |     | | |
-----     -----
0 1 2     0 1 2

Вы неправильно понимаете расстояние Вассерштейна. Оно определяется как минимальное среднее расстояние.

Здесь у вас есть два распределения u и v по трем значениям, скажем, 1, 2, 3. (i,j)-элемент матрицы стоимости — это расстояние между i и j. Обратите внимание, что в вашем случае это не расстояние, поскольку d(i,i) не равно нулю. Но это не проблема.

Итак, каково это минимальное среднее расстояние? Нам нужно ввести объединение u и v, то есть двумерное распределение J, первый и второй поля которого равны u и v соответственно. То есть у вас есть вероятность J(i,j) для каждого i,j в {1,2,3}. Тогда у вас есть средняя стоимость по J:. Расстояние Вассерштейна — это минимальное значение этой средней стоимости по всем возможным соединениям J.

Итак, здесь расстояние Вассерштейна, очевидно, равно 1, потому что d(i,j)=1 для каждого i и j.

Другие вопросы по тегам