annotate maths/KLDivergence.cpp @ 57:d241e7701c0c

* remove some debug output
author cannam
date Fri, 27 Feb 2009 13:07:22 +0000
parents 499d438b52ba
children 769da847732b
rev   line source
cannam@31 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@31 2
cannam@31 3 /*
cannam@31 4 QM DSP Library
cannam@31 5
cannam@31 6 Centre for Digital Music, Queen Mary, University of London.
cannam@31 7 This file copyright 2008 QMUL
cannam@31 8 All rights reserved.
cannam@31 9 */
cannam@31 10
cannam@31 11 #include "KLDivergence.h"
cannam@31 12
cannam@33 13 #include <cmath>
cannam@33 14
cannam@33 15 double KLDivergence::distanceGaussian(const vector<double> &m1,
cannam@33 16 const vector<double> &v1,
cannam@33 17 const vector<double> &m2,
cannam@33 18 const vector<double> &v2)
cannam@31 19 {
cannam@31 20 int sz = m1.size();
cannam@31 21
cannam@31 22 double d = -2.0 * sz;
cannam@31 23
cannam@31 24 for (int k = 0; k < sz; ++k) {
cannam@31 25 d += v1[k] / v2[k] + v2[k] / v1[k];
cannam@31 26 d += (m1[k] - m2[k]) * (1.0 / v1[k] + 1.0 / v2[k]) * (m1[k] - m2[k]);
cannam@31 27 }
cannam@31 28
cannam@31 29 d /= 2.0;
cannam@31 30
cannam@31 31 return d;
cannam@31 32 }
cannam@33 33
cannam@33 34 double KLDivergence::distanceDistribution(const vector<double> &d1,
cannam@33 35 const vector<double> &d2,
cannam@33 36 bool symmetrised)
cannam@33 37 {
cannam@33 38 int sz = d1.size();
cannam@33 39
cannam@33 40 double d = 0;
cannam@33 41 double small = 1e-20;
cannam@33 42
cannam@33 43 for (int i = 0; i < sz; ++i) {
cannam@33 44 d += d1[i] * log10((d1[i] + small) / (d2[i] + small));
cannam@33 45 }
cannam@33 46
cannam@33 47 if (symmetrised) {
cannam@33 48 d += distanceDistribution(d2, d1, false);
cannam@33 49 }
cannam@33 50
cannam@33 51 return d;
cannam@33 52 }
cannam@33 53