comparison maths/KLDivergence.cpp @ 33:499d438b52ba

* Add KL divergence of histograms
author cannam
date Mon, 21 Jan 2008 18:02:47 +0000
parents dfe38135e4c7
children 769da847732b
comparison
equal deleted inserted replaced
32:8bb764969d50 33:499d438b52ba
8 All rights reserved. 8 All rights reserved.
9 */ 9 */
10 10
11 #include "KLDivergence.h" 11 #include "KLDivergence.h"
12 12
13 double KLDivergence::distance(const vector<double> &m1, 13 #include <cmath>
14 const vector<double> &v1, 14
15 const vector<double> &m2, 15 double KLDivergence::distanceGaussian(const vector<double> &m1,
16 const vector<double> &v2) 16 const vector<double> &v1,
17 const vector<double> &m2,
18 const vector<double> &v2)
17 { 19 {
18 int sz = m1.size(); 20 int sz = m1.size();
19 21
20 double d = -2.0 * sz; 22 double d = -2.0 * sz;
21 23
26 28
27 d /= 2.0; 29 d /= 2.0;
28 30
29 return d; 31 return d;
30 } 32 }
33
34 double KLDivergence::distanceDistribution(const vector<double> &d1,
35 const vector<double> &d2,
36 bool symmetrised)
37 {
38 int sz = d1.size();
39
40 double d = 0;
41 double small = 1e-20;
42
43 for (int i = 0; i < sz; ++i) {
44 d += d1[i] * log10((d1[i] + small) / (d2[i] + small));
45 }
46
47 if (symmetrised) {
48 d += distanceDistribution(d2, d1, false);
49 }
50
51 return d;
52 }
53