
Kullback-Leibler divergence

sdriscoll
//***************************************************************************** // KLDivergence // Created 20110702 // // Shawn Driscoll // Salk Institute for Biological Studies // // Calculates the Kullback-Leibler divergence between the probability // distributions P and Q. P and Q should have the same number of points // and the distributions should have been created using a common min and max // range to both. //***************************************************************************** function KLDivergence(P,Q) //-------------------------------------------------------------------------- // parameters //-------------------------------------------------------------------------- wave P,Q; //-------------------------------------------------------------------------- // variables //-------------------------------------------------------------------------- variable npnts = numpnts(P),i; //-------------------------------------------------------------------------- // main function //-------------------------------------------------------------------------- duplicate/free P,Pn; duplicate/free Q,Qn; //// // normalize distributions by their sums wavestats/q Pn; Pn /= v_sum; wavestats/q Qn; Qn /= v_sum; //// // create free wave for the results of the point by point // calculations make/free/n=(numpnts(P)) wresult = 0; //// // divide normalized P by normalized Q matrixop/free wdiv = Pn/Qn; //// // perform point by point calculations. I put this in a normal // loop because for some reason the shorthand technique wasn't // working. for(i=0; i<npnts; i+=1) wresult[i] = Pn[i]*(log(wdiv[i])/log(2)); if(numtype(wresult[i]) > 0) wresult[i] = 0; endif endfor //// // find sum of result wave wavestats/q wresult; // set global var variable/g v_KLDivergence = v_sum; // return value return v_sum; end

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More