我是R的新手,正试图找到一个计算R中JS散度的函数。
我可以看到R具有KLdiv来计算KL散度,但是JS散度有什么可用的吗?
最佳答案
我一直在寻找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)
Jensen-Shannon散度将是:
n <- 0.5 * (p + q)
JS <- 0.5 * (sum(p * log(p / n)) + sum(q * log(q / n)))
> 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, n))
[,1]
[1,] 0.4305025
其中
w
是权重的 vector ,其总和应为1,而m
是输入分布为列的矩阵。