Changeset 198 for bdm

Show
Ignore:
Timestamp:
11/04/08 14:54:34 (16 years ago)
Author:
smidl
Message:

opravy + zavedeni studenta + zakomentovani debug v mergeru

Location:
bdm
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/arx.cpp

    r182 r198  
    3333                lll = pred.lognc(); 
    3434        } 
    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();} 
    3738 
    3839        V.opupdt ( dt,1.0 ); 
     
    4243} 
    4344 
    44 ARX* ARX::_copy_ ( bool changerv) { 
     45ARX* ARX::_copy_ ( bool changerv ) { 
    4546        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 );} 
    4748        return Tmp; 
    4849} 
     
    5556} 
    5657 
    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); 
     58enorm<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 
     72mlnorm<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 
     95mlstudent* 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(); 
    62106         
    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        } 
    66119        return tmp; 
    67120} 
  • bdm/estim/arx.h

    r180 r198  
    7272                if(evalll){last_lognc=est.lognc();} 
    7373        } 
    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; 
    7679        //! Brute force structure estimation.\return indeces of accepted regressors. 
    7780        ivec structure_est ( egiw Eg0 ); 
  • bdm/estim/merger.cpp

    r197 r198  
    88        vec lam = sum ( pow ( lW,2 ) )-nu*pow ( mu,2 ); 
    99        double coef=0.0; 
     10        vec sq2bl=sqrt ( 2*beta*lam ); //this term is everywhere 
    1011        switch ( nu ) { 
    1112                case 2: 
    12                         coef=sqrt ( beta*2 ) * ( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) ); 
    13                         return exp ( coef*sqrt ( lam ) + mu ); 
     13                        coef= ( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) ); 
     14                        return exp ( coef*sq2bl + mu ); 
    1415                        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 ) ); 
    1621                        break; 
    1722                case 4: 
     
    2429 
    2530void merger::merge ( const epdf* g0 ) { 
    26         it_file dbg ( "merger_debug.it" ); 
     31//      it_file dbg ( "merger_debug.it" ); 
    2732 
    2833        it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); 
     
    3641        for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
    3742 
    38         dbg << Name ( "Smp_0" ) << Smp_ex; 
     43//      dbg << Name ( "Smp_0" ) << Smp_ex; 
    3944 
    4045        // Stuff for merging 
     
    5156        Mix.init ( &A0, Smp_ex, Nc ); 
    5257        //Preserve initial mixture for repetitive estimation via flattening 
    53         MixEF Mix_init(Mix); 
     58        MixEF Mix_init ( Mix ); 
    5459 
    5560        // ============= MAIN LOOP ================== 
     
    6368                //Re-estimate Mix 
    6469                //Re-Initialize Mixture model 
    65                 Mix.flatten(&Mix_init); 
     70                Mix.flatten ( &Mix_init ); 
    6671                Mix.bayesB ( Smp_ex, w*Ns ); 
    6772                Mpred = Mix.predictor ( rv ); // Allocation => must be deleted at the end!! 
    6873 
    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(); 
    7176 
    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 ) );} 
    7581 
    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; 
    7986 
    80                 sprintf ( str,"Smp%d",niter ); 
    81                 dbg << Name ( str ) << Smp_ex; 
     87//              sprintf ( str,"Smp%d",niter ); 
     88//              dbg << Name ( str ) << Smp_ex; 
    8289 
    8390                //Importace weighting 
     
    99106                                        //compute vector of lw_src 
    100107                                        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 ) ) ); 
    102110                                        } 
    103111                                        delete tmp_marg; 
     112 
     113//                                      sprintf ( str,"marg%d",niter ); 
     114//                                      dbg << Name ( str ) << lw_src; 
     115 
    104116                                } 
    105117                                // Compute likelihood of the missing variable 
     
    125137 
    126138                        } 
     139//                      it_assert_debug(std::isfinite(sum(lw_src)),"bad"); 
    127140                        lW.set_row ( i, lw_src ); // do not divide by mix 
    128141                } 
     
    131144                        lw_mix ( j ) =Mix.logpred ( Smp_ex.get_col ( j ) ); 
    132145                } 
    133                 sprintf ( str,"lW%d",niter ); 
    134                 dbg << Name ( str ) << lW; 
     146//              sprintf ( str,"lW%d",niter ); 
     147//              dbg << Name ( str ) << lW; 
    135148 
    136149                w = lognorm_merge ( lW ); //merge 
    137150 
    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; 
    142155 
    143156                //Importance weighting 
     
    146159                w /=sum ( w ); 
    147160 
    148                 sprintf ( str,"w_is_%d",niter ); 
    149                 dbg << Name ( str ) << w; 
     161//              sprintf ( str,"w_is_%d",niter ); 
     162//              dbg << Name ( str ) << w; 
    150163 
    151164//              eSmp.resample(); // So that it can be used in bayes 
    152165//              for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
    153166 
    154                 sprintf ( str,"Smp_res%d",niter ); 
    155                 dbg << Name ( str ) << Smp; 
     167//              sprintf ( str,"Smp_res%d",niter ); 
     168//              dbg << Name ( str ) << Smp; 
    156169 
    157170                // ==== stopping rule === 
    158171                niter++; 
    159                 converged = ( niter>9 ); 
     172                converged = ( niter>5 ); 
    160173        } 
    161174 
  • bdm/estim/merger.h

    r192 r198  
    3535        Array<RV> rvzs; 
    3636        //! 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 
    3939        //!Number of samples used in approximation 
    4040        int Ns; 
     
    4747        merger ( const Array<mpdf*> &S ) : 
    4848                        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 ); 
    5154                for ( int i=0;i<n;i++ ) { 
    5255                        //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 ); 
    5457                        // 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 ) ; 
    5962                }; 
    6063                //Set Default values of parameters 
     
    9093//! for future use 
    9194        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 ); 
    9598                } 
    9699        }; 
  • bdm/estim/mixef.cpp

    r197 r198  
    132132} 
    133133 
    134 emix* MixEF::predictor ( const RV &rv ) { 
     134emix* MixEF::predictor ( const RV &rv ) const { 
    135135        Array<epdf*> pC ( n ); 
    136136        for ( int i=0;i<n;i++ ) {pC ( i ) =Coms ( i )->predictor ( rv );} 
     
    149149                Coms(i)->flatten(Mix2->Coms(i)); 
    150150        } 
    151         //Faltten weights 
    152         weights.flatten(&(Mix2->weights)); 
     151        //Flatten weights = make them equal!! 
     152        weights.set_statistics(&(Mix2->weights)); 
    153153} 
  • bdm/estim/mixef.h

    r197 r198  
    105105        double logpred ( const vec &dt ) const; 
    106106        const epdf& _epdf() const {return *est;} 
    107         emix* predictor(const RV &rv); 
     107        emix* predictor(const RV &rv) const; 
    108108        //! Flatten the density as if it was not estimated from the data 
    109109        void flatten(const BMEF* M2); 
  • bdm/stat/libBM.h

    r193 r198  
    426426 
    427427        //!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;}; 
    429429 
    430430        //! Destructor for future use; 
  • bdm/stat/libEF.cpp

    r197 r198  
    8282                mat R; 
    8383                mean_mat(M,R); 
    84                 return cvectorize (concat_vertical(M.T(),R)); 
     84                return cvectorize (concat_vertical(M,R)); 
    8585        } 
    8686 
     
    9595         
    9696        // 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; 
    9899        R= ldR.to_mat()  ; 
    99100} 
  • bdm/stat/libEF.h

    r197 r198  
    9494        //!Flatten the posterior as if to keep nu0 data 
    9595//      virtual void flatten ( double nu0 ) {it_error ( "Not implemented" );} 
    96          
     96 
    9797        BMEF* _copy_ ( bool changerv=false ) {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 
    9898}; 
     
    192192        //! returns a pointer to the internal statistics. Use with Care! 
    193193        double& _nu() {return nu;} 
    194         void pow ( double p ){V*=p;nu*=p;}; 
     194        void pow ( double p ) {V*=p;nu*=p;}; 
    195195}; 
    196196 
     
    239239        //! Conjugate prior and posterior 
    240240        eDirich est; 
    241         //! Pointer inside est to sufficient statistics  
     241        //! Pointer inside est to sufficient statistics 
    242242        vec &beta; 
    243243public: 
     
    271271                // sum(beta) should be equal to sum(B.beta) 
    272272                const vec &Eb=E->beta;//const_cast<multiBM*> ( E )->_beta(); 
    273                 beta*= ( sum ( Eb) /sum ( beta ) ); 
     273                beta*= ( sum ( Eb ) /sum ( beta ) ); 
    274274                if ( evalll ) {last_lognc=est.lognc();} 
    275275        } 
     
    372372template<class sq_T> 
    373373class mlnorm : public mEF { 
     374protected: 
    374375        //! Internal epdf that arise by conditioning on \c rvc 
    375376        enorm<sq_T> epdf; 
     
    379380public: 
    380381        //! Constructor 
    381         mlnorm (const RV &rv, const RV &rvc ); 
     382        mlnorm ( const RV &rv, const RV &rvc ); 
    382383        //! Set \c A and \c R 
    383384        void set_parameters ( const  mat &A, const vec &mu0, const sq_T &R ); 
     
    387388//      mat samplecond (const vec &cond, vec &lik, int n ); 
    388389        //! 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 
    391399        template<class sq_M> 
    392400        friend std::ostream &operator<< ( std::ostream &os,  mlnorm<sq_M> &ml ); 
    393401}; 
    394402 
     403/*! (Approximate) Student t density with linear function of mean value 
     404*/ 
     405class mlstudent : public mlnorm<ldmat> { 
     406protected: 
     407        ldmat Lambda; 
     408        ldmat &_R; 
     409        ldmat Re; 
     410public: 
     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}; 
    395437/*! 
    396438\brief  Gamma random walk 
     
    548590double enorm<sq_T>::evalpdflog_nn ( const vec &val ) const { 
    549591        // 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; 
    551594}; 
    552595 
     
    554597inline double enorm<sq_T>::lognc () const { 
    555598        // 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; 
    557601}; 
    558602 
     
    584628//      vec smp ( dim ); 
    585629//      this->condition ( cond ); 
    586 //  
     630// 
    587631//      for ( i=0; i<n; i++ ) { 
    588632//              smp = epdf.sample(); 
     
    590634//              Smp.set_col ( i ,smp ); 
    591635//      } 
    592 //  
     636// 
    593637//      return Smp; 
    594638// } 
    595639 
    596640template<class sq_T> 
    597 void mlnorm<sq_T>::condition (const vec &cond ) { 
     641void mlnorm<sq_T>::condition ( const vec &cond ) { 
    598642        _mu = A*cond + mu_const; 
    599643//R is already assigned; 
     
    605649 
    606650        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 ); 
    608652        tmp->set_parameters ( mu ( irvn ), Rn ); 
    609653        return tmp; 
     
    627671        int end=R.rows()-1; 
    628672        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 ); 
    630674        mat S22 = S.get ( rvn.count(), end, rvn.count(), end ); 
    631675 
     
    644688 
    645689template<class sq_T> 
    646 std::ostream &operator<< ( std::ostream &os,  mlnorm<sq_T> &ml ){ 
     690std::ostream &operator<< ( std::ostream &os,  mlnorm<sq_T> &ml ) { 
    647691        os << "A:"<< ml.A<<endl; 
    648692        os << "mu:"<< ml.mu_const<<endl; 
  • bdm/stat/loggers.h

    r162 r198  
    4646 
    4747//! log this vector 
    48         virtual void logit ( int id, vec v ) =0; 
     48        virtual void logit ( int id, const vec &v ) =0; 
    4949 
    5050//! Shifts storage position for another time step. 
     
    8686        } 
    8787        void step() {if ( ind<maxlen ) ind++; else it_error ( "memlog::ind is too high;" );} 
    88         void logit ( int id, vec v ) { 
     88        void logit ( int id, const vec &v ) { 
    8989                it_assert_debug(id<vectors.length(),"Logger was not initialized, run init()."); 
    9090                vectors ( id ).set_row ( ind,v );}