Java код / ​​библиотека для расчета расстояния землеройного - PullRequest
3 голосов
/ 16 января 2012

Я ищу код Java (или библиотеку), который вычисляет расстояние движущегося земли (EMD) между двумя гистограммами.Это может быть прямо или косвенно (например, с использованием венгерского алгоритма).Я нашел несколько реализаций этого в c / c ++ (например, «Расстояния быстрого и надежного движителя Земли» , но мне интересно, есть ли легкодоступная версия Java.

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

Обновление

Используя различные ресурсы, я полагаю, что приведенный ниже код должен справиться с задачей. defineMinCostAssignment - это расчет оптимального назначения, определенного венгерским алгоритмом. Для этого я буду использовать код из http://konstantinosnedas.com/dev/soft/munkres.htm Моя главная проблема - вычисленный поток : я не уверен, что это правильно. Есть ли кто-то, кто может проверить, правильно ли это или нет?

    /**
 * Determines the Earth Mover's Distance between two histogram assuming an equal distance between two buckets of a histogram. The distance between
 * two buckets is equal to the differences in the indexes of the buckets.
 * 
 * @param threshold
 *          The maximum distance to use between two buckets.
 */
public static double determineEarthMoversDistance(double[] histogram1, double[] histogram2, int threshold) {
    if (histogram1.length != histogram2.length)
        throw new InvalidParameterException("Each histogram must have the same number of elements");

    double[][] groundDistances = new double[histogram1.length][histogram2.length];
    for (int i = 0; i < histogram1.length; ++i) {
        for (int j = 0; j < histogram2.length; ++j) {
            int abs_diff = Math.abs(i - j);
            groundDistances[i][j] = Math.min(abs_diff, threshold);
        }
    }

    int[][] assignment = determineMinCostAssignment(groundDistances);
    double costSum = 0, flowSum = 0;
    for (int i = 0; i < assignment.length; i++) {
        double cost = groundDistances[assignment[i][0]][assignment[i][1]];
        double flow = histogram2[assignment[i][1]];
        costSum += cost * flow;
        flowSum += flow;
    }
    return costSum / flowSum;
}

Ответы [ 5 ]

6 голосов
/ 30 марта 2012

Вот чистый Java-порт алгоритма FastEMD, который я только что выпустил: https://github.com/telmomenezes/JFastEMD

1 голос
/ 30 августа 2016

Это то, что я использую для Java / Scala:

import org.apache.commons.math3.ml.distance.EarthMoversDistance
new EarthMoversDistance().compute(observed, expected)
1 голос
/ 15 марта 2012

Веб-сайт "Расстояния быстрого и надежного землеройного двигателя" содержит оболочку Java для кода C / C ++ с откомпилированным двоичным кодом для Linux и Windows.

0 голосов
/ 10 декабря 2013

https://github.com/wihoho/VideoRecognition

  • Адаптируйте авторскую реализацию C с помощью модуля python через файловый интерфейс
  • Измененные коды C находятся в папке EarthMoverDistance SourceCode

Я почти уверен, что вы можете сделать то же самое с Java.Просто добавьте файловый интерфейс, чтобы соединить реализацию EMD на C с вашими кодами Java.

0 голосов
/ 16 января 2012

Простой поиск в Google по венгерскому алгоритму java показал несколько ссылок, включая эту ссылку и эту .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...