Расхождение Кульбака-Лейблера - PullRequest
3 голосов
/ 01 февраля 2011

Я написал функцию, которая вычисляет расхождение Кульбака-Лейблера от 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

???

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 15 июня 2011

В последней части вы пишете

 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 голос
/ 08 июля 2013

Проверьте параметр eps на странице руководства ?KLdiv,matrix-method:

> KLdiv(cbind(y),eps=1e-16)
         norm1    norm2
norm1  0.00000 12.49908
norm2 12.49941  0.00000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...