Changeset 286
- Timestamp:
- 03/05/09 14:03:35 (16 years ago)
- Files:
-
- 10 modified
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r285 r286 76 76 add_subdirectory (tests) 77 77 add_subdirectory (pmsm) 78 #add_subdirectory (mpdm)78 add_subdirectory (mpdm) 79 79 add_subdirectory (library) 80 80 add_subdirectory (doprava) -
bdm/estim/arx.cpp
r283 r286 57 57 58 58 enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const { 59 int dim= est.dimension();59 int dim=dimx;//est.dimension(); 60 60 mat mu ( dim, V.rows()-dim ); 61 61 mat R ( dim,dim ); -
bdm/estim/arx.h
r283 r286 54 54 //!@{ 55 55 ARX ( const double frg0=1.0 ) : BMEF ( frg0 ),est (), V ( est._V() ), nu ( est._nu() ) {}; 56 ARX ( const ARX &A0 ) : BMEF (),est ( A0.est ), V ( est._V() ), nu ( est._nu() ) {}; 56 ARX ( const ARX &A0 ) : BMEF (),est (), V ( est._V() ), nu ( est._nu() ) { 57 set_statistics ( A0.dimx,A0.V,A0.nu ); 58 set_parameters(A0.frg); 59 }; 57 60 ARX* _copy_() const; 58 61 void set_parameters ( double frg0 ) {frg=frg0;} … … 82 85 enorm<ldmat>* epredictor ( const vec &rgr ) const; 83 86 //! Predictor for empty regressor 84 enorm<ldmat>* epredictor() const {it_assert_debug ( est.dimension() ==V.rows()-1,"Regressor is not only 1" );return epredictor ( vec_1 ( 1.0 ) );} 87 enorm<ldmat>* epredictor() const { 88 it_assert_debug ( dimx==V.rows()-1,"Regressor is not only 1" ); 89 return epredictor ( vec_1 ( 1.0 ) ); 90 } 85 91 //! conditional version of the predictor 86 92 mlnorm<ldmat>* predictor() const; … … 103 109 if ( _yrv._dsize() !=dimx ) { 104 110 int i=0; 105 while ( _yrv._dsize() <dimx ) {_yrv.add ( drv ( vec_1 (i) ) );i++;}111 while ( _yrv._dsize() <dimx ) {_yrv.add ( drv ( vec_1 ( i ) ) );i++;} 106 112 } 107 113 //yrv should be ready by now -
bdm/estim/merger.cpp
r283 r286 51 51 // Initial component in the mixture model 52 52 mat V0=1e-8*eye ( dim +1 ); 53 ARX A0; 54 A0.set_statistics(dim, V0, dim*dim +5.0 ); //initial guess of Mix: zero mean, large variance 53 ARX A0; A0.set_statistics(dim, V0); //initial guess of Mix: 55 54 56 55 Mix.init ( &A0, Smp_ex, Nc ); … … 63 62 char str[100]; 64 63 65 e pdf* Mpred=Mix.epredictor ( );64 emix* Mpred=Mix.epredictor ( ); 66 65 vec Mix_pdf ( Ns ); 67 66 while ( !converged ) { … … 72 71 delete Mpred; 73 72 Mpred = Mix.epredictor ( ); // Allocation => must be deleted at the end!! 73 Mpred->set_rv(rv); //the predictor predicts rv of this merger 74 74 75 75 // This will be active only later in iterations!!! -
bdm/estim/merger.h
r283 r286 52 52 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp() { 53 53 RV ztmp; 54 rv = getrv(false); 55 dim = rv._dsize(); 54 56 // Extend rv by rvc! 55 57 RV rvc; setrvc ( rv,rvc ); … … 57 59 for ( int i=0;i<n;i++ ) { 58 60 //Establich connection between mpdfs and merger 59 dls ( i ) = new datalink_m2e 61 dls ( i ) = new datalink_m2e;dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv ); 60 62 // find out what is missing in each mpdf 61 63 ztmp= mpdfs ( i )->_rv(); 62 64 ztmp.add ( mpdfs ( i )->_rvc() ); 63 65 rvzs ( i ) =rv.subt ( ztmp ); 64 zdls ( i ) = new datalink_m2e ( rvzs ( i ), ztmp, rv ) ;66 zdls ( i ) = new datalink_m2e; zdls(i)->set_connection ( rvzs ( i ), ztmp, rv ) ; 65 67 }; 66 68 //Set Default values of parameters -
bdm/estim/mixef.cpp
r278 r286 15 15 int ndat = Data.cols(); 16 16 //Estimate Com0 from all data 17 Coms ( 0 ) = ( BMEF* )Com0->_copy_();17 Coms ( 0 ) = Com0->_copy_(); 18 18 // Coms(0)->set_evalll(false); 19 19 Coms ( 0 )->bayesB ( Data ); … … 24 24 for ( i=1;i<n;i++ ) { 25 25 //copy Com0 and create new rvs for them 26 Coms ( i ) = ( BMEF* ) Coms ( 0 )->_copy_ ( true);26 Coms ( i ) = Coms ( 0 )->_copy_ ( ); 27 27 } 28 28 //Pick some data for each component and update it -
bdm/estim/mixef.h
r278 r286 19 19 #include "../stat/emix.h" 20 20 21 namespace bdm {21 namespace bdm { 22 22 23 23 enum MixEF_METHOD { EM = 0, QB = 1}; … … 50 50 eprod* est; 51 51 ////!Indeces of component rvc in common rvc 52 52 53 53 //! Flag for a method that is used in the inference 54 54 MixEF_METHOD method; 55 55 56 56 //! Auxiliary function for use in constructors 57 57 void build_est() { 58 Array<const epdf*> epdfs ( n+1 ); 59 for ( int i=0;i<Coms.length();i++ ) { 58 est = new eprod; 59 if ( n>0 ) { 60 Array<const epdf*> epdfs ( n+1 ); 61 for ( int i=0;i<Coms.length();i++ ) { 60 62 // it_assert_debug(!x,"MixEF::MixEF : Incompatible components"); 61 epdfs ( i ) =& ( Coms ( i )->posterior() ); 63 epdfs ( i ) =& ( Coms ( i )->posterior() ); 64 } 65 // last in the product is the weight 66 epdfs ( n ) =& ( weights.posterior() ); 67 est->set_parameters ( epdfs, false ); 62 68 } 63 // last in the product is the weight64 epdfs ( n ) =& ( weights.posterior() );65 est = new eprod ( epdfs );66 69 } 67 70 … … 69 72 //! Full constructor 70 73 MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) : 71 BMEF ( 72 weights (), method (QB) {73 // it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" );74 BMEF ( ), n ( Coms0.length() ), Coms ( n ), 75 weights (), method ( QB ) { 76 // it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 74 77 75 78 for ( int i=0;i<n;i++ ) {Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();} … … 79 82 MixEF () : 80 83 BMEF ( ), n ( 0 ), Coms ( 0 ), 81 weights (),method (QB) {build_est();}84 weights (),method ( QB ) {build_est();} 82 85 //! Copy constructor 83 MixEF (const MixEF &M2): BMEF ( ), n ( M2.n ), Coms ( n ),84 weights ( M2.weights ), method(M2.method) {85 // it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" );86 MixEF ( const MixEF &M2 ) : BMEF ( ), n ( M2.n ), Coms ( n ), 87 weights ( M2.weights ), method ( M2.method ) { 88 // it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 86 89 87 88 89 90 for ( int i=0;i<n;i++ ) {Coms ( i ) = M2.Coms ( i )->_copy_();} 91 build_est(); 92 } 90 93 //! Initializing the mixture by a random pick of centroids from data 91 94 //! \param Com0 Initial component - necessary to determine its type. … … 108 111 emix* epredictor() const; 109 112 //! Flatten the density as if it was not estimated from the data 110 void flatten (const BMEF* M2);113 void flatten ( const BMEF* M2 ); 111 114 //! Access function 112 BMEF* _Coms (int i){return Coms(i);}113 115 BMEF* _Coms ( int i ) {return Coms ( i );} 116 114 117 //!Set which method is to be used 115 void set_method (MixEF_METHOD M){method=M;}118 void set_method ( MixEF_METHOD M ) {method=M;} 116 119 }; 117 120 -
bdm/stat/emix.h
r271 r286 18 18 //#include <std> 19 19 20 namespace bdm {20 namespace bdm { 21 21 22 22 //this comes first because it is used inside emix! … … 47 47 //!Default constructor. By default, the given epdf is not copied! 48 48 //! It is assumed that this function will be used only temporarily. 49 mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( ), dl ( rv,rvc,nom0->_rv() ) { 50 ep->set_rv(_rv()); 51 set_rvc(nom0->_rv().subt ( rv ) ); 52 if ( copy ) { 53 // nom = nom0->_copy_(); 54 it_error ( "todo" ); 55 destroynom=true; 56 } 57 else { 58 nom = nom0; 59 destroynom = false; 60 } 61 it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" ); 49 mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( ), dl ( ) { 50 // adjust rv and rvc 51 rvc = nom0->_rv().subt ( rv ); 52 dimc = rvc._dsize(); 53 ep = new epdf; 54 ep->set_parameters(rv._dsize()); 55 ep->set_rv(rv); 56 57 //prepare data structures 58 if ( copy ) {it_error ( "todo" ); destroynom=true; } 59 else { nom = nom0; destroynom = false; } 60 it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" ); 61 62 // build denominator 62 63 den = nom->marginal ( rvc ); 64 dl.set_connection(rv,rvc,nom0->_rv()); 63 65 }; 64 66 double evallogcond ( const vec &val, const vec &cond ) { … … 67 69 dl.pushup_cond ( nom_val,val,cond ); 68 70 tmp = exp ( nom->evallog ( nom_val ) - den->evallog ( cond ) ); 69 it_assert_debug (std::isfinite(tmp),"Infinite value");71 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" ); 70 72 return tmp; 71 73 } … … 96 98 public: 97 99 //!Default constructor 98 emix ( 100 emix ( ) : epdf ( ) {}; 99 101 //! Set weights \c w and components \c Coms 100 102 //!By default Coms are copied inside. Parameter \c copy can be set to false if Coms live externally. Use method ownComs() if Coms should be destroyed by the destructor. … … 103 105 vec sample() const; 104 106 vec mean() const { 105 int i; vec mu = zeros ( dim );107 int i; vec mu = zeros ( dim ); 106 108 for ( i = 0;i < w.length();i++ ) {mu += w ( i ) * Coms ( i )->mean(); } 107 109 return mu; … … 109 111 vec variance() const { 110 112 //non-central moment 111 vec mom2 = zeros (dim);112 for ( int i = 0;i < w.length();i++ ) {mom2 += w ( i ) * pow (Coms ( i )->mean(),2); }113 vec mom2 = zeros ( dim ); 114 for ( int i = 0;i < w.length();i++ ) {mom2 += w ( i ) * pow ( Coms ( i )->mean(),2 ); } 113 115 //central moment 114 return mom2-pow (mean(),2);116 return mom2-pow ( mean(),2 ); 115 117 } 116 118 double evallog ( const vec &val ) const { … … 118 120 double sum = 0.0; 119 121 for ( i = 0;i < w.length();i++ ) {sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) );} 120 if ( sum==0.0){sum=std::numeric_limits<double>::epsilon();}122 if ( sum==0.0 ) {sum=std::numeric_limits<double>::epsilon();} 121 123 double tmp=log ( sum ); 122 it_assert_debug (std::isfinite(tmp),"Infinite");124 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 123 125 return tmp; 124 126 }; … … 151 153 //!access function 152 154 epdf* _Coms ( int i ) {return Coms ( i );} 155 void set_rv(const RV &rv){ 156 epdf::set_rv(rv); 157 for(int i=0;i<Coms.length();i++){Coms(i)->set_rv(rv);} 158 } 153 159 }; 154 160 … … 174 180 mprod ( Array<mpdf*> mFacs ) : compositepdf ( mFacs ), mpdf (), epdfs ( n ), dls ( n ) { 175 181 ep=&dummy; 176 RV rv=getrv (true);177 set_rv (rv);dummy.set_parameters(rv._dsize());182 RV rv=getrv ( true ); 183 set_rv ( rv );dummy.set_parameters ( rv._dsize() ); 178 184 setrvc ( ep->_rv(),rvc ); 179 185 // rv and rvc established = > we can link them with mpdfs 180 186 for ( int i = 0;i < n;i++ ) { 181 dls ( i ) = new datalink_m2m ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 187 dls ( i ) = new datalink_m2m; 188 dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 182 189 } 183 190 … … 237 244 Array<datalink*> dls; 238 245 public: 239 eprod ( const Array<const epdf*> epdfs0 ) : epdf ( ),epdfs ( epdfs0 ),dls ( epdfs.length() ) { 246 eprod () : epdfs ( 0 ),dls ( 0 ) {}; 247 void set_parameters ( const Array<const epdf*> &epdfs0, bool named=true ) { 248 epdfs=epdfs0;//.set_length ( epdfs0.length() ); 249 dls.set_length ( epdfs.length() ); 250 240 251 bool independent=true; 241 for ( int i=0;i<epdfs.length();i++ ) { 242 independent=rv.add ( epdfs ( i )->_rv() ); 243 it_assert_debug ( independent==true, "eprod:: given components are not independent ." ); 244 } 245 for ( int i=0;i<epdfs.length();i++ ) { 246 dls ( i ) = new datalink ( epdfs ( i )->_rv() , rv ); 252 if ( named ) { 253 for ( int i=0;i<epdfs.length();i++ ) { 254 independent=rv.add ( epdfs ( i )->_rv() ); 255 it_assert_debug ( independent==true, "eprod:: given components are not independent." ); 256 } 257 dim=rv._dsize(); 258 } 259 else { 260 dim =0; for ( int i=0;i<epdfs.length();i++ ) { 261 dim+=epdfs ( i )->dimension(); 262 } 263 } 264 // 265 int cumdim=0; 266 int dimi=0; 267 int i; 268 for ( i=0;i<epdfs.length();i++ ) { 269 dls ( i ) = new datalink; 270 if ( named ) {dls ( i )->set_connection ( epdfs ( i )->_rv() , rv );} 271 else { 272 dimi = epdfs ( i )->dimension(); 273 dls ( i )->set_connection ( dimi, dim, linspace ( cumdim,cumdim+dimi-1 ) ); 274 cumdim+=dimi; 275 } 247 276 } 248 277 } … … 260 289 for ( int i=0;i<epdfs.length();i++ ) { 261 290 vec pom = epdfs ( i )->mean(); 262 dls ( i )->pushup ( tmp, pow (pom,2) );263 } 264 return tmp-pow (mean(),2);291 dls ( i )->pushup ( tmp, pow ( pom,2 ) ); 292 } 293 return tmp-pow ( mean(),2 ); 265 294 } 266 295 vec sample() const { … … 277 306 tmp+=epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 278 307 } 279 it_assert_debug (std::isfinite(tmp),"Infinite");308 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 280 309 return tmp; 281 310 } -
bdm/stat/libBM.h
r283 r286 261 261 //! Lower and upper bounds of \c percentage % quantile, returns mean-2*sigma as default 262 262 virtual void qbounds ( vec &lb, vec &ub, double percentage=0.95 ) const { 263 vec mea=mean(); vec std=sqrt (variance());263 vec mea=mean(); vec std=sqrt ( variance() ); 264 264 lb = mea-2*std; ub=mea+2*std; 265 265 }; … … 401 401 it_assert_debug ( v2v_up.length() ==downsize,"rv is not fully in rv_up" ); 402 402 } 403 //! set connection using indeces 404 void set_connection ( int ds, int us, const ivec &upind ) { 405 downsize = ds; 406 upsize = us; 407 v2v_up= upind; 408 409 it_assert_debug ( v2v_up.length() ==downsize,"rv is not fully in rv_up" ); 410 } 403 411 //! Get val for myself from val of "Up" 404 412 vec pushdown ( const vec &val_up ) { … … 425 433 426 434 public: 435 datalink_m2e() {}; 427 436 //! Constructor 428 datalink_m2e ( const RV &rv, const RV &rvc, const RV &rv_up ) : 429 datalink ( rv,rv_up ), condsize ( rvc._dsize() ) { 437 void set_connection ( const RV &rv, const RV &rvc, const RV &rv_up ) { 438 datalink::set_connection ( rv,rv_up ); 439 condsize= rvc._dsize(); 430 440 //establish v2c connection 431 441 rvc.dataind ( rv_up, v2c_lo, v2c_up ); … … 454 464 public: 455 465 //! Constructor 456 datalink_m2m ( const RV &rv, const RV &rvc, const RV &rv_up, const RV &rvc_up ) : 457 datalink_m2e ( rv, rvc, rv_up ) { 466 datalink_m2m() {}; 467 void set_connection ( const RV &rv, const RV &rvc, const RV &rv_up, const RV &rvc_up ) { 468 datalink_m2e::set_connection ( rv, rvc, rv_up ); 458 469 //establish c2c connection 459 470 rvc.dataind ( rvc_up, c2c_lo, c2c_up ); … … 714 725 if ( opt_L_bounds ) { 715 726 vec ub,lb; 716 posterior().qbounds (lb,ub);727 posterior().qbounds ( lb,ub ); 717 728 L->logit ( LIDs ( 1 ), lb ); 718 729 L->logit ( LIDs ( 2 ), ub ); -
bdm/stat/libEF.h
r285 r286 94 94 // virtual void flatten ( double nu0 ) {it_error ( "Not implemented" );} 95 95 96 BMEF* _copy_ ( bool changerv=false) const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;};96 BMEF* _copy_ () const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 97 97 }; 98 98 … … 707 707 class iW : public epdf{ 708 708 public: 709 vec sample(){ }709 vec sample(){return vec();} 710 710 }; 711 711