La divergenza di Kullback-Leibler è definita come
quindi per calcolare (stimare) questo dai dati empirici avremmo bisogno, forse, di alcune stime delle funzioni di densità . Quindi un punto di partenza naturale potrebbe essere la stima della densità (e, successivamente, solo l'integrazione numerica). Non so quanto sia valido o stabile un metodo del genere.
KL(P||Q)=∫∞−∞p(x)logp(x)q(x)dx
p(x),q(x)
Ma prima la tua seconda domanda, poi tornerò alla prima. Diciamo che e sono densità uniformi su e rispettivamente. Quindi mentre è più difficile da definire, ma l'unico valore ragionevole da dare è , per quanto posso vedere, dal momento che comporta integrando che possiamo scegliere di interpretare come . Questo risultato è ragionevole dall'interpretazione che do in Intuition on the Kullback-Leibler (KL) Divergencepq[0,1][0,10]KL(p||q)=log10KL(q||p)∞log(1/0)log∞
Tornando alla domanda principale. Viene chiesto in modo molto non parametrico e non vengono assunti presupposti sulle densità. Probabilmente sono necessari alcuni presupposti. Ma supponendo che le due densità siano proposte come modelli concorrenti per lo stesso fenomeno, possiamo probabilmente supporre che abbiano la stessa misura dominante: la divergenza di KL tra una distribuzione di probabilità continua e una discreta sarebbe sempre l'infinito, per esempio. Un documento che affronta questa domanda è il seguente: https://pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf Propongono un metodo che non richiede una stima preliminare della densità e ne analizza le proprietà.
(Ci sono molti altri documenti). Tornerò e pubblicherò alcuni dettagli di quel documento, le idee.
EDIT
Alcune idee da quel documento, che riguarda la stima della divergenza di KL con i campioni da distribuzioni assolutamente continue. Mostro la loro proposta di distribuzioni monodimensionali, ma offrono anche una soluzione per i vettori (usando la stima della densità del vicino più vicino). Per prove leggi il documento!
Propongono di utilizzare una versione della funzione di distribuzione empirica, ma interpolati linearmente tra i punti campione per ottenere una versione continua. Definiscono
dove è la funzione del passo di Heavyside, ma definita in modo che . Quindi quella funzione interpolata linearmente (e estesa orizzontalmente oltre l'intervallo) è ( per continuo). Quindi propongono di stimare la divergenza di Kullback-Leibler di
dove e
Pe(x)=1n∑i=1nU(x−xi)
UU(0)=0.5PccD^(P∥Q)=1n∑i=1nlog(δPc(xi)δQc(xi))
δPc=Pc(xi)−Pc(xi−ϵ)ϵ è un numero più piccolo della spaziatura più piccola dei campioni.
Il codice R per la versione della funzione di distribuzione empirica di cui abbiamo bisogno è
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
}
si noti che rle
viene utilizzato per occuparsi del caso con duplicati in x
.
Quindi la stima della divergenza KL è data da
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
}
Quindi mostro una piccola simulazione:
KL <- replicate(1000, {x <- rnorm(100)
y <- rt(100, df=5)
KL_est(x, y)})
hist(KL, prob=TRUE)
che fornisce il seguente istogramma, mostrando (una stima) la distribuzione campionaria di questo stimatore:
Per confronto, calcoliamo la divergenza di KL in questo esempio per integrazione numerica:
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 ... la differenza è abbastanza grande che c'è molto qui da indagare!