Расчет EMD для трехмерных облаков точек выполняется очень МЕДЛЕННО.
Я хотел рассчитать расстояние между двумя трехмерными облаками точек не менее чем с 2000 точек с использованием расстояния Earth Mover's с помощью следующего кода, однако он слишком медленный и не работает должным образом. Итак, есть ли способ вычислить его для более быстрого приближения?
from scipy.spatial.distance import cdist
from scipy.optimize import linear_sum_assignment
def emd(self):
d = cdist(self.X, self.Y)
assignment = linear_sum_assignment(d)
return d[assignment].sum() / min(len(self.X), len(self.Y))
1 ответ
Решение
Начиная с SciPy 1.4.0 (выпущенного в декабре 2019 г.), при работе этого пулл-реквеста реализацияlinear_sum_assignment
значительно быстрее. В частности, геометрические примеры размером 2000x2000 можно решить менее чем за 10 секунд на устаревшем ноутбуке; см. некоторые тесты в запросе на вытягивание и связанных потоках.