2012-06-27 8 views
5

Rで新しく、RでJS発散を計算する関数を見つけようとしていました。 RにKL発散を計算するためのKLdivがありますが、JS発散のために利用できるものはありますか?Jensen Shannon divergence in R

答えて

7

私はJS divergenceの単純な実装ではなく、Rライブラリーを探していました。私はいずれの回答でも1つも見なかったので、私は下の方を思いついた。

我々は次の入力分布を持っていると仮定すると:

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

ジェンセン・シャノン発散は次のようになります。

私たちが必要とする(すでに hereを議論してきた)2つの以上のディストリビューションについては
m <- 0.5 * (p + q) 
JS <- 0.5 * (sum(p * log(p/m)) + sum(q * log(q/m))) 
> JS 
[1] 0.6457538 

Entropyを計算する関数:

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

そしてJS発散は次のようになります。w 1及びmにまとめるべき重みのベクトルである

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 

列として入力された分布を有する行列です。

+0

非常に良い仕事! –