% Compute KL distace D(p||q) = sum_x(p(x)*log2(p(x)/q(x)) % Input: % data - m x n numeric data matrix % each element has to be positive % Output: % kl - Kullback-Leibler divergence % m x 1 log base 2 used % % Date: 3/1/2006 function kl = my_mediankl(data) [m n] = size(data); kl = zeros(m, 1); % check each element for i=1:m for j=1:n if data(i,j) <= 0 disp('data has to be positive'); return; end end end % take the median of each column medians = median(data); % normalize each row by the sum for i=1:m total = sum(data(i,:)); for j=1:n data(i,j) = data(i,j) / total; end end % also normalize medians medians = medians / sum(medians); % calculate Kullback-Leibler divergence for each row for i=1:m for j=1:n kl(i) = kl(i) + data(i, j) * log2(data(i, j) / medians(j)); end end