Rozbieżność Kullbacka-Leiblera jest zdefiniowana jako
więc aby obliczyć (oszacować) to na podstawie danych empirycznych, potrzebowalibyśmy być może niektórych szacunków funkcji gęstości p ( x ) , q ( x )
KL( P| | Q)= ∫∞- ∞p ( x ) logp ( x )q( x )rex
p ( x ) , q( x ) . Tak więc naturalnym punktem wyjścia może być oszacowanie gęstości (a następnie po prostu całkowanie numeryczne). Jak dobra lub stabilna byłaby taka metoda, nie wiem.
pq[ 0 , 1 ][ 0 , 10 ]KL( p | | q) = log10KL( q| | p)∞log( 1 / 0 )log∞
Wracając do głównego pytania. Pytanie jest zadawane w bardzo nieparametryczny sposób i nie podano żadnych założeń dotyczących gęstości. Prawdopodobnie potrzebne są pewne założenia. Ale zakładając, że dwie gęstości są proponowane jako konkurujące modele dla tego samego zjawiska, możemy prawdopodobnie założyć, że mają one tę samą dominującą miarę: rozbieżność KL między ciągłym a dyskretnym rozkładem prawdopodobieństwa zawsze byłaby na przykład nieskończonością. Jeden artykuł dotyczący tego pytania jest następujący: https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf Proponują metodę, która nie wymaga wstępnego oszacowania gęstości, i analizuje jej właściwości.
(Jest wiele innych artykułów). Wrócę i opublikuję kilka szczegółów z tego artykułu, pomysłów.
EDIT
Kilka pomysłów z tego artykułu, który dotyczy oszacowania rozbieżności KL z próbkami z absolutnie ciągłych rozkładów. Pokazuję ich propozycję rozkładów jednowymiarowych, ale dają one również rozwiązanie dla wektorów (wykorzystując oszacowanie gęstości najbliższego sąsiada). Aby uzyskać dowody, przeczytaj artykuł!
P.mi( x ) = 1n∑i = 1nU( x - xja)
UU( 0 ) = 0,5P.dodore^( P∥ Q ) = 1n∑i = 1nlog( δP.do( xja)δQdo( xja))
δP.do= Pdo( xja) - Pdo( xja- ϵ )ϵ
Kod R dla wersji funkcji rozkładu empirycznego, której potrzebujemy, to
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
}
Uwaga: rle
służy do załatwiania sprawy z duplikatami w x
.
Następnie oszacowanie dywergencji KL podaje
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
}
Następnie pokazuję małą symulację:
KL <- replicate(1000, {x <- rnorm(100)
y <- rt(100, df=5)
KL_est(x, y)})
hist(KL, prob=TRUE)
co daje następujący histogram, pokazujący (oszacowanie) rozkład próbkowania tego estymatora:
Dla porównania obliczamy dywergencję KL w tym przykładzie przez całkowanie numeryczne:
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
hmm ... różnica jest na tyle duża, że jest tu wiele do zbadania!