我想使用Jensen-Shannon散度作为直方图距离函数。我正在实现一个简单的图像相似性搜索,直方图是标准化的RGB颜色分布。
我有一个关于Kullback-Leibler分歧公式的问题(JS基于此公式):当Pi或Qi为零时我应该返回什么?
以下是F#中的实现:
let dKL p q =
Array.map2 (fun pi qi -> if pi = 0. then ? // ?
elif qi = 0. then ? // ?
else pi * log (pi / qi)) p q
|> Array.sum
和使用它的Jensen-Shannon距离:
let dJS p q =
let m = Array.map2 (fun pi qi -> (pi + qi) / 2.) p q
(dKL p m) / 2. + (dKL q m) / 2.
Wikipedia表示当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
答案 0 :(得分:3)
由于您正在使用它来构建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
也是零。
总而言之,当你从dKL
致电dJS
时,第二个条款elif qi = 0
永远不会被执行:在那里放任何你喜欢的东西(可能是个好主意)除非您打算从其他地方拨打dKL
,否则它为零。