r - 用核密度估计计算 KL 散度
问题描述
我有两个不同长度的向量,我想使用density()
R 中的函数从密度估计中计算 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)
当然,这行不通,但我写了这个作为我想做的主要思想。我不知道如何进行,或者即使这有道理。任何帮助将不胜感激。
解决方案
我来到了这个解决方案
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
我会让这个问题开放一段时间,如果有人有比我更好的解决方案,请随时发表评论。
推荐阅读
- c++ - 为什么这两种向量加法的方法有区别?
- html - 我在父表中有两个表,如何使它们具有相同的宽度?
- powershell - Powershell 文件列表删除项目检查是否失败
- python - How can I swap values in PyTorch Tensor?
- r - 如何绘制 2 天小时刻度(从 0 到 23 并从 0 到 23 重新开始)?
- vue.js - echarts - 将具有相同值的轴标签分组
- java - 在 Java 中没有出现 stackoverflow 错误的参数传递
- reactjs - 单击提交按钮时可以跳过 Ant Design 表单验证吗?
- jdbc - kafka 源连接器不填充主题
- .htaccess - 我通过 .htaccess 从 http 到 https 的重定向不起作用。我在这里阅读了许多帖子,但我无法弄清楚我的错误在哪里