Python에서 kl 발산을 계산하는 방법(예제 포함)
통계에서 Kullback-Leibler(KL) 발산은 두 확률 분포 간의 차이를 정량화하는 거리 측정법입니다.
P와 Q라는 두 개의 확률 분포가 있는 경우 일반적으로 “Q에서 P의 발산”을 의미하는 KL(P || Q) 표기법을 사용하여 KL 발산을 씁니다.
다음 공식을 사용하여 계산합니다.
KL(P || Q) = ΣP(x) ln (P(x) / Q(x))
두 분포 간의 KL 발산이 0이면 이는 분포가 동일하다는 것을 나타냅니다.
scipy.special.rel_entr() 함수를 사용하여 Python에서 두 확률 분포 간의 KL 발산을 계산할 수 있습니다.
다음 예에서는 이 기능을 실제로 사용하는 방법을 보여줍니다.
예: Python에서 KL 발산 계산
Python에 다음과 같은 두 가지 확률 분포가 있다고 가정합니다.
참고 : 각 분포의 확률의 합이 1이 되는 것이 중요합니다.
#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
Q 분포에서 P 분포의 KL 발산은 약 0.589 입니다.
이 계산에 사용되는 단위는 nats 로 알려져 있으며 이는 Natural Unit of Information 의 약어입니다.
따라서 KL 발산은 0.589 nat 라고 말할 수 있습니다.
또한 KL 발산은 대칭 측정항목이 아닙니다. 이는 P 분포에서 Q 분포의 KL 발산을 계산하면 아마도 다른 값을 얻게 될 것임을 의미합니다.
from scipy. special import rel_entr
#calculate (Q || P)
sum(rel_entr(Q, P))
0.497549319448034
P 분포에서 Q 분포의 KL 발산은 약 0.497 nat 입니다.
참고 : 일부 공식은 log base-2를 사용하여 KL 발산을 계산합니다. 이 경우 우리는 NAT가 아닌 비트 측면에서 발산에 대해 이야기하고 있습니다.
추가 리소스
다음 튜토리얼에서는 Python에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.