Mercurial > hg > qm-dsp
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 |