イェンセン・シャノン発散をヒストグラム距離関数として使用したいと思います。単純な画像類似性検索を実装しています。ヒストグラムは正規化されたRGB色分布です。
カルバック・ライブラー発散式(JSの基になっている)について質問があります。円周率または気がゼロの場合、何を返す必要がありますか?
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
そしてそれを使用するイェンセン・シャノン距離:
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