Algorithm Kullback-Leibler散度作为直方图距离函数
我想使用Jensen-Shannon散度作为直方图距离函数。我正在实现一个简单的图像相似性搜索,直方图是标准化的RGB颜色分布 我对Kullback-Leibler散度公式(JS基于此)有一个问题:当Pi或Qi为零时,我应该返回什么 下面是F#中的实现: 以及使用它的Jensen-Shannon距离:Algorithm Kullback-Leibler散度作为直方图距离函数,algorithm,image-processing,f#,statistics,histogram,Algorithm,Image Processing,F#,Statistics,Histogram,我想使用Jensen-Shannon散度作为直方图距离函数。我正在实现一个简单的图像相似性搜索,直方图是标准化的RGB颜色分布 我对Kullback-Leibler散度公式(JS基于此)有一个问题:当Pi或Qi为零时,我应该返回什么 下面是F#中的实现: 以及使用它的Jensen-Shannon距离: let dJS p q = let m = Array.map2 (fun pi qi -> (pi + qi) / 2.) p q (dKL p m) / 2. + (dK
let dJS p q =
let m = Array.map2 (fun pi qi -> (pi + qi) / 2.) p q
(dKL p m) / 2. + (dKL q m) / 2.
当pi=0且qi>0时,它应该返回0,当qi=0时,它没有定义,但对于直方图距离,它没有多大意义。
在这种情况下,什么值是有意义的
编辑
根据Whatang的回答,以下是正确的版本,供将来参考:
let dKL p q =
Array.map2 (fun pi qi -> if pi = 0. && qi = 0. then 0.
else pi * log (pi / qi)) p q
|> Array.sum
由于您使用它来构建Jensen-Shannon散度,因此在计算Kullback-Leibler散度时,您可以使
qi
等于零的唯一方法是如果pi
值也为零。这是因为实际上您正在计算dKL(p,m)
和dKL(q,m)
的平均值,其中m=(p+q)/2
。因此mi=0
意味着pi=0
和qi=0
将dKL
的定义扩展为p log p-p log m
,并使用0 log 0=0
的约定/限制,您将看到没有问题:m
只有在p
也为0时才能为零
长话短说,当你从
dJS
调用dKL
时,第二个子句elif qi=0
将永远不会被执行:把你喜欢的东西放在那里(如果你不打算从其他地方调用dKL
的话,最好把它设为零)。我很好奇,我一直在上一些统计夜间课程(供参考:我们正在研究MLE/MVUE/充分性/等),但我不明白你怎么能把这个分布距离塞进一个关于相对频率的分布距离。在你叫我傻瓜之前,请记住我有限的知识。从我所读的pi=0->0
中,没有什么好的选择,只是为了避免0*log 0
这是未定义的,而qi=0->未定义的否则,你的除法为零。在STATS STACKExchange上有一个与你类似的问题:@ Guvante问题是什么值在这些情况下是有意义的。当Qi为0,PI为0时,没有问题,因为1)值相等,因此距离明显为0,2)通常认为0日志0为0。另一方面,问题是当只有qi为0时,但正如唐所示,这种情况在这种特殊情况下永远不会发生。@RitchMelton我不是专家,但其想法是相对频率分布与概率分布几乎相同,因此Jensen Shannon、Kullback Leibler、卡方检验公司都可以。我正在测试的实际实现证实了这一点,JS工作得非常好(略优于卡方检验)。正确,我没有想到这一点。有了这个修正,算法运行得非常好!
let dKL p q =
Array.map2 (fun pi qi -> if pi = 0. && qi = 0. then 0.
else pi * log (pi / qi)) p q
|> Array.sum