Функция, с которой вы ссылаетесь, требует, чтобы две гистограммы были выровнены и, таким образом, имели такую же длину NBIN x N (не NX NBIN), то есть, если N> 1, то число строк на входах должно быть равно числу ячеек в гистограммах. Если вы просто собираетесь сравнить две гистограммы (то есть, если N = 1), это не имеет особого значения, вы можете передать их в виде строк или столбцов, если вы согласны, и порядок совпадений совпадает.
Общий вызов функции выглядит следующим образом:
dists = kldiv(bins,P,Q)
Реализация позволяет сравнение несколько гистограмм друг с другом (то есть, N> 1), в этом случае паре столбцов (с соответствующий индекс столбца) в каждом массиве сравниваются, и результат представляет собой вектор строки с расстояниями для каждой пары совпадений.
Массива bins
должен быть таким же размером, как и P
Q
и используется для выполнения очень минимальной проверки, что входы имеют один и тот же размер, но не используется в вычислениях. Процедура ожидает, что bins
будет содержать числовые метки ваших корзин, чтобы он мог проверять повторяющиеся метки битов и предупреждать вас, если повторяются, но в противном случае не использует эту информацию.
Вы можете избавиться от bins
и вычислить расстояние с
KL = sum(P .* (log2(P)-log2(Q)));
без использования Matlab Центральной версии. Однако версия, на которую вы ссылаетесь, выполняет вышеупомянутые минимальные проверки и, кроме того, позволяет вычислять два альтернативных расстояния (см. Документацию).
Версия, связанная с eigenchris, проверяет, что никакие буферы гистограммы не пусты (что привело бы к тому, что вычисление взорвалось численно), а если есть, удаляет их вклад в сумму (не уверен, что это вполне уместно - обратитесь к эксперту по предмет). Вероятно, он должен также знать точную форму формулы, в частности, отметить использование log2
выше по сравнению с натуральным логарифмом в версии, связанной с собственным сыном.
Вы спрашивали об этом автора? – Divakar
Я не думаю, что я получу ответ: вопросы остались без ответа с прошлого года. Я надеялся, что кто-то здесь предоставил некоторое представление или ярлык для кодирования функции. – user191919
Я бы не рекомендовал эту конкретную реализацию, так как она не обрабатывает нулевые вероятности должным образом. Я бы использовал [эту реализацию] (http://www.mathworks.com/matlabcentral/fileexchange/20688-kullback-leibler-divergence). Все, что вам нужно сделать, это указать два вектора вероятности равной длины; например, «P = [0,25 0,25 0,25 0,25]» и «Q = [0,1 0,2 0,3 0,4]». – eigenchris