2012-11-13 36 views
5
function [ d ] = hcompare_KL(h1,h2) 
%This routine evaluates the Kullback-Leibler (KL) distance between histograms. 
%    Input:  h1, h2 - histograms 
%    Output: d – the distance between the histograms. 
%    Method: KL is defined as: 
%    Note, KL is not symmetric, so compute both sides. 
%    Take care not to divide by zero or log zero: disregard entries of the sum  for which with H2(i) == 0. 

temp = sum(h1 .* log(h1 ./ h2)); 
temp(isinf(temp)) = 0; % this resloves where h1(i) == 0 
d1 = sum(temp); 

temp = sum(h2 .* log(h2 ./ h1)); % other direction of compare since it's not symetric 
temp(isinf(temp)) = 0; 
d2 = sum(temp); 

d = d1 + d2; 

end 

私の問題は、H1(i)又はH2(I)== 0 iは期待通りにあるinfファイルを取得していたときにということです。しかし、KL距離では、h1またはh2 == 0のときはいつでも0を返すと思われます。ループを使用せずにどうすればいいですか?カルバック・ライブラー(KL)距離 - MATLAB

+1

でなければならない方が良い聞いていない場合、あなたを助けるために本当に難しいです質問。私はあなたの間違いを見つけることができません、もし私がプログラムが最初に何をすべきか分からなければ。サンプルの入力を提案し、どの出力を期待しているのか、何がうまくいかないのかを教えてください。関数はエラーをスローしますか?関数はあなたが望むものを返さないのですか?私はあなたの質問を下落させましたが、質問が改善すれば私の投票を修正することができます。 – Jonas

+0

こんにちは@Jonas毎日のお返事ありがとうございます。後で私の質問を指定してよろしくお願いします。ありがとうございます。 – Gilad

+0

@jonas私は私の質問を編集しました。それを見てください。私はh1 = [0:9]とh2 = [1:10]私が入力として0を持っているときのエラー.. log(0) – Gilad

答えて

3

カウントのいずれかが0であるときの問題を回避するために、私はあなたが「良い」データポイントをマークしたインデックスを作成するお勧め:

%# you may want to do some input testing, such as whether h1 and h2 are 
%# of the same size 

%# preassign the output 
d = zeros(size(h1)); 

%# create an index of the "good" data points 
goodIdx = h1>0 & h2>0; %# bin counts <0 are not good, either 

d1 = sum(h1(goodIdx) .* log(h1(goodIdx) . /h2(goodIdx))); 
d2 = sum(h2(goodIdx) .* log(h2(goodIdx) . /h1(goodIdx))); 

%# overwrite d only where we have actual data 
%# the rest remains zero 
d(goodIdx) = d1 + d2; 
+0

はい正確に私はh1を使いました(find(h1 == 0))= 1、ありがとう – Gilad

2

私はあなたの実装では、いくつかの間違ったを参照してください。 LOG2

1

KL(H1、H2)はKL(H2、H1)と異なっていることを

d=sum(h1.*log2(h1+eps)-h1.*log2(h2+eps)) 

注意を使用してみてくださいでログイン編集してください。あなたの場合はKL(h1、h2)でしょうか? 私はあなたの実装が間違っていると思います。 h1とh2の間の距離ではありません。 H1とH2の間のKL距離は

KL(h1,h2)=sum(h1.log(h1/h2))=sum(h1.logh1-h2.logh2). 

を定義しているので、正しい実装が

d=sum(h1.*log2(h1+eps)-h1.*log2(h2+eps)) %KL(h1,h2) 

または

d=sum(h2.*log2(h2+eps)-h2.*log2(h1+eps)) %KL(h2,h1) 
関連する問題