Я написал функцию, которая вычисляет расхождение Кульбака-Лейблера от 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)
}
Например, расхождение KL от N (5, 1) до N (0, 1) равно
> f(5, 1)
[1] 12.5
Я уверен, что этот результат верен, потому что я вычислил под рукой выражение в закрытой форме, которое дает расхождение KL от N (mu2, sigma2) до N (mu1, sigma1).
Мой вопрос касается функции KLdiv из пакета flexmix. Почему это не дает тот же результат? Что он на самом деле вычисляет?
> 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
???
Заранее спасибо!