Kullback-Leibler 발산은
따라서 경험적 데이터로부터 이것을 계산 (추정)하기 위해서는 밀도 함수 p ( x ) , q ( x )의 일부 추정이 필요할 것이다. 따라서 자연적인 출발점은 밀도 추정을 통한 것일 수 있습니다 (그리고 그 후에는 수치 적 통합). 그런 방법이 얼마나 좋거나 안정적인지 모르겠습니다.
KL( P| | Q)= ∫∞− ∞p ( x ) 로그p ( x )큐( x )디엑스
p ( x ) , q( x )
그러나 두 번째 질문은 먼저 첫 번째 질문으로 돌아갑니다. 및 q 는 각각 [ 0 , 1 ] 및 [ 0 , 10 ] 에서 균일 한 밀도 라고하자 . 그런 다음 KL ( p | | q ) = log 10 이지만 KL ( q | | p ) 을 정의하기가 더 어렵지만, 로그 를 통합하기 때문에 내가 알 수 있는 한 합리적인 값은 ∞입니다 ( 1 /피큐[ 0 , 1 ][ 0 , 10 ]KL( p | | q) = 로그10KL( q| | p)∞ 우리는 다음과 같이 interprete 선택할 수있는 로그 ∞ . 이 결과는 내가Kullback-Leibler (KL) 분기에 대한 직관에서제공 한 해석에서 합리적입니다.로그( 1 / 0 )로그∞
주요 질문으로 돌아갑니다. 매우 비모수 적 방식으로 요청되며 밀도에 대한 가정은 없습니다. 아마도 몇 가지 가정이 필요할 것입니다. 그러나 두 개의 밀도가 동일한 현상에 대한 경쟁 모델로 제안된다고 가정 할 때, 우리는 아마도 동일한 측정 기준을 가지고 있다고 가정 할 수 있습니다. 이 문제를 해결 한 논문은 다음과 같다 https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf 그들은 예비 밀도 추정을 필요로하지 않는 방법을 제안하고, 그 특성을 분석한다.
(다른 많은 논문이 있습니다). 나는 그 논문으로 돌아와서 아이디어를 게시 할 것이다.
EDIT
이 논문의 일부 아이디어는 절대적으로 연속적인 분포에서 얻은 iid 샘플로 KL 발산을 추정하는 것에 관한 것입니다. 나는 1 차원 분포에 대한 그들의 제안을 보여 주지만, 벡터에 대한 해를 제공한다 (가장 가까운 이웃 밀도 추정을 사용하여). 증거를 위해 종이를 읽으십시오!
그들은 경험적 분포 함수의 버전을 사용할 것을 제안하지만, 연속적인 버전을 얻기 위해 샘플 포인트 사이에 선형으로 보간됩니다. 그들은 정의합니다.
피이자형( x ) = 1엔∑나는 = 1엔유( x − x나는)
유유( 0 ) = 0.5피씨씨디^( P∥ Q ) = 1엔∑나는 = 1엔로그( δ피씨( x나는)δ큐씨( x나는))
δ피씨= P씨( x나는) − P씨( x나는− ϵ )ϵ
우리가 필요로하는 경험적 분포 함수의 버전에 대한 R 코드는
my.ecdf <- function(x) {
x <- sort(x)
x.u <- unique(x)
n <- length(x)
x.rle <- rle(x)$lengths
y <- (cumsum(x.rle)-0.5) / n
FUN <- approxfun(x.u, y, method="linear", yleft=0, yright=1,
rule=2)
FUN
}
노트 rle
에 중복의 경우 알아서하는 데 사용됩니다 x
.
KL 발산의 추정은 다음과 같이 주어진다.
KL_est <- function(x, y) {
dx <- diff(sort(unique(x)))
dy <- diff(sort(unique(y)))
ex <- min(dx) ; ey <- min(dy)
e <- min(ex, ey)/2
n <- length(x)
P <- my.ecdf(x) ; Q <- my.ecdf(y)
KL <- sum( log( (P(x)-P(x-e))/(Q(x)-Q(x-e)))) / n
KL
}
그런 다음 작은 시뮬레이션을 보여줍니다.
KL <- replicate(1000, {x <- rnorm(100)
y <- rt(100, df=5)
KL_est(x, y)})
hist(KL, prob=TRUE)
이 추정기의 샘플링 분포에 대한 (추정)을 보여주는 다음 막대 그래프를 제공합니다.
비교를 위해이 예제에서 KL 분기를 수치 적분으로 계산합니다.
LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE)
100*integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value
[1] 3.337668
흠 ... 차이가 충분히 커서 조사해야 할 부분이 많습니다!