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