在实践中计算Kullback-Leibler散度?


15

我使用KL散度作为2 之间差异的量度f p.m.f. PQ

DKL(P||Q)=i=1Nln(PiQi)Pi
=P(Xi)ln(Q(Xi))+P(Xi)ln(P(Xi))

如果

P(Xi)=0
那么我们可以轻松地计算出
P(Xi)ln(Q(Xi))=0
P(Xi)ln(P(Xi))=0

但是,如果Q X i= 0,则 如何计算P X il n Q X i

P(Xi)0
Q(Xi)=0
P(Xi)ln(Q(Xi))

为了节省其他人一些时间,盯着您的意思,您可能想要更改带有“ \ ne”令牌的= 0P X i0P(Xi)!=0P(Xi)0

另外,您是说所有X i的吗?在这种情况下,KL散度未定义,因为Q并非概率函数(那些必须在支持上求和为1)。Q(Xi)=0XiQ

@马修谢谢,纠正。我不小心遵循了我的编码习惯。
smwikipedia

@Matthew 对于某些X i,不是全部。我正在考虑基于P的解决方法Q(Xi)=0XiP基于相同的结果,并为未显示的结果添加一个较小的伪计数(例如0.001)。它可以避免零值概率。但是我不确定是否有副作用。Q
smwikipedia 2014年

Answers:


15

你不能,你不能。假设您有一个概率分布Q的随机变量。但您的朋友鲍勃(Bob)认为结果来自概率分布P。结果。但是,由于他是根据P而不是Q构造编码的,因此他的代码将比必要的更长。KL散度测量代码将持续多长时间。

现在说他有一个硬币,他想告诉你他获得的结果的顺序。因为头部和尾部的可能性相同,所以他都给了他们两个1位代码。0表示头,1表示尾巴。如果他的尾巴是尾巴,他可以发送1 1 01。现在,如果他的硬币落在边缘,他可能就不会告诉你!他发送给您的任何代码都行不通。在这一点上,吉隆坡的分歧被打破。

由于KL散度分解,您将不得不使用其他度量或其他概率分布。您应该做什么实际上取决于您想要什么。为什么要比较概率分布?您的概率分布来自哪里,它们是根据数据估算的吗?

您说您的概率分布以某种方式来自自然语言文档,并且您想要比较类别对。

首先,我建议采用对称相关性度量。对于此应用程序,听起来像A与B相似,而B与A相似。

您是否尝试过余弦相似性度量?在NLP中很常见。

如果要坚持使用KL,您可以做的一件事是从两个文档中估计一个概率函数,然后查看每个文档平均需要多少个额外位。即(P |||(P + Q)/ 2 + Q ||(P + Q)/ 2)/ 2


很好的解释,但有点混乱:您描述第一段的方式不是KL(Q || P)吗?
尔根2014年

8

实际上,我也遇到了这个问题。在这种情况下,我发现用0代替很小的数字会引起问题。根据您使用的值,您将在KL值中引入“偏差”。如果您将KL值用于假设检验或其他涉及阈值的用途,那么这个较小的值可能会使您的结果有偏差。我发现解决此问题的最有效方法是仅考虑在一致的假设空间X_i上计算KL,其中P和Q都不为零。本质上,这将KL的域限制为同时定义了两者的域,并且使您在使用KL进行假设检验时不会遇到麻烦。


谢谢。这是一个有趣的建议。基本上,它还试图将P和Q基于相同的结果集。我会尝试的。
smwikipedia 2014年

如果我在P和Q都不为零的数据子集上计算KL,是否需要对该子集的P和Q重新进行归一化?还是只使用原始概率值?我想我应该。否则,P和Q仍不在同一基础上。
smwikipedia 2014年

我只是尝试了您的建议。P分布超过1万个结果,Q分布超过1万个结果。但是P和Q只有3K的共同点。如果我仅使用常见的3K结果来估计P和Q之间的差异,我认为这是不合理的。因为我们忽略了很多事情。顺便说一句,这种方法的结果与我添加一个小数(或伪计数)得到的结果完全不同。
smwikipedia 2014年

添加一些背景信息,我正在从事NLP实验。我有几个类别的文档,我想告诉您每对类别彼此之间的接近程度。
smwikipedia 2014年

5

Qi=0iQiQiQP

解决方案是永远不要在估计的分布中允许0或1个概率。这通常是通过某种形式的平滑来实现的,例如Good-Turing平滑,Dirichlet平滑或Laplace平滑。

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.