我是 R 新手,并试图找到一个计算 R 中 JS 散度的函数。我可以看到 R 有 KLdiv 用于计算 KL 散度,但是有什么可用于 JS 散度的吗?
问问题
9247 次
3 回答
10
我一直在寻找JS 分歧的简单实现, 而不是 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 个分布(这里已经讨论过),我们需要一个函数来计算熵:
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
是一个权重向量,其总和应为 1,并且m
是一个以输入分布为列的矩阵。
于 2015-01-14T22:27:27.460 回答
6
如果有人仍在寻找答案(我是),在 R 包 phyloseq 中有一个计算这个的函数:http ://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone .0061217
我还发现本教程很有用:http ://enterotype.embl.de/enterotypes.html
于 2014-05-02T00:08:26.757 回答
0
根据维基百科 Jensen-Shannon 散度是 KL 散度的变换。应用定义中的公式应该会给你 JS 分歧然后......
见:http ://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence
于 2012-06-27T14:29:12.843 回答