реализация scipy.stats.wasserstein_distance
Я пытаюсь понять реализацию, которая используется в scipy.stats.wasserstein_distance
за p=1
и без весов, с u_values
, v_values
два одномерных распределения, код сводится к
u_sorter = np.argsort(u_values)
(1)v_sorter = np.argsort(v_values)
all_values = np.concatenate((u_values, v_values))
(2)all_values.sort(kind='mergesort')
deltas = np.diff(all_values)
(3)
u_cdf_indices = u_values[u_sorter].searchsorted(all_values[:-1], 'right')
(4)v_cdf_indices = v_values[v_sorter].searchsorted(all_values[:-1], 'right')
v_cdf = v_cdf_indices / v_values.size
(5)u_cdf = u_cdf_indices / u_values.size
return np.sum(np.multiply(np.abs(u_cdf - v_cdf), deltas))
(6)
Какова причина этой реализации, есть ли литература? Я просмотрел процитированную статью, которая, как мне кажется, объясняет, почему вычисление расстояния Вассерштейна в его общем определении в 1D эквивалентно вычислению интеграла,
\int_{-\infty}^{+\infty} |U-V|
,
с U и V кумулятивные функции распределения для распределений u_values
а также v_values
,
но я не понимаю, как этот интеграл оценивается в scipy реализации.
В частности,
а) почему они умножаются на дельты в (6) для решения интеграла?
б) какv_cdf
а также u_cdf
в (5) кумулятивные функции распределения U и V?
Кроме того, с этой реализацией порядок элементов распределения u_values
а также v_values
не сохранилось. Разве это не должно быть так в общем определении расстояния Вассерштейна?
Спасибо за помощь!
1 ответ
Порядок PDF, гистограммы или KDE сохраняется и важен для расстояния Вассерштейна. Если вы передаете только u_values и v_values, тогда он должен вычислить что-то вроде PDF, KDE или гистограммы. Обычно вы предоставляете PDF-файл и диапазон U и V в качестве 4 аргументов функции wasserstein_distance. Таким образом, в случае, когда предоставляются образцы, вы не передаете реальную точку данных, а просто набор повторяющихся «экспериментов». Номера 1 и 4 в вашем списке блоков кода в основном объединяют ваши данные по количеству дискретных значений. CDF - это количество дискретных значений до этой точки или P(x<X). CDF - это, по сути, совокупная сумма PDF-файла, гистограммы или KDE. Номер 5 выполняет нормализацию CDF до значений от 0,0 до 1,0 или, говоря другим способом, делит ячейку на количество ячеек.
Таким образом, сохраняется порядок дискретных значений, а не исходный порядок в точке данных.
Б) Это может иметь больше смысла, если вы построите CDF точки данных, такой как файл изображения, используя приведенный выше код.
Однако для задачи транспортировки может потребоваться не PDF-файл, а скорее набор данных с упорядоченными объектами или какой-либо способ измерения расстояния между объектами, и в этом случае вы бы вычислили его по-другому.