我尝试对两个样本实施Kullback-Leibler散度的数值估计。要调试的执行从两个正态分布绘制样品和。
为了进行简单的估算,我生成了两个直方图,并尝试在数值上近似积分。我不得不处理直方图的那些部分,其中直方图之一的bin为零,这样我要么以零除或以零的对数结束。我该如何处理?
我想到一个相关的问题:如何精确计算两个不同均匀分布之间的KL散度?我是否必须将积分限制为两个分布的支持的并集?
我尝试对两个样本实施Kullback-Leibler散度的数值估计。要调试的执行从两个正态分布绘制样品和。
为了进行简单的估算,我生成了两个直方图,并尝试在数值上近似积分。我不得不处理直方图的那些部分,其中直方图之一的bin为零,这样我要么以零除或以零的对数结束。我该如何处理?
我想到一个相关的问题:如何精确计算两个不同均匀分布之间的KL散度?我是否必须将积分限制为两个分布的支持的并集?
Answers:
回到主要问题。它是以非常非参数的方式询问的,没有对密度做出任何假设。可能需要一些假设。但是,假设将两种密度作为同一现象的竞争模型,我们可以假设它们具有相同的支配度量:例如,连续概率分布和离散概率分布之间的KL散度总是无穷大。解决这个问题的论文如下:https : //pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf 他们提出了一种不需要初步密度估计的方法,并分析了其性质。
(还有许多其他论文)。我将回过头来发布该论文中的一些细节和想法。
EDIT
该论文的一些想法是关于用绝对连续分布的iid样本估计KL散度。我展示了他们对一维分布的建议,但他们也为向量提供了一种解决方案(使用最近邻密度估计)。如需证明,请阅读本文!
我们需要的经验分布函数版本的R代码是
my.ecdf <- function(x) {
x <- sort(x)
x.u <- unique(x)
n <- length(x)
x.rle <- rle(x)$lengths
y <- (cumsum(x.rle)-0.5) / n
FUN <- approxfun(x.u, y, method="linear", yleft=0, yright=1,
rule=2)
FUN
}
请注意,rle
用于处理重复的x
。
则KL散度的估计为
KL_est <- function(x, y) {
dx <- diff(sort(unique(x)))
dy <- diff(sort(unique(y)))
ex <- min(dx) ; ey <- min(dy)
e <- min(ex, ey)/2
n <- length(x)
P <- my.ecdf(x) ; Q <- my.ecdf(y)
KL <- sum( log( (P(x)-P(x-e))/(Q(x)-Q(x-e)))) / n
KL
}
然后,我展示了一个小模拟:
KL <- replicate(1000, {x <- rnorm(100)
y <- rt(100, df=5)
KL_est(x, y)})
hist(KL, prob=TRUE)
这给出了以下直方图,显示了此估算器的采样分布(估算):
为了进行比较,我们在此示例中通过数值积分计算KL散度:
LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE)
100*integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value
[1] 3.337668
嗯...差异很大,有很多需要调查的地方!
扩大kjetil-b-halvorsen的答案,很抱歉没有发表评论,我没有这样的声誉:
LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE)
integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value
一旦进行了这两个校正,结果似乎更加真实。