/*---------------------------------------------------------------------------* * IT++ * *---------------------------------------------------------------------------* * Copyright (c) 1995-2004 by Tony Ottosson, Thomas Eriksson, Pål Frenger, * * Tobias Ringström, and Jonas Samuelsson. * * * * Permission to use, copy, modify, and distribute this software and its * * documentation under the terms of the GNU General Public License is hereby * * granted. No representations are made about the suitability of this * * software for any purpose. It is provided "as is" without expressed or * * implied warranty. See the GNU General Public License for more details. * *---------------------------------------------------------------------------*/ /*! \file \brief \author Thomas Eriksson 1.3 2004/09/28 11:48:28 */ #ifndef __gmm_h #define __gmm_h #include #include "itconfig.h" #include "base/itassert.h" #include #include "base/vec.h" #include "base/mat.h" #include "base/elmatfunc.h" #include "base/array.h" #include namespace itpp { /*! \ingroup sourcecoding \brief Gaussian Mixture Model Class \author Thomas Eriksson */ class GMM { public: GMM(); GMM(int nomix, int dim); GMM(string filename); void init_from_vq(const vec &codebook, int dim); // void init(const vec &w_in, const vec &m_in, const vec &sigma_in); void init(const vec &w_in, const mat &m_in, const mat &sigma_in); void load(string filename); void save(string filename); void set_weight(const vec &weights, bool compflag=true); void set_weight(int i, double weight, bool compflag=true); void set_mean(const mat &m_in); void set_mean(const vec &means, bool compflag=true); void set_mean(int i, const vec &means, bool compflag=true); void set_covariance(const mat &sigma_in); void set_covariance(const vec &covariances, bool compflag=true); void set_covariance(int i, const vec &covariances, bool compflag=true); int get_no_mixtures(); int get_dimension(); vec get_weight(); double get_weight(int i); vec get_mean(); vec get_mean(int i); vec get_covariance(); vec get_covariance(int i); void marginalize(int d_new); void join(const GMM &newgmm); void clear(); double likelihood(const vec &x); double likelihood_aposteriori(const vec &x, int mixture); vec likelihood_aposteriori(const vec &x); vec draw_sample(); protected: vec m,sigma,w; int M,d; private: void compute_internals(); vec normweight,normexp; }; inline void GMM::set_weight(const vec &weights, bool compflag) {w=weights; if (compflag) compute_internals(); } inline void GMM::set_weight(int i, double weight, bool compflag) {w(i)=weight; if (compflag) compute_internals(); } inline void GMM::set_mean(const vec &means, bool compflag) {m=means; if (compflag) compute_internals(); } inline void GMM::set_covariance(const vec &covariances, bool compflag) {sigma=covariances; if (compflag) compute_internals(); } inline int GMM::get_no_mixtures() {return M;} inline int GMM::get_dimension() {return d;} inline vec GMM::get_weight() {return w;} inline double GMM::get_weight(int i) {return w(i);} inline vec GMM::get_mean() {return m;} inline vec GMM::get_mean(int i) {return m.mid(i*d,d);} inline vec GMM::get_covariance() {return sigma;} inline vec GMM::get_covariance(int i) {return sigma.mid(i*d,d);} GMM gmmtrain(Array &TrainingData, int M, int NOITER=30, bool VERBOSE=true); } // namespace itpp #endif // __gmm_h