2012-06-27 15 views
5

Tôi mới dùng R và đang cố gắng tìm một hàm tính toán phân kỳ JS trong R. Tôi có thể thấy rằng R có KLdiv để tính toán phân kỳ KL, nhưng có điều gì có sẵn cho phân kỳ JS không?Phân kỳ Jensen Shannon trong R

Trả lời

7

tôi đang tìm kiếm một việc thực hiện đơn giản của JS divergence chứ không phải là một thư viện R. Vì tôi không thấy một trong những câu trả lời, tôi đã đưa ra câu trả lời dưới đây.

Giả sử chúng ta có phân phối đầu vào sau:

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

Các Jensen-Shannon divergence sẽ là:

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

Trong hơn 2 phân phối (mà đã được thảo luận here) chúng ta cần một chức năng để tính toán Entropy:

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

Sau đó, sự phân kỳ JS sẽ là:

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 

đâu w là một vector của trọng mà nên tổng hợp 1 và m là một ma trận với các bản phân phối đầu vào như cột.

+0

Rất đẹp! –

Các vấn đề liên quan