【问题标题】:Kullback-Leibler divergenceKullback-Leibler 散度
【发布时间】:2011-06-19 08:59:45
【问题描述】:

我编写了一个函数来计算从 N(mu2, sigma2) 到 N(0, 1) 的 Kullback-Leibler 散度。

mu1 <- 0
sigma1 <- 1
f <- function(mu2, sigma2)
{
      g <- function(x)
      {
            (dnorm(x, mean=mu1, sd=sigma1, log=TRUE) -
             dnorm(x, mean=mu2, sd=sigma2, log=TRUE)) *
             dnorm(x, mean=mu1, sd=sigma1)
      }
      return(integrate(g, -Inf, Inf)$value)   
} 

例如,从 N(5, 1) 到 N(0, 1) 的 KL 散度为

> f(5, 1)
[1] 12.5

我确信这个结果是正确的,因为我手头计算了一个封闭形式的表达式,它给出了从 N(mu2, sigma2) 到 N(mu1, sigma1) 的 KL 散度。

我的问题是关于 flexmix 包中的 KLdiv 函数。为什么它不产生相同的结果?它实际计算什么?

> library(flexmix)
> x <- seq(-4, 12, length=200)
> y <- cbind(norm1=dnorm(x, mean=0, sd=1), norm2=dnorm(x, mean=5, sd=1))
> KLdiv(cbind(y))
         norm1    norm2
norm1 0.000000 7.438505
norm2 7.438375 0.000000

不使用KLdiv,你觉得下面的过程怎么样:

> x <- rnorm(1000)
> dist <- mean(dnorm(x, mean=0, sd=1, log=TRUE)) - 
+ mean(dnorm(x, mean=5, sd=1, log=TRUE))
> print(dist)
[1] 12.40528

???

提前谢谢你!

【问题讨论】:

  • 你看过源代码吗?如果是这样,您在 KLdiv 函数中是否有什么特别不明白的地方?
  • 其实我看不到源代码...当我输入“KLdiv”时它没有出现。
  • @Marco:那是因为 KLdiv 是 S4 泛型,但消息告诉您“将 showMethods("KLdiv") 用于当前可用的 [methods]。”粗略查看?showMethods 表明您可以使用showMethods("KLdiv", classes="matrix", includeDefs=TRUE) 查看源代码。
  • 结果应该不同,因为您将两个连续理论分布的 KL 散度与两个离散经验变量(即模拟随机数据)的 KL 散度进行比较。您传递给KLdiv() 的矩阵的每一行都被解释为包含同一类的两个概率。这可能不是您想要模拟的。
  • @caracal 你是对的:KLdiv() 函数我错了。但是我已经编辑了我的消息,结果仍然非常不同。当然,我不希望这两个结果完全匹配,但它们是完全不同的!感谢您的帮助。

标签: r


【解决方案1】:

在你写的最后一部分

 x <- rnorm(1000)
 dist <- mean(dnorm(x, mean=0, sd=1, log=TRUE)) - 

   mean(dnorm(x, mean=5, sd=1, log=TRUE))

   print(dist)

[1] 12.40528

这是大小为 1000 的随机样本的散度。当样本大小趋于无穷大时,封闭形式的表达式是极限值。如果你改变你的样本量,你会更接近。或者,如果您重复执行相同的计算,您会看到估计的平均值为 12.5,如您所愿。

【讨论】:

    【解决方案2】:

    查看手册页?KLdiv,matrix-method中的eps参数:

    > KLdiv(cbind(y),eps=1e-16)
             norm1    norm2
    norm1  0.00000 12.49908
    norm2 12.49941  0.00000
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多