Использование Jensen Shannon Divergence для создания инструмента для определения расстояния между распределениями вероятностей с помощью Python.

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

Моя постановка задачи может быть решена путем вычисления статистического расстояния между двумя распределениями вероятностей. Для этого я обнаружил, что можно использовать расстояние Дженсена Шеннона.

Дивергенция Дженсена-Шеннона (JSD) - это показатель, полученный из другой меры статистического расстояния, называемой Дивергенцией Кульбака-Лейбера (KLD). Причина, по которой я не мог использовать KLD, заключается в том, что это асимметричная функция. Поскольку, возможно, потребовалось много вычислений расстояния, это представляло опасность.

JSD, с другой стороны, является симметричной функцией, и квадратный корень из JSD дает расстояние Дженсена-Шеннона. Мера, которую мы можем использовать, чтобы найти сходство между двумя распределениями вероятностей. 0 означает, что эти два распределения одинаковы, а 1 означает, что они нигде не похожи.

Вот формула для расчета дивергенции Дженсена-Шеннона:

Где P и Q - это два распределения вероятностей, M = (P + Q) / 2, а D (P || M) - это KLD между P и M. Аналогично D (Q || M) - это KLD между Q и М.

Реализация на Python

Теперь, когда мы знаем формулу, пора ее реализовать. Прежде всего, нам нужно рассчитать M, а также KLD между P&M и Q&M.

Scipy - это феноменальная библиотека Python для научных вычислений, в которую встроено множество статистических показателей. Оказывается, мера энтропии в scipy реализована с помощью KLD. Как раз то, что мы хотим.

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