gpt4 book ai didi

r - Kullback-Leibler 散度

转载 作者:行者123 更新时间:2023-12-01 03:40:29 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com