Kullback-Leibler发散作为直方图距离函数

时间:2012-04-03 22:18:31

标签: algorithm image-processing f# statistics histogram

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

1 个答案:

答案 0 :(得分:3)

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

dKL的定义展开为p log p - p log m,并使用0 log 0 = 0的约定/限制,您将看到没有问题:m只能是p也是零。

总而言之,当你从dKL致电dJS时,第二个条款elif qi = 0永远不会被执行:在那里放任何你喜欢的东西(可能是个好主意)除非您打算从其他地方拨打dKL,否则它为零。