Changeset 964

Show
Ignore:
Timestamp:
05/21/10 00:44:04 (14 years ago)
Author:
smidl
Message:

Corrections in ARX and PF

Files:
8 modified

Legend:

Unmodified
Added
Removed
  • applications/bdmtoolbox/tutorial/userguide/arx_basic_example.m

    r934 r964  
    1010 
    1111A1.class = 'ARX'; 
    12 A1.rv = y; 
     12A1.yrv = y; 
    1313A1.rgr = RVtimes([y,u],[-3,-1]) ; % correct structure is {y,y} 
    1414A1.log_level = 'logbounds,logevidence'; 
  • applications/bdmtoolbox/tutorial/userguide/frg_estim.m

    r951 r964  
    1010 
    1111A1.class = 'ARXfrg'; 
    12 A1.rv = y; 
     12A1.yrv = y; 
     13A1.rv = RV({'theta','r'},[3,1]); 
    1314A1.rgr = RVtimes([y,u],[-3,-1]) ;  
    1415A1.log_level = 'logbounds'; 
     
    2021phi_pdf.class = 'mDirich';         % random walk on coefficient phi 
    2122phi_pdf.rv    = RV({'phi','1_phi'});       % 2D random walk - frg is the first element 
    22 phi_pdf.k     = 0.01;              % width of the random walk 
     23phi_pdf.k     = 0.001;              % width of the random walk 
    2324phi_pdf.betac = [0.1 0.1];         % stabilizing elememnt of random walk 
    2425 
     
    3233E.class = 'PF'; 
    3334E.particle = p;                    % ARX is the analytical part 
    34 E.res_threshold = 0.90;             % resampling parameter 
    35 E.n = 100;                          % number of particles 
     35E.res_threshold = 0.0;             % resampling parameter 
     36E.n = 10;                          % number of particles 
    3637E.prior.class = 'eDirich';         % prior on non-linear part 
    3738E.prior.beta  = [2 1]; %  
    38 E.log_level = 'logbounds,logweights,logmeans'; 
     39E.log_level = 'logbounds,logweights,logmeans,logvars'; 
    3940E.name = 'MPF'; 
    4041 
    41 [M,Str]=estimator(DS,{E}); 
     42A2=A1; 
     43A2.class='ARX'; 
     44A2.frg=1.0; 
     45A2.name = 'MPFx'; 
     46 
     47[M,Str]=estimator(DS,{E,A2}); 
    4248 
    4349%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  • library/bdm/estim/arx.cpp

    r896 r964  
    44void ARX::bayes_weighted ( const vec &yt, const vec &cond, const double w ) { 
    55 
    6         bdm_assert_debug ( yt.length() >= dimy, "ARX::bayes yt is smaller then dimc" ); 
    7         bdm_assert_debug ( cond.length() >= dimc, "ARX::bayes cond is smaller then dimc" ); 
     6        bdm_assert_debug ( yt.length() == dimy, "ARX::bayes yt is smaller then dimensiony()" ); 
     7        bdm_assert_debug ( (cond.length() == rgrlen - int(have_constant==true)) , "ARX::bayes dimension of cond is not rgrlen" ); 
    88        double lnc; 
    99        //cache 
     
    217217        BMEF::from_setting(set); 
    218218         
    219         shared_ptr<RV> yrv_ = UI::build<RV> ( set, "rv", UI::compulsory ); 
    220         shared_ptr<RV> rrv = UI::build<RV> ( set, "rgr", UI::compulsory ); 
    221         dimy = yrv_->_dsize(); 
     219        RV rrv;  
     220        UI::get (rrv, set, "rgr", UI::compulsory ); 
     221         
     222        dimy = yrv._dsize(); 
     223        bdm_assert(dimy>0,"ARX::yrv should not be empty"); 
    222224        // rgrlen - including constant!!! 
    223         dimc = rrv->_dsize(); 
    224  
    225         yrv = *yrv_; 
    226         rvc = *rrv; 
     225        rgrlen = rrv._dsize(); 
    227226 
    228227        int constant; 
     
    232231                have_constant = constant > 0; 
    233232        } 
    234         int rgrlen = dimc + int ( have_constant == true ); 
     233        dimc = rgrlen; 
     234        rvc = rrv; 
     235        rgrlen += int ( have_constant == true ); 
    235236 
    236237        //init 
     
    259260        // frg handled by BMEF 
    260261 
    261         //name results (for logging) 
    262         shared_ptr<RV> rv_par = UI::build<RV> ( set, "rv_param", UI::optional ); 
    263         if ( !rv_par ) { 
    264                 est.set_rv ( RV ( "{theta r }", vec_2 ( dimy*rgrlen, dimy*dimy ) ) ); 
    265         } else { 
    266                 est.set_rv ( *rv_par ); 
    267         }        
    268 } 
    269  
    270 } 
    271  
     262} 
     263 
     264} 
     265 
  • library/bdm/estim/arx.h

    r896 r964  
    4747        //! vector of dyadic update 
    4848        vec dyad; 
     49        //! length of the regressor 
     50        int rgrlen; 
    4951        //! posterior density 
    5052        egiw est; 
     
    5456        //! \name Constructors 
    5557        //!@{ 
    56         ARX ( const double frg0 = 1.0 ) : BMEF ( frg0 ),  have_constant ( true ), dyad(), est(), alter_est() {}; 
    57         ARX ( const ARX &A0 ) : BMEF ( A0 ),  have_constant ( A0.have_constant ), dyad ( A0.dyad ), est ( A0.est ), alter_est ( A0.alter_est ) { }; 
     58        ARX ( const double frg0 = 1.0 ) : BMEF ( frg0 ),  have_constant ( true ), dyad(), rgrlen(),est(), alter_est() {}; 
     59        ARX ( const ARX &A0 ) : BMEF ( A0 ),  have_constant ( A0.have_constant ), dyad ( A0.dyad ),rgrlen(A0.rgrlen), est ( A0.est ), alter_est ( A0.alter_est ) { }; 
    5860 
    5961        ARX* _copy() const; 
     
    115117        \code 
    116118        class = 'ARX'; 
    117         rv    = RV({names_of_dt} )                 // description of output variables 
     119        yrv   = RV({names_of_dt} )                 // description of output variables 
    118120        rgr   = RV({names_of_regressors}, [-1,-2]} // description of regressor variables 
    119121        constant = 1;                              // 0/1 switch if the constant term is modelled or not 
     
    125127        frg = 1.0;                                 // forgetting, default frg=1.0 
    126128 
    127         rv_param   = RV({names_of_parameters}}     // description of parametetr names 
    128                                                                                            // default: ["theta_i" and "r_i"] 
     129        rv  = RV({names_of_parameters}}            // description of parametetr names 
     130                                                                                           // default: [""] 
    129131        \endcode 
    130132        */ 
     
    133135        void validate() { 
    134136                BMEF::validate();        
    135  
     137                est.validate(); 
    136138                //if dimc not set set it from V 
    137139                if ( dimc == 0 ) { 
     
    192194 
    193195        void bayes ( const vec &val, const vec &cond ) { 
    194                 frg = cond ( dimc - 1 ); //  last in cond is phi 
    195                 ARX::bayes ( val, cond ); 
     196                int arx_cond_size=rgrlen -int(have_constant==true); 
     197                bdm_assert_debug(cond.size()>arx_cond_size, "ARXfrg: Insufficient conditioning, frg not given."); 
     198                frg = cond ( arx_cond_size ); // the first part after rgrlen 
     199                ARX::bayes ( val, cond.left(arx_cond_size) ); 
    196200        } 
    197201        void validate() { 
  • library/bdm/estim/kalman.h

    r963 r964  
    147147                R     = [];                   // Matrix R 
    148148                prior = struct('class','epdf_offspring');    // Prior density - will be converted to gaussian 
    149                 rvy   = RV('some_names');     // Description of required observations 
     149                yrv   = RV('some_names');     // Description of required observations 
    150150                rvc   = RV('some_names');     // Description of required inputs 
    151151                \endcode 
  • library/bdm/estim/particles.h

    r951 r964  
    323323                //set drv 
    324324 
    325                 set_yrv ( bm0->_rv() ); 
    326325                rvc = bm0->_rvc(); 
     326                dimc = bm0->dimensionc(); 
    327327                BM::set_rv(bm0->_rv()); 
    328328                yrv=bm0->_yrv(); 
     329                dimy = bm0->dimensiony(); 
    329330        } 
    330331         
     
    339340                        } 
    340341                } 
     342                if (log_level[logvars]){ 
     343                        for (int i=0; i<particles.length(); i++){ 
     344                                L.add_vector( log_level, logvars, RV ( particles(i)->dimension() ), prefix , i); 
     345                        } 
     346                } 
    341347        }; 
    342348        void log_write ( ) const { 
     
    347353                if (log_level[logmeans]){ 
    348354                        for (int i=0; i<particles.length(); i++){ 
    349                                  log_level.store( logmeans, particles(i)->posterior().mean(), i); 
     355                                log_level.store( logmeans, particles(i)->posterior().mean(), i); 
     356                        } 
     357                } 
     358                if (log_level[logvars]){ 
     359                        for (int i=0; i<particles.length(); i++){ 
     360                                log_level.store( logvars, particles(i)->posterior().variance(), i); 
    350361                        } 
    351362                } 
  • library/bdm/stat/emix.cpp

    r956 r964  
    5353        //non-central moment 
    5454        vec mom2 = zeros ( dim ); 
     55        vec mom1 = zeros ( dim ); 
     56         
    5557        for ( int i = 0; i < w.length(); i++ ) { 
    56                 mom2 += w ( i ) * ( component( i )->variance() + pow ( component ( i )->mean(), 2 ) ); 
     58                vec vi=component( i )->variance(); 
     59                vec mi=component ( i )->mean(); 
     60                mom2 += w ( i ) * ( vi + pow ( mi, 2 ) ); 
     61                mom1 += w(i) * mi; 
    5762        } 
    5863        //central moment 
    59         return mom2 - pow ( mean(), 2 ); 
     64        return mom2 - pow ( mom1, 2 ); 
    6065} 
    6166 
  • library/bdm/stat/exp_family.h

    r958 r964  
    449449        */ 
    450450        void from_setting ( const Setting &set ); 
     451        //! see egiw::from_setting 
    451452        void to_setting ( Setting& set ) const; 
    452453        void validate();