00001 
00013 #ifndef MIXTURES_H
00014 #define MIXTURES_H
00015 
00016 
00017 #include "../math/functions.h"
00018 #include "../stat/exp_family.h"
00019 #include "../stat/emix.h"
00020 
00021 namespace bdm {
00022 
00024 enum MixEF_METHOD { EM = 0, QB = 1};
00025 
00042 class MixEF: public BMEF {
00043 protected:
00045         int n;
00047         Array<BMEF*> Coms;
00049         multiBM weights;
00051         eprod* est;
00053 
00055         MixEF_METHOD method;
00056 
00058         void build_est() {
00059                 est = new eprod;
00060                 if ( n > 0 ) {
00061                         Array<const epdf*> epdfs ( n + 1 );
00062                         for ( int i = 0; i < Coms.length(); i++ ) {
00063                                 epdfs ( i ) = & ( Coms ( i )->posterior() );
00064                         }
00065                         
00066                         epdfs ( n ) = & ( weights.posterior() );
00067                         est->set_parameters ( epdfs, false );
00068                 }
00069         }
00070 
00071 public:
00073         MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) :
00074                         BMEF ( ), n ( Coms0.length() ), Coms ( n ),
00075                         weights (), method ( QB ) {
00076                 for ( int i = 0; i < n; i++ ) {
00077                         Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();
00078                 }
00079                 build_est();
00080         }
00081 
00083         MixEF () :
00084                         BMEF ( ), n ( 0 ), Coms ( 0 ),
00085                         weights (), method ( QB ) {
00086                 build_est();
00087         }
00089         MixEF ( const MixEF &M2 ) : BMEF ( ), n ( M2.n ), Coms ( n ),
00090                         weights ( M2.weights ), method ( M2.method ) {
00091                 for ( int i = 0; i < n; i++ ) {
00092                         Coms ( i ) = M2.Coms ( i )->_copy_();
00093                 }
00094                 build_est();
00095         }
00096 
00101         void init ( BMEF* Com0, const mat &Data, int c = 5 );
00102         
00103         ~MixEF() {
00104                 delete est;
00105                 for ( int i = 0; i < n; i++ ) {
00106                         delete Coms ( i );
00107                 }
00108         }
00110         void bayes ( const vec &dt );
00112         void bayes ( const mat &dt );
00113         void bayesB ( const mat &dt, const vec &wData );
00114         double logpred ( const vec &dt ) const;
00115         const epdf& posterior() const {
00116                 return *est;
00117         }
00118         emix* epredictor() const;
00120         void flatten ( const BMEF* M2 );
00122         BMEF* _Coms ( int i ) {
00123                 return Coms ( i );
00124         }
00125 
00127         void set_method ( MixEF_METHOD M ) {
00128                 method = M;
00129         }
00130 };
00131 
00132 }
00133 #endif // MIXTURES_H
00134 
00135