2

我想使用 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
4

1 回答 1

3

由于您使用它来构建 Jensen-Shannon 散度,因此qi在计算 Kullback-Leibler 散度时您可以等于零的唯一方法是该pi值也为零。这是因为您实际上是在计算 和 的平均值dKL(p,m)dKL(q,m)其中m=(p+q)/2。所以mi=0意味着pi=0qi=0

扩展dKLto be的定义p log p - p log m,并使用约定/限制,0 log 0 = 0您会发现没有问题:当also ism时只能为零。p

长话短说,当您dKLdJS第二个子句调用时,elif qi = 0将永远不会执行:将您喜欢的任何内容放在那里(除非您dKL要从其他地方调用,否则将其设为零可能是个好主意)。

于 2012-04-03T23:44:57.163 回答