Kullback-Leibler分歧

时间:2011-02-01 15:43:42

标签: r

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

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

???

提前谢谢!

2 个答案:

答案 0 :(得分:6)

在你写的最后一部分

 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。

答案 1 :(得分:1)

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

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