cannam@31: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@31: cannam@31: /* cannam@31: QM DSP Library cannam@31: cannam@31: Centre for Digital Music, Queen Mary, University of London. cannam@33: This file copyright 2008 QMUL. cannam@31: All rights reserved. cannam@31: */ cannam@31: cannam@31: #ifndef KLDIVERGENCE_H cannam@31: #define KLDIVERGENCE_H cannam@31: cannam@31: #include cannam@31: cannam@31: using std::vector; cannam@31: cannam@31: /** cannam@33: * Helper methods for calculating Kullback-Leibler divergences. cannam@31: */ cannam@31: class KLDivergence cannam@31: { cannam@31: public: cannam@31: KLDivergence() { } cannam@31: ~KLDivergence() { } cannam@31: cannam@33: /** cannam@33: * Calculate a symmetrised Kullback-Leibler divergence of Gaussian cannam@33: * models based on mean and variance vectors. All input vectors cannam@33: * must be of equal size. cannam@33: */ cannam@33: double distanceGaussian(const vector &means1, cannam@33: const vector &variances1, cannam@33: const vector &means2, cannam@33: const vector &variances2); cannam@33: cannam@33: /** cannam@33: * Calculate a Kullback-Leibler divergence of two probability cannam@33: * distributions. Input vectors must be of equal size. If cannam@33: * symmetrised is true, the result will be the symmetrised cannam@33: * distance (equal to KL(d1, d2) + KL(d2, d1)). cannam@33: */ cannam@33: double distanceDistribution(const vector &d1, cannam@33: const vector &d2, cannam@33: bool symmetrised); cannam@31: }; cannam@31: cannam@31: #endif cannam@31: