2

イェンセン・シャノン発散をヒストグラム距離関数として使用したいと思います。単純な画像類似性検索を実装しています。ヒストグラムは正規化された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
4

1 に答える 1

3

qiこれを使用してイェンセン・シャノン発散を構築しているため、カルバック・ライブラー発散の計算でゼロに等しくなる唯一の方法は、pi値もゼロの場合です。これは、実際にはとの平均を計算しているためです。ここでdKL(p,m)、。つまり、との両方を意味します。dKL(q,m)m=(p+q)/2mi=0pi=0qi=0

の定義を展開dKLp log p - p log m、その規則/制限を使用すると、0 log 0 = 0問題がないことがわかります。mゼロになるのは、pもそうである場合のみです。

簡単に言うと、2番目の句dKLから呼び出すと、実行されることはありません。好きなものをそこに入れてください(他の場所から呼び出す場合を除いて、ゼロにすることをお勧めします)。dJSelif qi = 0dKL

于 2012-04-03T23:44:57.163 に答える