Я ищу код 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;
}