Вычисление расхождения KL с оценками плотности ядра - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть два вектора различной длины, и я хочу вычислить DKL из оценок плотности, используя функцию density() в R.

Уравнение DKL следующее.

enter image description here

Я думаю, что я могу использовать числовое интегрирование, скажем

kde1 = density(x)
kde2 = density(y)
f1 = approxfun(kde1$x,kde1$y,rule=2)
f2 = approxfun(kde2$x,kde2$y,rule=2)
kde_f = function(f1,f2){
  f1 * log2(f1/f2)
}

Затем интегрировать по kde_f, например

integrate(f = kde_f,lower=0, upper=100)

Конечно, это не работает, но я написал это как основную идею того, что я хочу сделать.Я понятия не имею, как поступить, или даже если это имеет смысл.Любая помощь будет по достоинству оценена.

1 Ответ

0 голосов
/ 11 апреля 2019

Я пришел к этому решению

kld_base = function(x,y,...){
  integrand = function(x,y,t){
    f.x =  approx(density(x)$x,density(x)$y,t)$y
    f.y =  approx(density(y)$x,density(y)$y,t)$y
    tmpRatio = f.x *(log2(f.x) - log2(f.y))
    tmpRatio = ifelse(is.infinite(tmpRatio),0,ifelse(is.na(tmpRatio),0,tmpRatio))
    return(tmpRatio)
  }
  return(integrate(integrand,-Inf,Inf,x = x,y = y,stop.on.error=FALSE)$value)
}

set.seed(13)
x = rnorm(100)
y = rnorm(100)
kld_base(x,y)
# [1] 0.06990757

Я оставлю вопрос открытым, если у кого-то есть лучшее решение, чем у меня, пожалуйста, не стесняйтесь комментировать.

...