2012-11-13 8 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 मैं inf अपेक्षा के अनुरूप है जो हो रही है। हालांकि केएल दूरी में मुझे लगता है कि जब भी वे एच 1 या एच 2 == 0 लूप का उपयोग किए बिना मैं कैसे कर सकता हूं?Kullback-Leibler (केएल) हिस्टोग्राम के बीच की दूरी - matlab

+1

यदि आप बेहतर मत पूछो मदद करने के लिए वास्तव में मुश्किल है होना चाहिए प्रशन। मुझे आपकी गलती नहीं मिल सकती है अगर मुझे नहीं पता कि कार्यक्रम को पहले स्थान पर क्या करना चाहिए। कृपया नमूना इनपुट का सुझाव दें, हमें बताएं कि आप किस आउटपुट की अपेक्षा करते हैं, और क्या गलत है। क्या फ़ंक्शन एक त्रुटि फेंकता है? क्या फ़ंक्शन आपको वापस नहीं लौटाता है? मैंने आपके प्रश्न को कम कर दिया है, हालांकि अगर प्रश्न सुधारता है तो मुझे अपने वोट में संशोधन करने में खुशी होगी। – Jonas

+0

हाय @ जोनास दैनिक उत्तरों के लिए धन्यवाद क्योंकि आप देख सकते हैं कि हम सीख रहे हैं जैसे हम जाते हैं। मुझे बाद में अपना प्रश्न निर्दिष्ट करने दें, क्षमा करें और आपको धन्यवाद – Gilad

+0

@jonas मैंने अपना प्रश्न संपादित कर लिया है कृपया इसे देखें, मान लें कि हमारे पास h1 = [0: 9] और h2 = [1:10] इनपुट के रूप में मुझे मिलेगा एक त्रुटि जब मेरे पास इनपुट के रूप में 0 है .. लॉग (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

हाँ वैसे मैंने जो किया मैंने एच 1 का उपयोग किया (ढूंढें (एच 1 == 0)) = 1, धन्यवाद – Gilad

2

मैं अपने कार्यान्वयन में कुछ गलत देखते हैं। कृपया log2 से लॉग इन करें

1

कोशिश का उपयोग करने के

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

ध्यान दें कि केएल (H1, H2) केएल (h2, एच 1) के साथ अलग है संपादित करें। आपके मामले में केएल (एच 1, एच 2) है, है ना? मुझे लगता है कि आपका कार्यान्वयन गलत है। यह एच 1 और एच 2 के बीच दूरी नहीं है। h1 और h2 के बीच केएल दूरी

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) 
संबंधित मुद्दे