两个样本的Kullback-Leibler散度


10

我尝试对两个样本实施Kullback-Leibler散度的数值估计。要调试的执行从两个正态分布绘制样品N(0,1)N(1,2)

为了进行简单的估算,我生成了两个直方图,并尝试在数值上近似积分。我不得不处理直方图的那些部分,其中直方图之一的bin为零,这样我要么以零除或以零的对数结束。我该如何处理?

我想到一个相关的问题:如何精确计算两个不同均匀分布之间的KL散度?我是否必须将积分限制为两个分布的支持的并集?


好吧,正态分布的支持是实数集。纯粹的数学没有问题,但是,是的,对于您的数值逼近,您需要确保样本大小相对于要积分的区域足够大。您将无法像纯数学中那样集成(-inf,+ inf)。如果您与平均值之间的差值超过3个标准差,那么它将会变得很稀疏……
马修·冈恩

1
关于第二个问题,两个不同的均匀分布之间的KL散度是不确定的(是不确定的)。同样,除非两个样本的至少一个观测值与另一个样本的每个观测值相同,否则两个经验分布的KL散度是不确定的。log(0)
jbowman

log(0)log(0)00

Answers:


9

KL(P||Q)=p(x)logp(x)q(x)dx
p(x),q(x)

pq[0,1][0,10]KL(p||q)=log10KL(q||p)log(1/0)log

回到主要问题。它是以非常非参数的方式询问的,没有对密度做出任何假设。可能需要一些假设。但是,假设将两种密度作为同一现象的竞争模型,我们可以假设它们具有相同的支配度量:例如,连续概率分布和离散概率分布之间的KL散度总是无穷大。解决这个问题的论文如下:https : //pdfs.semanticscholar.org/1fbd/31b690e078ce938f73f14462fceadc2748bf.pdf 他们提出了一种不需要初步密度估计的方法,并分析了其性质。

(还有许多其他论文)。我将回过头来发布该论文中的一些细节和想法。

 EDIT               

该论文的一些想法是关于用绝对连续分布的iid样本估计KL散度。我展示了他们对一维分布的建议,但他们也为向量提供了一种解决方案(使用最近邻密度估计)。如需证明,请阅读本文!

Pe(x)=1ni=1nU(xxi)
UU(0)=0.5Pcc
D^(PQ)=1ni=1nlog(δPc(xi)δQc(xi))
δPc=Pc(xi)Pc(xiϵ)ϵ 是一个小于样本最小间距的数字。

我们需要的经验分布函数版本的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估计量的抽样分布

为了进行比较,我们在此示例中通过数值积分计算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

嗯...差异很大,有很多需要调查的地方!


5

扩大kjetil-b-halvorsen的答案,很抱歉没有发表评论,我没有这样的声誉:

  1. 我感觉分析计算应该是(不乘以100):

LR <- function(x) dnorm(x,log=TRUE)-dt(x,5,log=TRUE) integrate(function(x) dnorm(x)*LR(x),lower=-Inf,upper=Inf)$value

  1. 如果我是对的,则估计子不会收敛到KL散度,但是收敛性表示为:。箭头表示收敛。D^(P||Q)D^(P||Q)1D(P||Q)

一旦进行了这两个校正,结果似乎更加真实。


谢谢,我将对此进行调查并更新我的答案。
kjetil b halvorsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.