2012-06-27 8 views
5

Ich bin neu in R und suchte nach einer Funktion, die JS Divergenz in R berechnet. Ich kann sehen, dass R KLdiv für die Berechnung der KL Divergenz hat, aber gibt es etwas für JS Divergenz?Jensen Shannon Divergenz in R

Antwort

7

ich war für eine einfache Implementierung der JS divergence eher als eine R-Bibliothek suchen. Da ich in keiner der Antworten eine Antwort gefunden habe, habe ich die folgende gefunden.

Angenommen, wir folgende Eingabeverteilungen haben:

# p & q are distributions so their elements should sum up to 1 
p <- c(0.00029421, 0.42837957, 0.1371827, 0.00029419, 0.00029419, 
     0.40526004, 0.02741252, 0.00029422, 0.00029417, 0.00029418) 

q <- c(0.00476199, 0.004762, 0.004762, 0.00476202, 0.95714168, 
     0.00476213, 0.00476212, 0.00476202, 0.00476202, 0.00476202) 

Die Jensen-Shannon Divergenz wäre:

m <- 0.5 * (p + q) 
JS <- 0.5 * (sum(p * log(p/m)) + sum(q * log(q/m))) 
> JS 
[1] 0.6457538 

Seit mehr als zwei Verteilungen (die bereits here diskutiert worden ist) wir brauchen Funktion zur Berechnung der Entropy:

H <- function(v) { 
     v <- v[v > 0] 
     return(sum(-v * log(v))) 
} 

Dann würde die JS Divergenz:

JSD <- function(w, m) { 
    return(H(m %*% w) - apply(m, 2, H) %*% w) 
} 

> JSD(w = c(1/3, 1/3, 1/3), m = cbind(p, q, m)) 
      [,1] 
[1,] 0.4305025 

Wo w ist ein Vektor von Gewichten, die zu 1 summieren müssen und m ist eine Matrix mit den Eingangsverteilungen als Spalten.

+0

Sehr schöne Arbeit! –