用核密度估计值计算KL散度

时间:2019-04-10 03:35:32

标签: r numerical-integration kernel-density

我有两个长度不同的向量,我想使用R中的density()函数从密度估计值计算DKL。

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 :(得分:0)

我来到了这个解决方案

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

我会让问题开放一段时间,如果有人比我的解决方案更好,请随时发表评论。