Как рассчитать дивергенцию 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