root/bdm/estim/mixef.h @ 254

Revision 254, 4.1 kB (checked in by smidl, 15 years ago)

create namespace bdm

Line 
1/*!
2  \file
3  \brief Bayesian Filtering for mixtures of exponential family (EF) members
4  \author Vaclav Smidl.
5
6  -----------------------------------
7  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8
9  Using IT++ for numerical operations
10  -----------------------------------
11*/
12
13#ifndef MEF_H
14#define MEF_H
15
16#include <itpp/itbase.h>
17#include "../stat/libFN.h"
18#include "../stat/libEF.h"
19#include "../stat/emix.h"
20
21namespace bdm{
22
23enum MixEF_METHOD { EM = 0, QB = 1};
24
25/*!
26* \brief Mixture of Exponential Family Densities
27
28An approximate estimation method for models with latent discrete variable, such as
29mixture models of the following kind:
30\f[
31f(y_t|\psi_t, \Theta) = \sum_{i=1}^{n} w_i f(y_t|\psi_t, \theta_i)
32\f]
33where  \f$\psi\f$ is a known function of past outputs, \f$w=[w_1,\ldots,w_n]\f$ are component weights, and component parameters \f$\theta_i\f$ are assumed to be mutually independent. \f$\Theta\f$ is an aggregation af all component parameters and weights, i.e. \f$\Theta = [\theta_1,\ldots,\theta_n,w]\f$.
34
35The characteristic feature of this model is that if the exact values of the latent variable were known, estimation of the parameters can be handled by a single model. For example, for the case of mixture models, posterior density for each component parameters would be a BayesianModel from Exponential Family.
36
37This class uses EM-style type algorithms for estimation of its parameters. Under this simplification, the posterior density is a product of exponential family members, hence under EM-style approximate estimation this class itself belongs to the exponential family.
38
39TODO: Extend BM to use rvc.
40*/
41class MixEF: public BMEF {
42protected:
43        //!Number of components
44        int n;
45        //! Models for Components of \f$\theta_i\f$
46        Array<BMEF*> Coms;
47        //! Statistics for weights
48        multiBM weights;
49        //!Posterior on component parameters
50        eprod* est;
51        ////!Indeces of component rvc in common rvc
52       
53        //! Flag for a method that is used in the inference
54        MixEF_METHOD method;
55       
56        //! Auxiliary function for use in constructors
57        void build_est() {
58                Array<const epdf*> epdfs ( n+1 );
59                for ( int i=0;i<Coms.length();i++ ) {
60//                      it_assert_debug(!x,"MixEF::MixEF : Incompatible components");
61                        epdfs ( i ) =& ( Coms ( i )->_epdf() );
62                }
63                // last in the product is the weight
64                epdfs ( n ) =& ( weights._epdf() );
65                est = new eprod ( epdfs );
66        }
67
68public:
69        //! Full constructor
70        MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) :
71                        BMEF ( RV() ), n ( Coms0.length() ), Coms ( n ),
72                        weights ( RV ( "{w }", vec_1 ( n ) ),alpha0 ), method(QB) {
73        //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" );
74
75                for ( int i=0;i<n;i++ ) {Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();}
76                build_est();
77        };
78        //! Constructor of empty mixture
79        MixEF () :
80                        BMEF ( RV() ), n ( 0 ), Coms ( 0 ),
81                        weights ( RV ( "{w }", vec_1 ( 0 ) ),vec ( 0 ) ),method(QB) {build_est();}
82        //! Copy constructor
83        MixEF(const MixEF &M2): BMEF ( RV() ), n ( M2.n ), Coms ( n ),
84                   weights ( M2.weights ), method(M2.method) {
85        //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" );
86
87                           for ( int i=0;i<n;i++ ) {Coms ( i ) = M2.Coms ( i )->_copy_();}
88                           build_est();
89                   }
90        //! Initializing the mixture by a random pick of centroids from data
91        //! \param Com0 Initial component - necessary to determine its type.
92        //! \param Data Data on which the initialization will be done
93        //! \param c Initial number of components, default=5
94        void init ( BMEF* Com0, const mat &Data, int c=5 );
95        //Destructor
96        ~MixEF() {
97                delete est;
98                for ( int i=0;i<n;i++ ) {delete Coms ( i );}
99        }
100        //! Recursive EM-like algorithm (QB-variant), see Karny et. al, 2006
101        void bayes ( const vec &dt );
102        //! EM algorithm
103        void bayes ( const mat &dt );
104        void bayesB ( const mat &dt, const vec &wData );
105        double logpred ( const vec &dt ) const;
106        const epdf& _epdf() const {return *est;}
107        const eprod* _e() const {return est;}
108        emix* predictor(const RV &rv) const;
109        //! Flatten the density as if it was not estimated from the data
110        void flatten(const BMEF* M2);
111        //! Access function
112        BMEF* _Coms(int i){return Coms(i);}
113       
114        //!Set which method is to be used
115        void set_method(MixEF_METHOD M){method=M;}
116};
117
118}
119#endif // MEF_H
120
Note: See TracBrowser for help on using the browser.