2012-06-27 128 views
5

我是R的新手,試圖找到一個函數來計算JS在JS中的散度。 我可以看到R有KLdiv來計算KL散度,但是有什麼可用於JS散度?Jensen Shannon divergence in R

回答

7

我一直在尋找一個簡單實現JS divergence的,而不是的R庫。由於我沒有看到任何答覆,所以我想出了下面的答案。

假設我們有以下的輸入分佈:

# 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) 

的詹森 - 香農散度將是:

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

在超過2個分佈(其已經討論here),我們需要一個函數來計算Entropy

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

然後JS散度將是:

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 

w是應該總結1和m權重的矢量與輸入分佈爲列的矩陣。

+0

非常好的工作! –