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에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

Python에서 상관 행렬을 만드는 방법
Python에서 공분산 행렬을 만드는 방법

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다