【发布时间】: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