Как рассчитать дивергенцию kl в python (с примером)


В статистике расхождение Кульбака-Лейблера (КЛ) представляет собой метрику расстояния, которая количественно определяет разницу между двумя распределениями вероятностей.

Если у нас есть два распределения вероятностей, P и Q, мы обычно записываем расхождение KL, используя обозначение KL(P || Q), что означает «расхождение P от Q».

Мы рассчитываем его по следующей формуле:

KL(P || Q) = ΣP(x) ln (P(x) / Q(x))

Если расхождение KL между двумя распределениями равно нулю, это указывает на то, что распределения идентичны.

Мы можем использовать функцию scipy.special.rel_entr() для расчета расхождения KL между двумя распределениями вероятностей в Python.

В следующем примере показано, как использовать эту функцию на практике.

Пример: расчет дивергенции KL в Python

Предположим, у нас есть следующие два распределения вероятностей в Python:

Примечание . Важно, чтобы сумма вероятностей каждого распределения равнялась единице.

 #define two probability distributions
P = [.05, .1, .2, .05, .15, .25, .08, .12]
Q = [.3, .1, .2, .1, .1, .02, .08, .1]

Мы можем использовать следующий код для расчета расхождения KL между двумя распределениями:

 from scipy. special import rel_entr

#calculate (P || Q)
sum(rel_entr(P, Q))

0.589885181619163

Расхождение KL распределения P от распределения Q составляет примерно 0,589 .

Обратите внимание, что единицы, используемые в этом расчете, известны как nats , что является сокращением от естественной единицы информации .

Таким образом, мы бы сказали, что дивергенция KL составляет 0,589 нат .

Также обратите внимание, что дивергенция KL не является симметричной метрикой. Это означает, что если мы вычислим расхождение KL распределения Q от распределения P, мы, вероятно, получим другое значение:

 from scipy. special import rel_entr

#calculate (Q || P)
sum(rel_entr(Q, P))

0.497549319448034

Расхождение KL распределения Q от распределения P составляет примерно 0,497 нат .

Примечание . В некоторых формулах для расчета расхождения KL используется логарифм по основанию 2. В данном случае речь идет о дивергенции в битах , а не в нацах.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в Python:

Как создать матрицу корреляции в Python
Как создать ковариационную матрицу в Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *