我想使用 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.
维基百科说它应该在 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