2012-11-13 46 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 

vấn đề của tôi là bất cứ khi nào h1 (i) hoặc h2 (i) == 0 tôi nhận được thông tin như mong đợi. Tuy nhiên trong khoảng cách KL tôi giả sử để trở về 0 bất cứ khi nào họ h1 hoặc h2 == 0 làm thế nào tôi có thể làm điều đó mà không cần sử dụng một vòng lặp?Khoảng cách giữa các biểu đồ - matlab

+1

Đó là thực sự khó khăn để giúp bạn nếu bạn không yêu cầu tốt hơn câu hỏi. Tôi không thể tìm thấy sai lầm của bạn, hoặc nếu tôi không biết những gì chương trình nên làm ở nơi đầu tiên. Xin vui lòng đề nghị một đầu vào mẫu, cho chúng tôi biết đầu ra bạn mong đợi, và những gì đi sai. Chức năng này có phát ra lỗi không? Chức năng không trả về những gì bạn muốn? Tôi đã downvoted câu hỏi của bạn, mặc dù tôi rất vui khi sửa đổi phiếu bầu của tôi nếu câu hỏi được cải thiện. – Jonas

+0

hi @Jonas cảm ơn câu trả lời hàng ngày vì bạn có thể thấy tôi đang học khi chúng tôi đi. hãy để tôi chỉ định câu hỏi của tôi sau, xin lỗi và cảm ơn bạn – Gilad

+0

@jonas tôi đã chỉnh sửa câu hỏi của mình có thể bạn hãy nhìn vào nó, giả sử chúng ta có h1 = [0: 9] và h2 = [1:10] làm đầu vào tôi sẽ nhận được một lỗi khi tôi có 0 là đầu vào .. log (0) – Gilad

Trả lời

3

Để tránh gặp sự cố khi bất kỳ số lượng là 0, tôi đề nghị bạn tạo ra một chỉ số đánh dấu sự "tốt" dữ liệu điểm:

%# 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

có chính xác những gì tôi đã làm tôi đã sử dụng h1 (find (h1 == 0)) = 1, cảm ơn – Gilad

2

tôi thấy một số sai trong việc thực hiện của bạn. Hãy chỉnh sửa đăng bởi log2

1

Cố gắng sử dụng

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

Lưu ý rằng KL (h1, h2) là khác nhau với KL (h2, h1). Trong trường hợp của bạn là KL (h1, h2), phải không? Tôi nghĩ rằng việc triển khai của bạn là sai. Nó không phải là khoảng cách giữa h1 và h2. Khoảng cách giữa KL h1 và h2 được định nghĩa

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

Vì vậy, việc thực hiện đúng phải

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

hoặc

d=sum(h2.*log2(h2+eps)-h2.*log2(h1+eps)) %KL(h2,h1) 
Các vấn đề liên quan