- Timestamp:
- 11/04/08 14:54:34 (16 years ago)
- Location:
- bdm
- Files:
-
- 10 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/estim/arx.cpp
r182 r198 33 33 lll = pred.lognc(); 34 34 } 35 else 36 if(evalll){lll=last_lognc;}else{lll=pred.lognc();} 35 else 36 if ( evalll ) {lll=last_lognc;} 37 else{lll=pred.lognc();} 37 38 38 39 V.opupdt ( dt,1.0 ); … … 42 43 } 43 44 44 ARX* ARX::_copy_ ( bool changerv ) {45 ARX* ARX::_copy_ ( bool changerv ) { 45 46 ARX* Tmp=new ARX ( *this ); 46 if ( changerv ) {Tmp->rv.newids(); Tmp->est._renewrv (Tmp->rv);}47 if ( changerv ) {Tmp->rv.newids(); Tmp->est._renewrv ( Tmp->rv );} 47 48 return Tmp; 48 49 } … … 55 56 } 56 57 57 enorm<ldmat>* ARX::predictor(const RV &rv){ 58 mat mu(rv.count(), 1); 59 mat R(rv.count(),rv.count()); 60 enorm<ldmat>* tmp; 61 tmp=new enorm<ldmat>(rv); 58 enorm<ldmat>* ARX::predictor ( const RV &rv, const vec &rgr ) const { 59 mat mu ( rv.count(), V.rows()-rv.count() ); 60 mat R ( rv.count(),rv.count() ); 61 enorm<ldmat>* tmp; 62 tmp=new enorm<ldmat> ( rv ); 63 64 est.mean_mat ( mu,R ); //mu = 65 //correction for student-t -- TODO check if correct!! 66 //R*=nu/(nu-2); 67 mat p_mu=mu.T() *rgr; //the result is one column 68 tmp->set_parameters ( p_mu.get_col ( 0 ),ldmat ( R ) ); 69 return tmp; 70 } 71 72 mlnorm<ldmat>* ARX::predictor ( const RV &rv, const RV &rvc ) const { 73 int dif=V.rows() - rv.count() - rvc.count(); 74 it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" ); 75 76 mat mu ( rv.count(), V.rows()-rv.count() ); 77 mat R ( rv.count(),rv.count() ); 78 mlnorm<ldmat>* tmp; 79 tmp=new mlnorm<ldmat> ( rv,rvc ); 80 81 est.mean_mat ( mu,R ); //mu = 82 mu = mu.T(); 83 //correction for student-t -- TODO check if correct!! 84 85 if ( dif==0 ) { // no constant term 86 tmp->set_parameters ( mu, zeros ( rv.count() ), ldmat ( R ) ); 87 } 88 else { 89 //Assume the constant term is the last one: 90 tmp->set_parameters ( mu.get_cols (0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ) ); 91 } 92 return tmp; 93 } 94 95 mlstudent* ARX::predictor_student ( const RV &rv, const RV &rvc ) const { 96 int dif=V.rows() - rv.count() - rvc.count(); 97 it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" ); 98 99 mat mu ( rv.count(), V.rows()-rv.count() ); 100 mat R ( rv.count(),rv.count() ); 101 mlstudent* tmp; 102 tmp=new mlstudent ( rv,rvc ); 103 104 est.mean_mat ( mu,R ); // 105 mu = mu.T(); 62 106 63 est.mean_mat(mu,R); 64 //here I know that mu can have only one column 65 tmp->set_parameters(mu.get_col(0),ldmat(R)); 107 int xdim = rv.count(); 108 int end = V._L().rows()-1; 109 ldmat Lam ( V._L() ( xdim,end,xdim,end ), V._D() ( xdim,end ) ); //exp val of R 110 111 112 if ( dif==0 ) { // no constant term 113 tmp->set_parameters ( mu, zeros ( rv.count() ), ldmat ( R ), Lam); 114 } 115 else { 116 //Assume the constant term is the last one: 117 tmp->set_parameters ( mu.get_cols (0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ), Lam); 118 } 66 119 return tmp; 67 120 } -
bdm/estim/arx.h
r180 r198 72 72 if(evalll){last_lognc=est.lognc();} 73 73 } 74 75 enorm<ldmat>* predictor(const RV &rv); 74 //! Conditional version of the predictor 75 enorm<ldmat>* predictor(const RV &rv0, const vec &rgr) const; 76 enorm<ldmat>* predictor(const RV &rv0) const {it_assert_debug(rv0.count()==V.rows()-1,"Regressor is not only 1");return predictor(rv0,vec_1(1.0));} 77 mlnorm<ldmat>* predictor(const RV &rv0, const RV &rvc0) const; 78 mlstudent* predictor_student(const RV &rv0, const RV &rvc0) const; 76 79 //! Brute force structure estimation.\return indeces of accepted regressors. 77 80 ivec structure_est ( egiw Eg0 ); -
bdm/estim/merger.cpp
r197 r198 8 8 vec lam = sum ( pow ( lW,2 ) )-nu*pow ( mu,2 ); 9 9 double coef=0.0; 10 vec sq2bl=sqrt ( 2*beta*lam ); //this term is everywhere 10 11 switch ( nu ) { 11 12 case 2: 12 coef= sqrt ( beta*2 ) *( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) );13 return exp ( coef*sq rt ( lam )+ mu );13 coef= ( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) ); 14 return exp ( coef*sq2bl + mu ); 14 15 break; 15 case 3://Ration of Bessel 16 case 3://Ratio of Bessel 17 coef = sqrt ( ( 3*beta-2 ) /3*beta ); 18 return elem_mult ( 19 elem_div ( besselk ( 0,sq2bl*coef ), besselk ( 0,sq2bl ) ), 20 exp ( mu ) ); 16 21 break; 17 22 case 4: … … 24 29 25 30 void merger::merge ( const epdf* g0 ) { 26 it_file dbg ( "merger_debug.it" );31 // it_file dbg ( "merger_debug.it" ); 27 32 28 33 it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); … … 36 41 for ( int i=0;i<Ns;i++ ) { set_col_part ( Smp_ex,i,Smp ( i ) );} 37 42 38 dbg << Name ( "Smp_0" ) << Smp_ex;43 // dbg << Name ( "Smp_0" ) << Smp_ex; 39 44 40 45 // Stuff for merging … … 51 56 Mix.init ( &A0, Smp_ex, Nc ); 52 57 //Preserve initial mixture for repetitive estimation via flattening 53 MixEF Mix_init (Mix);58 MixEF Mix_init ( Mix ); 54 59 55 60 // ============= MAIN LOOP ================== … … 63 68 //Re-estimate Mix 64 69 //Re-Initialize Mixture model 65 Mix.flatten (&Mix_init);70 Mix.flatten ( &Mix_init ); 66 71 Mix.bayesB ( Smp_ex, w*Ns ); 67 72 Mpred = Mix.predictor ( rv ); // Allocation => must be deleted at the end!! 68 73 69 sprintf ( str,"Mpred_mean%d",niter );70 dbg << Name ( str ) << Mpred->mean();74 // sprintf ( str,"Mpred_mean%d",niter ); 75 // dbg << Name ( str ) << Mpred->mean(); 71 76 72 // Generate new samples 73 eSmp.set_samples ( Mpred ); 74 for ( int i=0;i<Ns;i++ ) { set_col_part ( Smp_ex,i,Smp ( i ) );} 77 if ( niter<10 ) { 78 // Generate new samples 79 eSmp.set_samples ( Mpred ); 80 for ( int i=0;i<Ns;i++ ) { set_col_part ( Smp_ex,i,Smp ( i ) );} 75 81 76 sprintf ( str,"Mpdf%d",niter ); 77 for ( int i=0;i<Ns;i++ ) {Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) );} 78 dbg << Name ( str ) << Mix_pdf; 82 } 83 // sprintf ( str,"Mpdf%d",niter ); 84 // for ( int i=0;i<Ns;i++ ) {Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) );} 85 // dbg << Name ( str ) << Mix_pdf; 79 86 80 sprintf ( str,"Smp%d",niter );81 dbg << Name ( str ) << Smp_ex;87 // sprintf ( str,"Smp%d",niter ); 88 // dbg << Name ( str ) << Smp_ex; 82 89 83 90 //Importace weighting … … 99 106 //compute vector of lw_src 100 107 for ( int k=0;k<Ns;k++ ) { 101 lw_src ( k ) += tmp_marg->evalpdflog ( dls ( i )->get_val ( Smp ( i ) ) ); 108 // Here val of tmp_marg = cond of mpdfs(i) ==> calling dls->get_cond 109 lw_src ( k ) += tmp_marg->evalpdflog ( dls ( i )->get_cond ( Smp ( k ) ) ); 102 110 } 103 111 delete tmp_marg; 112 113 // sprintf ( str,"marg%d",niter ); 114 // dbg << Name ( str ) << lw_src; 115 104 116 } 105 117 // Compute likelihood of the missing variable … … 125 137 126 138 } 139 // it_assert_debug(std::isfinite(sum(lw_src)),"bad"); 127 140 lW.set_row ( i, lw_src ); // do not divide by mix 128 141 } … … 131 144 lw_mix ( j ) =Mix.logpred ( Smp_ex.get_col ( j ) ); 132 145 } 133 sprintf ( str,"lW%d",niter );134 dbg << Name ( str ) << lW;146 // sprintf ( str,"lW%d",niter ); 147 // dbg << Name ( str ) << lW; 135 148 136 149 w = lognorm_merge ( lW ); //merge 137 150 138 sprintf ( str,"w%d",niter );139 dbg << Name ( str ) << w;140 sprintf ( str,"lw_m%d",niter );141 dbg << Name ( str ) << lw_mix;151 // sprintf ( str,"w%d",niter ); 152 // dbg << Name ( str ) << w; 153 // sprintf ( str,"lw_m%d",niter ); 154 // dbg << Name ( str ) << lw_mix; 142 155 143 156 //Importance weighting … … 146 159 w /=sum ( w ); 147 160 148 sprintf ( str,"w_is_%d",niter );149 dbg << Name ( str ) << w;161 // sprintf ( str,"w_is_%d",niter ); 162 // dbg << Name ( str ) << w; 150 163 151 164 // eSmp.resample(); // So that it can be used in bayes 152 165 // for ( int i=0;i<Ns;i++ ) { set_col_part ( Smp_ex,i,Smp ( i ) );} 153 166 154 sprintf ( str,"Smp_res%d",niter );155 dbg << Name ( str ) << Smp;167 // sprintf ( str,"Smp_res%d",niter ); 168 // dbg << Name ( str ) << Smp; 156 169 157 170 // ==== stopping rule === 158 171 niter++; 159 converged = ( niter> 9);172 converged = ( niter>5 ); 160 173 } 161 174 -
bdm/estim/merger.h
r192 r198 35 35 Array<RV> rvzs; 36 36 //! Data Links of rv0 mpdfs - these will be conditioned the (rv,rvc) of mpdfs 37 Array<datalink_m2e*> zdls; 38 37 Array<datalink_m2e*> zdls; 38 39 39 //!Number of samples used in approximation 40 40 int Ns; … … 47 47 merger ( const Array<mpdf*> &S ) : 48 48 compositepdf ( S ), epdf ( getrv ( false ) ), 49 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls(n), rvzs(n), zdls(n) { 50 RV ztmp; 49 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ) { 50 RV ztmp; 51 // Extend rv by rvc! 52 RV rvc; setrvc ( rv,rvc ); 53 rv.add ( rvc ); 51 54 for ( int i=0;i<n;i++ ) { 52 55 //Establich connection between mpdfs and merger 53 dls ( i ) = new datalink_m2e ( mpdfs ( i )->_rv(), mpdfs (i)->_rvc(), rv );56 dls ( i ) = new datalink_m2e ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv ); 54 57 // find out what is missing in each mpdf 55 ztmp= mpdfs (i)->_rv();56 ztmp.add (mpdfs(i)->_rvc());57 rvzs (i)=rv.subt(ztmp);58 zdls (i) = new datalink_m2e (rvzs(i), ztmp, rv ) ;58 ztmp= mpdfs ( i )->_rv(); 59 ztmp.add ( mpdfs ( i )->_rvc() ); 60 rvzs ( i ) =rv.subt ( ztmp ); 61 zdls ( i ) = new datalink_m2e ( rvzs ( i ), ztmp, rv ) ; 59 62 }; 60 63 //Set Default values of parameters … … 90 93 //! for future use 91 94 virtual ~merger() { 92 for ( int i=0; i<n; i++){93 delete dls (i);94 delete zdls (i);95 for ( int i=0; i<n; i++ ) { 96 delete dls ( i ); 97 delete zdls ( i ); 95 98 } 96 99 }; -
bdm/estim/mixef.cpp
r197 r198 132 132 } 133 133 134 emix* MixEF::predictor ( const RV &rv ) {134 emix* MixEF::predictor ( const RV &rv ) const { 135 135 Array<epdf*> pC ( n ); 136 136 for ( int i=0;i<n;i++ ) {pC ( i ) =Coms ( i )->predictor ( rv );} … … 149 149 Coms(i)->flatten(Mix2->Coms(i)); 150 150 } 151 //F altten weights152 weights. flatten(&(Mix2->weights));151 //Flatten weights = make them equal!! 152 weights.set_statistics(&(Mix2->weights)); 153 153 } -
bdm/estim/mixef.h
r197 r198 105 105 double logpred ( const vec &dt ) const; 106 106 const epdf& _epdf() const {return *est;} 107 emix* predictor(const RV &rv) ;107 emix* predictor(const RV &rv) const; 108 108 //! Flatten the density as if it was not estimated from the data 109 109 void flatten(const BMEF* M2); -
bdm/stat/libBM.h
r193 r198 426 426 427 427 //!Constructs a predictive density (marginal density on data) 428 virtual epdf* predictor ( const RV &rv ) {it_error ( "Not implemented" );return NULL;};428 virtual epdf* predictor ( const RV &rv ) const {it_error ( "Not implemented" );return NULL;}; 429 429 430 430 //! Destructor for future use; -
bdm/stat/libEF.cpp
r197 r198 82 82 mat R; 83 83 mean_mat(M,R); 84 return cvectorize (concat_vertical(M .T(),R));84 return cvectorize (concat_vertical(M,R)); 85 85 } 86 86 … … 95 95 96 96 // set mean value 97 M= L ( xdim,end,0,xdim-1 ).T()*iLsub; 97 mat Lpsi = L ( xdim,end,0,xdim-1 ); 98 M= iLsub*Lpsi; 98 99 R= ldR.to_mat() ; 99 100 } -
bdm/stat/libEF.h
r197 r198 94 94 //!Flatten the posterior as if to keep nu0 data 95 95 // virtual void flatten ( double nu0 ) {it_error ( "Not implemented" );} 96 96 97 97 BMEF* _copy_ ( bool changerv=false ) {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 98 98 }; … … 192 192 //! returns a pointer to the internal statistics. Use with Care! 193 193 double& _nu() {return nu;} 194 void pow ( double p ) {V*=p;nu*=p;};194 void pow ( double p ) {V*=p;nu*=p;}; 195 195 }; 196 196 … … 239 239 //! Conjugate prior and posterior 240 240 eDirich est; 241 //! Pointer inside est to sufficient statistics 241 //! Pointer inside est to sufficient statistics 242 242 vec β 243 243 public: … … 271 271 // sum(beta) should be equal to sum(B.beta) 272 272 const vec &Eb=E->beta;//const_cast<multiBM*> ( E )->_beta(); 273 beta*= ( sum ( Eb ) /sum ( beta ) );273 beta*= ( sum ( Eb ) /sum ( beta ) ); 274 274 if ( evalll ) {last_lognc=est.lognc();} 275 275 } … … 372 372 template<class sq_T> 373 373 class mlnorm : public mEF { 374 protected: 374 375 //! Internal epdf that arise by conditioning on \c rvc 375 376 enorm<sq_T> epdf; … … 379 380 public: 380 381 //! Constructor 381 mlnorm ( const RV &rv, const RV &rvc );382 mlnorm ( const RV &rv, const RV &rvc ); 382 383 //! Set \c A and \c R 383 384 void set_parameters ( const mat &A, const vec &mu0, const sq_T &R ); … … 387 388 // mat samplecond (const vec &cond, vec &lik, int n ); 388 389 //! Set value of \c rvc . Result of this operation is stored in \c epdf use function \c _ep to access it. 389 void condition (const vec &cond ); 390 390 void condition ( const vec &cond ); 391 392 //!access function 393 vec& _mu_const() {return mu_const;} 394 //!access function 395 mat& _A() {return A;} 396 //!access function 397 mat _R() {return epdf._R().to_mat();} 398 391 399 template<class sq_M> 392 400 friend std::ostream &operator<< ( std::ostream &os, mlnorm<sq_M> &ml ); 393 401 }; 394 402 403 /*! (Approximate) Student t density with linear function of mean value 404 */ 405 class mlstudent : public mlnorm<ldmat> { 406 protected: 407 ldmat Lambda; 408 ldmat &_R; 409 ldmat Re; 410 public: 411 mlstudent ( const RV &rv0, const RV &rvc0 ) :mlnorm<ldmat> ( rv0,rvc0 ), 412 Lambda ( rv0.count() ), 413 _R ( epdf._R() ) {} 414 void set_parameters ( const mat &A0, const vec &mu0, const ldmat &R0, const ldmat& Lambda0) { 415 epdf.set_parameters ( zeros ( rv.count() ),Lambda ); 416 A = A0; 417 mu_const = mu0; 418 Re=R0; 419 Lambda = Lambda0; 420 } 421 void condition ( const vec &cond ) { 422 _mu = A*cond + mu_const; 423 double zeta; 424 //ugly hack! 425 if ((cond.length()+1)==Lambda.rows()){ 426 zeta = Lambda.invqform ( concat(cond, vec_1(1.0)) ); 427 } else { 428 zeta = Lambda.invqform ( cond ); 429 } 430 _R = Re; 431 _R*=( 1+zeta );// / ( nu ); << nu is in Re!!!!!! 432 433 cout << _mu <<" +- " << sqrt(_R.to_mat()) << endl; 434 }; 435 436 }; 395 437 /*! 396 438 \brief Gamma random walk … … 548 590 double enorm<sq_T>::evalpdflog_nn ( const vec &val ) const { 549 591 // 1.83787706640935 = log(2pi) 550 return -0.5* ( R.invqform ( mu-val ) );// - lognc(); 592 double tmp=-0.5* ( R.invqform ( mu-val ) );// - lognc(); 593 return tmp; 551 594 }; 552 595 … … 554 597 inline double enorm<sq_T>::lognc () const { 555 598 // 1.83787706640935 = log(2pi) 556 return 0.5* ( R.cols() * 1.83787706640935 +R.logdet() ); 599 double tmp=0.5* ( R.cols() * 1.83787706640935 +R.logdet() ); 600 return tmp; 557 601 }; 558 602 … … 584 628 // vec smp ( dim ); 585 629 // this->condition ( cond ); 586 // 630 // 587 631 // for ( i=0; i<n; i++ ) { 588 632 // smp = epdf.sample(); … … 590 634 // Smp.set_col ( i ,smp ); 591 635 // } 592 // 636 // 593 637 // return Smp; 594 638 // } 595 639 596 640 template<class sq_T> 597 void mlnorm<sq_T>::condition ( const vec &cond ) {641 void mlnorm<sq_T>::condition ( const vec &cond ) { 598 642 _mu = A*cond + mu_const; 599 643 //R is already assigned; … … 605 649 606 650 sq_T Rn ( R,irvn ); 607 enorm<sq_T>* tmp = new enorm<sq_T> ( rvn );651 enorm<sq_T>* tmp = new enorm<sq_T> ( rvn ); 608 652 tmp->set_parameters ( mu ( irvn ), Rn ); 609 653 return tmp; … … 627 671 int end=R.rows()-1; 628 672 mat S11 = S.get ( 0,n, 0, n ); 629 mat S12 = S.get ( 0, n , rvn.count(), end );673 mat S12 = S.get ( 0, n , rvn.count(), end ); 630 674 mat S22 = S.get ( rvn.count(), end, rvn.count(), end ); 631 675 … … 644 688 645 689 template<class sq_T> 646 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml ) {690 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml ) { 647 691 os << "A:"<< ml.A<<endl; 648 692 os << "mu:"<< ml.mu_const<<endl; -
bdm/stat/loggers.h
r162 r198 46 46 47 47 //! log this vector 48 virtual void logit ( int id, vecv ) =0;48 virtual void logit ( int id, const vec &v ) =0; 49 49 50 50 //! Shifts storage position for another time step. … … 86 86 } 87 87 void step() {if ( ind<maxlen ) ind++; else it_error ( "memlog::ind is too high;" );} 88 void logit ( int id, vecv ) {88 void logit ( int id, const vec &v ) { 89 89 it_assert_debug(id<vectors.length(),"Logger was not initialized, run init()."); 90 90 vectors ( id ).set_row ( ind,v );}