6

我是 R 新手,并试图找到一个计算 R 中 JS 散度的函数。我可以看到 R 有 KLdiv 用于计算 KL 散度,但是有什么可用于 JS 散度的吗?

4

3 回答 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 回答