Changeset 1009

Show
Ignore:
Timestamp:
05/27/10 23:07:16 (14 years ago)
Author:
smidl
Message:

changes in bayes_batch

Location:
library
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/base/bdmbase.cpp

    r979 r1009  
    575575} 
    576576 
    577 void BM::bayes_batch ( const mat &Data, const vec &cond ) { 
     577double BM::bayes_batch ( const mat &Data, const vec &cond ) { 
     578        double levid=0.0; 
    578579        for ( int t = 0; t < Data.cols(); t++ ) { 
    579580                bayes ( Data.get_col ( t ), cond ); 
    580         } 
    581 } 
    582  
    583 void BM::bayes_batch ( const mat &Data, const mat &Cond ) { 
     581                levid+=ll; 
     582        } 
     583        return levid; 
     584} 
     585 
     586double BM::bayes_batch ( const mat &Data, const mat &Cond ) { 
     587        double levid=0.0; 
    584588        for ( int t = 0; t < Data.cols(); t++ ) { 
    585589                bayes ( Data.get_col ( t ), Cond.get_col ( t ) ); 
    586590        } 
    587 } 
    588  
    589 } 
     591        return levid; 
     592} 
     593 
     594} 
  • library/bdm/base/bdmbase.h

    r989 r1009  
    12931293        @param dt vector of input data 
    12941294        */ 
    1295         virtual void bayes ( const vec &yt, const vec &cond = empty_vec ) = 0; 
     1295        virtual void bayes ( const vec &yt, const vec &cond = empty_vec ) =0; 
    12961296        //! Batch Bayes rule (columns of Dt are observations) 
    1297         virtual void bayes_batch ( const mat &Dt, const vec &cond = empty_vec ); 
     1297        virtual double bayes_batch ( const mat &Dt, const vec &cond = empty_vec ); 
    12981298        //! Batch Bayes rule (columns of Dt are observations, columns of Cond are conditions) 
    1299         virtual void bayes_batch ( const mat &Dt, const mat &Cond ); 
     1299        virtual double bayes_batch ( const mat &Dt, const mat &Cond ); 
    13001300        //! Evaluates predictive log-likelihood of the given data record 
    13011301        //! I.e. marginal likelihood of the data with the posterior integrated out. 
    13021302        //! This function evaluates only \f$ y_t \f$, condition is assumed to be the last used in bayes(). 
    13031303        //! See bdm::BM::predictor for conditional version. 
    1304         virtual double logpred ( const vec &yt ) const NOT_IMPLEMENTED(0.0); 
     1304        virtual double logpred ( const vec &yt, const vec &cond ) const NOT_IMPLEMENTED(0.0); 
    13051305 
    13061306        //! Matrix version of logpred 
    1307         vec logpred_mat ( const mat &Yt ) const { 
     1307        vec logpred_mat ( const mat &Yt, const mat &Cond ) const { 
    13081308                vec tmp ( Yt.cols() ); 
    13091309                for ( int i = 0; i < Yt.cols(); i++ ) { 
    1310                         tmp ( i ) = logpred ( Yt.get_col ( i ) ); 
     1310                        tmp ( i ) = logpred ( Yt.get_col ( i ), Cond.get_col(i) ); 
    13111311                } 
    13121312                return tmp; 
  • library/bdm/estim/arx.cpp

    r1003 r1009  
    33 
    44void ARX::bayes_weighted ( const vec &yt, const vec &cond, const double w ) { 
    5         bdm_assert_debug ( yt.length() == dimy, "ARX::bayes yt is of size "+num2str(yt.length())+" expected dimension is "+num2str(dimy) ); 
    6         bdm_assert_debug ( cond.length() == rgrlen , "ARX::bayes cond is of size "+num2str(cond.length())+" expected dimension is "+num2str(rgrlen) ); 
     5        bdm_assert_debug ( yt.length() == dimy, "BM::bayes yt is of size "+num2str(yt.length())+" expected dimension is "+num2str(dimy) ); 
     6        bdm_assert_debug ( cond.length() == rgrlen , "BM::bayes cond is of size "+num2str(cond.length())+" expected dimension is "+num2str(rgrlen) ); 
    77         
    88        BMEF::bayes_weighted(yt,cond,w); //potential discount scheduling 
     
    4646} 
    4747 
    48 double ARX::logpred ( const vec &yt ) const { 
     48double ARX::logpred ( const vec &yt, const vec &cond ) const { 
    4949        egiw pred ( est ); 
    5050        ldmat &V = pred._V(); 
     
    5454        vec dyad_p = dyad; 
    5555        dyad_p.set_subvector ( 0, yt ); 
    56  
     56        dyad_p.set_subvector(dimy,cond); 
     57         
    5758        if ( frg < 1.0 ) { 
    5859                pred.pow ( frg ); 
  • library/bdm/estim/arx.h

    r1003 r1009  
    8888                bayes_weighted ( yt, cond, 1.0 ); 
    8989        }; 
    90         double logpred ( const vec &yt ) const; 
     90        double logpred ( const vec &yt, const vec &cond ) const; 
    9191        void flatten ( const BMEF* B ); 
    9292        //! Conditioned version of the predictor 
     
    103103        //! Smarter structure estimation by Ludvik Tesar.\return indices of accepted regressors. 
    104104        ivec structure_est_LT ( const egiw &Eg0 ); 
    105         //! reduce to 
     105        //! reduce structure to the given ivec of matrix V 
    106106        void reduce_structure(ivec &inds_in_V){ 
    107107                ldmat V = posterior()._V(); 
     
    110110                ldmat newV(V,inds_in_V); 
    111111                est.set_parameters(dimy,newV, posterior()._nu()); 
     112                 
     113                if (have_constant){ 
     114                        ivec rgr_elem= find(inds_in_V<(V.rows()-1)); // < -- find non-constant  
     115                        rgr = rgr.subselect(rgr_elem); 
     116                        rgrlen = rgr_elem.length(); 
     117                } else{ 
     118                        rgr = rgr.subselect(inds_in_V); 
     119                } 
    112120                validate(); 
    113121        } 
     
    184192                 
    185193        }  
     194        //! access function 
     195        RV & _rgr() {return rgr;} 
     196        bool _have_constant() {return have_constant;} 
     197        int _rgrlen() {return rgrlen;} 
    186198}; 
    187199UIREGISTER ( ARX ); 
  • library/bdm/estim/mixtures.cpp

    r1004 r1009  
    2828        for ( i = 0; i < Coms.length(); i++ ) { 
    2929                //pick one datum 
    30                 int ind = (int) floor ( ndat * UniRNG.sample() ); 
    31                 Coms ( i )->bayes ( Data.get_col ( ind ), empty_vec ); 
     30                if (ndat==Coms.length()){ //take the ith vector 
     31                        Coms ( i )->bayes ( Data.get_col ( i ), empty_vec ); 
     32                } else { // pick at random 
     33                        int ind = (int) floor ( ndat * UniRNG.sample() ); 
     34                        Coms ( i )->bayes ( Data.get_col ( ind ), empty_vec ); 
     35                } 
    3236                //flatten back to oringinal 
    3337                Coms ( i )->flatten ( Com0 ); 
     
    3640} 
    3741 
    38 void MixEF::bayes_batch ( const mat &data , const mat &cond, const vec &wData ) { 
     42double MixEF::bayes_batch ( const mat &data , const mat &cond, const vec &wData ) { 
    3943        int ndat = data.cols(); 
    4044        int t, i, niter; 
     
    5862        int maxi; 
    5963        double maxll; 
     64         
     65        double levid=0.0; 
    6066        //Estim 
    6167        while ( !converged ) { 
     68                levid=0.0; 
    6269                // Copy components back to their initial values 
    6370                // All necessary information is now in w and Coms0. 
     
    6875                        //#pragma omp parallel for 
    6976                        for ( i = 0; i < n; i++ ) { 
    70                                 ll ( i ) = Coms ( i )->logpred ( data.get_col ( t ) ); 
     77                                ll ( i ) = Coms ( i )->logpred ( data.get_col ( t ) , empty_vec); 
    7178                                wtmp = 0.0; 
    7279                                wtmp ( i ) = 1.0; 
     
    99106                // !!!!    note  wData ==> this is extra weight of the data record 
    100107                // !!!!    For typical cases wData=1. 
     108                vec logevid(n); 
    101109                for ( t = 0; t < ndat; t++ ) { 
    102110                        //#pragma omp parallel for 
    103111                        for ( i = 0; i < n; i++ ) { 
    104112                                Coms ( i )-> bayes_weighted ( data.get_col ( t ), empty_vec, W ( i, t ) * wData ( t ) ); 
     113                                logevid(i) = Coms(i)->_ll(); 
    105114                        } 
    106115                        weights.bayes ( W.get_col ( t ) * wData ( t ) ); 
    107116                } 
    108  
     117                levid += weights._ll()+log(weights.posterior().mean() * exp(logevid)); // inner product w*exp(evid) 
     118                 
    109119                niter++; 
    110120                //TODO better convergence rule. 
     
    116126                delete Coms0 ( i ); 
    117127        } 
     128        return levid; 
    118129} 
    119130 
     
    127138 
    128139 
    129 double MixEF::logpred ( const vec &yt ) const { 
     140double MixEF::logpred ( const vec &yt, const vec &cond =empty_vec) const { 
    130141 
    131142        vec w = weights.posterior().mean(); 
    132143        double exLL = 0.0; 
    133144        for ( int i = 0; i < Coms.length(); i++ ) { 
    134                 exLL += w ( i ) * exp ( Coms ( i )->logpred ( yt ) ); 
     145                exLL += w ( i ) * exp ( Coms ( i )->logpred ( yt , cond ) ); 
    135146        } 
    136147        return log ( exLL ); 
  • library/bdm/estim/mixtures.h

    r1004 r1009  
    6363        MixEF_METHOD method; 
    6464 
     65        //! maximum number of iterations 
     66        int max_niter; 
    6567public: 
    6668        //! Full constructor 
    6769        MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) : 
    6870                        BMEF ( ), Coms ( Coms0.length() ), 
    69                         weights (), est(*this), method ( QB ) { 
     71                        weights (), est(*this), method ( QB ), max_niter(10) { 
    7072                for ( int i = 0; i < Coms0.length(); i++ ) { 
    7173                        Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy(); 
     
    7880        MixEF () : 
    7981                        BMEF ( ), Coms ( 0 ), 
    80                         weights (), est(*this), method ( QB ) { 
     82                        weights (), est(*this), method ( QB ), max_niter(10) { 
    8183        } 
    8284        //! Copy constructor 
    8385        MixEF ( const MixEF &M2 ) : BMEF ( ),  Coms ( M2.Coms.length() ), 
    84                         weights ( M2.weights ), est(*this), method ( M2.method ) { 
     86                        weights ( M2.weights ), est(*this), method ( M2.method ), max_niter(M2.max_niter) { 
    8587                for ( int i = 0; i < M2.Coms.length(); i++ ) { 
    8688                        Coms ( i ) = (BMEF*) M2.Coms ( i )->_copy(); 
     
    99101        void bayes ( const mat &yt, const vec &cond ); 
    100102        //! batch weighted Bayes rule 
    101         void bayes_batch ( const mat &yt, const mat &cond, const vec &wData ); 
    102         double logpred ( const vec &yt ) const; 
     103        double bayes_batch ( const mat &yt, const mat &cond, const vec &wData ); 
     104        double logpred ( const vec &yt, const vec &cond ) const; 
    103105        //! return correctly typed posterior (covariant return) 
    104106        const eprod_mix& posterior() const { 
  • library/bdm/stat/merger.cpp

    r957 r1009  
    258258                        sprintf ( dbg_str, "pdf%d", niter ); 
    259259                        for ( int i = 0; i < Npoints; i++ ) { 
    260                                 Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) ); 
     260                                Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ), empty_vec ); 
    261261                        } 
    262262                        *dbg_file << Name ( dbg_str ) << Mix_pdf; 
  • library/bdm/stat/merger.h

    r957 r1009  
    233233                vec dtf = ones ( yt.length() + 1 ); 
    234234                dtf.set_subvector ( 0, yt ); 
    235                 return Mix.logpred ( dtf ); 
     235                return Mix.logpred ( dtf, vec(0) ); 
    236236        } 
    237237        //!@} 
  • library/tests/stresssuite/arx_elem_stress.cpp

    r722 r1009  
    4141        mlstudent* Ap = Ar.predictor_student(); 
    4242        vec Ap_x = Ap->evallogcond_mat ( X, empty_vec ); 
    43         vec ll_x = Ar.logpred_mat ( X2 ); 
     43        vec ll_x = Ar.logpred_mat ( X2 , empty_vec); 
    4444 
    4545        cout << "normalize : " << xstep*sum ( exp ( Ap_x ) ) << endl; 
  • library/tests/stresssuite/mixtures_stress.cpp

    r886 r1009  
    3535                for ( double y = yb ( 0 ); y <= yb ( 1 ); y += ystep, j++ ) { 
    3636                        rgr ( 1 ) = y; 
    37                         PPdf ( i, j ) = exp ( M.logpred ( rgr ) ); 
     37                        PPdf ( i, j ) = exp ( M.logpred ( rgr, empty_vec ) ); 
    3838                } 
    3939        }