Расчет 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 секунд на устаревшем ноутбуке; см. некоторые тесты в запросе на вытягивание и связанных потоках.

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