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
00064 epdfs ( i ) = & ( Coms ( i )->posterior() );
00065 }
00066
00067 epdfs ( n ) = & ( weights.posterior() );
00068 est->set_parameters ( epdfs, false );
00069 }
00070 }
00071
00072 public:
00074 MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) :
00075 BMEF ( ), n ( Coms0.length() ), Coms ( n ),
00076 weights (), method ( QB ) {
00077
00078
00079 for ( int i = 0; i < n; i++ ) {
00080 Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();
00081 }
00082 build_est();
00083 };
00085 MixEF () :
00086 BMEF ( ), n ( 0 ), Coms ( 0 ),
00087 weights (), method ( QB ) {
00088 build_est();
00089 }
00091 MixEF ( const MixEF &M2 ) : BMEF ( ), n ( M2.n ), Coms ( n ),
00092 weights ( M2.weights ), method ( M2.method ) {
00093
00094
00095 for ( int i = 0; i < n; i++ ) {
00096 Coms ( i ) = M2.Coms ( i )->_copy_();
00097 }
00098 build_est();
00099 }
00104 void init ( BMEF* Com0, const mat &Data, int c = 5 );
00105
00106 ~MixEF() {
00107 delete est;
00108 for ( int i = 0; i < n; i++ ) {
00109 delete Coms ( i );
00110 }
00111 }
00113 void bayes ( const vec &dt );
00115 void bayes ( const mat &dt );
00116 void bayesB ( const mat &dt, const vec &wData );
00117 double logpred ( const vec &dt ) const;
00118 const epdf& posterior() const {
00119 return *est;
00120 }
00121 emix* epredictor() const;
00123 void flatten ( const BMEF* M2 );
00125 BMEF* _Coms ( int i ) {
00126 return Coms ( i );
00127 }
00128
00130 void set_method ( MixEF_METHOD M ) {
00131 method = M;
00132 }
00133 };
00134
00135 }
00136 #endif // MIXTURES_H
00137
00138