我编写了一个函数来计算从 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

???

先感谢您 !

最佳答案

在最后一部分你写

 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。

关于r - Kullback-Leibler 散度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4864623/

10-10 15:04