【问题标题】:Computing the KL divergence with kernel density estimates用核密度估计计算 KL 散度
【发布时间】:2019-04-10 03:35:32
【问题描述】:

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

DKL 的方程如下。

我想我可以使用数值积分,比如说

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)

当然,这行不通,但我写了这篇文章作为我想做的主要想法。我不知道如何进行,或者即使这有道理。任何帮助将不胜感激。

【问题讨论】:

    标签: r numerical-integration kernel-density


    【解决方案1】:

    我找到了这个解决方案

    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
    

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

    【讨论】:

    • 你有没有设法以类似的方式实现 JS 分歧?
    • 不,我没有尝试过,但我认为为 JSD 改编代码很容易。只需定义 M=0.5*(P + Q)。然后,JSD = 0.5*DKL(P||M) + 0.5*DKL(Q||M),你可以用kld_base计算DKL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2018-10-06
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多