두 샘플에 대한 쿨백-라이 블러 발산


10

두 샘플에 대해 Kullback-Leibler Divergence의 수치 추정을 구현하려고했습니다. 구현을 디버그하려면 두 정규 분포 (0,1) 및 에서 샘플을 가져옵니다 .(1,2)

간단한 추정을 위해 두 개의 히스토그램을 생성하고 수치 적으로 근사치를 근사하려고했습니다. 히스토그램 중 하나의 빈이 0 인 히스토그램의 해당 부분을 처리하는 데 어려움을 겪었으므로 0으로 나누거나 0의 로그로 끝납니다. 이 문제를 어떻게 처리합니까?

관련 질문이 떠 올랐습니다. 두 개의 다른 균일 분포 사이의 KL-Divergence를 정확하게 계산하는 방법은 무엇입니까? 두 배포판 모두를 지원하기 위해 통합을 통합해야합니까?


정규 분포의 지원은 실수 세트입니다. 순수한 수학에는 문제가 없지만, 그렇습니다. 수치 근사의 경우 표본 크기가 통합하려는 영역에 비해 충분히 큰지 확인해야합니다. 순수한 수학에서 할 수있는 것처럼 (-inf, + inf)를 통합 할 수 없습니다. 평균에서 3 표준 편차 이상 떨어져 있다면 상당히 얇을 것입니다.
Matthew Gunn

1
두 번째 질문과 관련하여 두 개의 다른 균일 분포 사이의 KL- 분산은 정의되지 않습니다 ( 은 정의되지 않음). 마찬가지로, 각 표본이 다른 표본의 모든 관측치와 동일한 값을 갖는 하나 이상의 관측치를 가지지 않는 한 두 개의 경험적 분포에 대한 KL- 분산은 정의되지 않습니다. 로그(0)
jbowman

@jbowman 작은 메모. 당신이 그 권리이지만 정의되지 않은 (또는됩니다 - ), 그것은 치료에 대한 정보 이론의 관례 로그 ( 0 ) 0 으로 0 . 로그(0)로그(0)00
Luca Citi

답변:


9

Kullback-Leibler 발산은 따라서 경험적 데이터로부터 이것을 계산 (추정)하기 위해서는 밀도 함수 p ( x ) , q ( x )의 일부 추정이 필요할 것이다. 따라서 자연적인 출발점은 밀도 추정을 통한 것일 수 있습니다 (그리고 그 후에는 수치 적 통합). 그런 방법이 얼마나 좋거나 안정적인지 모르겠습니다.

KL(||)=(엑스)로그(엑스)(엑스)엑스
(엑스),(엑스)

그러나 두 번째 질문은 먼저 첫 번째 질문으로 돌아갑니다. q 는 각각 [ 0 , 1 ][ 0 , 10 ] 에서 균일 한 밀도 라고하자 . 그런 다음 KL ( p | | q ) = log 10 이지만 KL ( q | | p ) 을 정의하기가 더 어렵지만, 로그 를 통합하기 때문에 내가 알 수 있는 한 합리적인 값은 ∞입니다 ( 1 /[0,1][0,10]KL(||)=로그10KL(||) 우리는 다음과 같이 interprete 선택할 수있는 로그 . 이 결과는 내가Kullback-Leibler (KL) 분기에 대한 직관에서제공 한 해석에서 합리적입니다.로그(1/0)로그

주요 질문으로 돌아갑니다. 매우 비모수 적 방식으로 요청되며 밀도에 대한 가정은 없습니다. 아마도 몇 가지 가정이 필요할 것입니다. 그러나 두 개의 밀도가 동일한 현상에 대한 경쟁 모델로 제안된다고 가정 할 때, 우리는 아마도 동일한 측정 기준을 가지고 있다고 가정 할 수 있습니다. 이 문제를 해결 한 논문은 다음과 같다 https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf 그들은 예비 밀도 추정을 필요로하지 않는 방법을 제안하고, 그 특성을 분석한다.

(다른 많은 논문이 있습니다). 나는 그 논문으로 돌아와서 아이디어를 게시 할 것이다.

 EDIT               

이 논문의 일부 아이디어는 절대적으로 연속적인 분포에서 얻은 iid 샘플로 KL 발산을 추정하는 것에 관한 것입니다. 나는 1 차원 분포에 대한 그들의 제안을 보여 주지만, 벡터에 대한 해를 제공한다 (가장 가까운 이웃 밀도 추정을 사용하여). 증거를 위해 종이를 읽으십시오!

그들은 경험적 분포 함수의 버전을 사용할 것을 제안하지만, 연속적인 버전을 얻기 위해 샘플 포인트 사이에 선형으로 보간됩니다. 그들은 정의합니다.

이자형(엑스)=1나는=1(엑스엑스나는)
(0)=0.5
^()=1나는=1로그(δ(엑스나는)δ(엑스나는))
δ=(엑스나는)(엑스나는ϵ)ϵ

우리가 필요로하는 경험적 분포 함수의 버전에 대한 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 추정기의 샘플링 분포

비교를 위해이 예제에서 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

흠 ... 차이가 충분히 커서 조사해야 할 부분이 많습니다!


5

kjetil-b-halvorsen의 답변을 조금 확장하고 주석을 달지 않아 죄송합니다. 평판이 없습니다.

  1. 분석 계산은 100을 곱하지 않고해야한다고 생각합니다.

LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE) integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value

  1. ^(||)^(||)1(||)

이 두 가지 수정이 이루어지면 결과는 더욱 사실적으로 보입니다.


고마워, 나는 이것을 조사하고 내 대답을 업데이트 할 것입니다.
kjetil b halvorsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.