R에서 kl 발산을 계산하는 방법(예제 포함)


통계에서 Kullback-Leibler(KL) 발산은 두 확률 분포 간의 차이를 정량화하는 거리 측정법입니다.

P와 Q라는 두 개의 확률 분포가 있는 경우 일반적으로 “Q에서 P의 발산”을 의미하는 KL(P || Q) 표기법을 사용하여 KL 발산을 씁니다.

다음 공식을 사용하여 계산합니다.

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

두 분포 간의 KL 발산이 0이면 이는 분포가 동일하다는 것을 나타냅니다.

R의 두 확률 분포 사이의 KL 발산을 계산하는 가장 간단한 방법은 philentropy 패키지의 KL() 함수를 사용하는 것입니다.

다음 예에서는 이 기능을 실제로 사용하는 방법을 보여줍니다.

예: R에서 KL 발산 계산

R에 다음과 같은 두 가지 확률 분포가 있다고 가정합니다.

 #define two probability distributions
P <- c(.05, .1, .2, .05, .15, .25, .08, .12)
Q <- c(.3, .1, .2, .1, .1, .02, .08, .1)

참고 : 각 분포의 확률의 합이 1이 되는 것이 중요합니다.

다음 코드를 사용하여 두 분포 간의 KL 발산을 계산할 수 있습니다.

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(P,Q)

#calculate KL divergence
KL(x, unit=' log ')

Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler 
       0.5898852 

Q 분포에서 P 분포의 KL 발산은 약 0.589 입니다.

이 계산에 사용되는 단위는 nats 로 알려져 있으며 이는 Natural Unit of Information 의 약자입니다.

따라서 KL 발산은 0.589 nat 라고 말할 수 있습니다.

또한 KL 발산은 대칭 측정항목이 아닙니다. 이는 P 분포에서 Q 분포의 KL 발산을 계산하면 아마도 다른 값을 얻게 될 것임을 의미합니다.

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(Q,P)

#calculate KL divergence
KL(x, unit=' log ')

Metric: 'kullback-leibler' using unit: 'log'; comparing: 2 vectors.
kullback-leibler 
       0.4975493 

P 분포에서 Q 분포의 KL 발산은 약 0.497 nat 입니다.

또한 일부 수식은 log base-2를 사용하여 KL 발산을 계산합니다. 이 경우 우리는 NAT가 아닌 비트 측면에서 발산에 대해 이야기하고 있습니다.

비트 단위로 KL 발산을 계산하려면 단위 인수에 log2를 사용할 수 있습니다.

 library (philentropy)

#rbind distributions into one matrix
x <- rbind(P,Q)

#calculate KL divergence (in bits)
KL(x, unit=' log2 ')

Metric: 'kullback-leibler' using unit: 'log2'; comparing: 2 vectors.
kullback-leibler 
       0.7178119

Q 분포에서 P 분포의 KL 분기는 약 0.7178비트 입니다.

추가 리소스

다음 튜토리얼에서는 R에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

R에서 정규 분포를 생성하는 방법
R에서 정규 분포를 그리는 방법

의견을 추가하다

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