我编写了一个函数来计算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
???
提前谢谢!
答案 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