Changeset 665 for library/bdm/estim
- Timestamp:
- 10/19/09 22:24:45 (15 years ago)
- Location:
- library/bdm/estim
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/arx.cpp
r639 r665 6 6 7 7 if ( frg < 1.0 ) { 8 est.pow ( frg ); 8 est.pow ( frg ); // multiply V and nu 9 9 10 10 //stabilize 11 ldmat V0(eye(V.rows())); 12 V0*=(1-frg)*1e-3; 11 ldmat V0=alter_est._V(); //$ copy 12 double &nu0=alter_est._nu(); 13 V0*=(1-frg); 13 14 V += V0; //stabilization 14 nu +=(1-frg)* (0.1 + V.rows() + 1* dimx + 2);15 16 // recompute loglikelihood of "prior"15 nu +=(1-frg)*nu0; 16 17 // recompute loglikelihood of new "prior" 17 18 if ( evalll ) { 18 19 last_lognc = est.lognc(); … … 219 220 int rgrlen = rrv->_dsize(); 220 221 222 dimx = ylen; 221 223 set_rv ( *yrv, *rrv ); 222 224 … … 234 236 235 237 //init 236 mat V0; 237 vec dV0; 238 if (!UI::get(V0, set, "V0",UI::optional)){ 239 if ( !UI::get ( dV0, set, "dV0" ) ) 240 dV0 = concat ( 1e-3 * ones ( ylen ), 1e-5 * ones ( rgrlen ) ); 241 V0 = diag ( dV0 ); 242 } 243 double nu0; 244 if ( !UI::get ( nu0, set, "nu0" ) ) 245 nu0 = rgrlen + ylen + 2; 238 shared_ptr<egiw> pri=UI::build<egiw>(set, "prior", UI::optional); 239 if (pri) { 240 bdm_assert(pri->_dimx()==ylen,"prior is not compatible"); 241 bdm_assert(pri->_V().rows()==ylen+rgrlen,"prior is not compatible"); 242 est.set_parameters( pri->_dimx(),pri->_V(), pri->_nu()); 243 }else{ 244 est.set_parameters( ylen, zeros(ylen+rgrlen)); 245 set_prior_default(est); 246 } 247 248 shared_ptr<egiw> alt=UI::build<egiw>(set, "alternative", UI::optional); 249 if (alt) { 250 bdm_assert(alt->_dimx()==ylen,"alternative is not compatible"); 251 bdm_assert(alt->_V().rows()==ylen+rgrlen,"alternative is not compatible"); 252 alter_est.set_parameters( alt->_dimx(),alt->_V(), alt->_nu()); 253 } else { 254 alter_est = est; 255 } 246 256 247 257 double frg; … … 250 260 251 261 set_parameters ( frg ); 252 set_statistics ( ylen, V0, nu0 );253 262 254 263 //name results (for logging) -
library/bdm/estim/arx.h
r660 r665 162 162 163 163 --- optional --- 164 V0 = [1 0;0 1]; // Initial value of information matrix V 165 --- OR --- 166 dV0 = [1e-3, 1e-5, 1e-5, 1e-5]; // Initial value of diagonal of information matrix V 167 // default: 1e-3 for rv, 1e-5 for rgr 168 nu0 = 6; // initial value of nu, default: rgrlen + 2 164 prior = {class='egiw',...}; // Prior density, when given default is used instead 165 alternative = {class='egiw',...}; // Alternative density in stabilized estimation, when not given prior is used 166 169 167 frg = 1.0; // forgetting, default frg=1.0 170 168 … … 178 176 bdm_assert(dimx == _yrv._dsize(), "RVs of parameters and regressor do not match"); 179 177 178 } 179 //! function sets prior and alternative density 180 void set_prior(const RV &drv, egiw &prior){ 181 //TODO check ranges in RV and build prior 182 }; 183 //! build default prior and alternative when all values are set 184 void set_prior_default(egiw &prior){ 185 //assume 186 vec dV0(prior._V().rows()); 187 dV0.set_subvector(0,prior._dimx()-1, 1.0); 188 dV0.set_subvector(prior._dimx(),dV0.length()-1, 1e-5); 189 190 prior.set_parameters(prior._dimx(),ldmat(dV0)); 180 191 } 181 192 }; -
library/bdm/estim/particles.cpp
r663 r665 5 5 using std::endl; 6 6 7 void PF::bayes_gensmp(){ 8 #pragma parallel for 9 for (int i = 0; i < n; i++ ) { 10 _samples ( i ) = par->samplecond ( _samples ( i ) ); 11 lls(i) = 0; 7 void PF::bayes_gensmp(const vec &ut){ 8 if (ut.length()>0){ 9 vec cond(par->dimensionc()); 10 cond.set_subvector(par->dimension(),ut); 11 #pragma parallel for 12 for (int i = 0; i < n; i++ ) { 13 cond.set_subvector(0,_samples ( i )); 14 _samples ( i ) = par->samplecond ( cond ); 15 lls(i) = 0; 16 } 17 } else { 18 #pragma parallel for 19 for (int i = 0; i < n; i++ ) { 20 _samples ( i ) = par->samplecond ( _samples ( i ) ); 21 lls(i) = 0; 22 } 12 23 } 13 24 } … … 28 39 } 29 40 sw = sum(_w); 30 if (!std::isfinite(sw) ) {41 if (!std::isfinite(sw) || sw==0.0) { 31 42 bdm_error("Particle filter is lost; no particle is good enough."); 32 43 } … … 36 47 37 48 void PF::bayes ( const vec &dt ) { 49 vec yt=dt.left(obs->dimension()); 50 vec ut=dt.get(obs->dimension(),dt.length()-1); 51 38 52 int i; 39 53 // generate samples - time step 40 bayes_gensmp( );54 bayes_gensmp(ut); 41 55 // weight them - data step 42 56 for ( i = 0; i < n; i++ ) { 43 lls ( i ) += obs->evallogcond ( dt, _samples ( i ) ); //+= because lls may have something from gensmp!57 lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp! 44 58 } 45 59 … … 61 75 62 76 void MPF::bayes ( const vec &dt ) { 63 // follows PF::bayes in most places!!! 64 77 // follows PF::bayes in most places!!! 65 78 int i; 66 79 int n=pf->__w().length(); … … 68 81 69 82 // generate samples - time step 70 pf->bayes_gensmp( );83 pf->bayes_gensmp(vec(0)); 71 84 // weight them - data step 72 85 #pragma parallel for -
library/bdm/estim/particles.h
r660 r665 93 93 } 94 94 //! bayes I - generate samples and add their weights to lls 95 virtual void bayes_gensmp( );95 virtual void bayes_gensmp(const vec &ut); 96 96 //! bayes II - compute weights of the 97 97 virtual void bayes_weights(); … … 124 124 */ 125 125 void from_setting(const Setting &set){ 126 BM::from_setting(set); 126 127 par = UI::build<mpdf>(set,"parameter_pdf",UI::compulsory); 127 128 obs = UI::build<mpdf>(set,"observation_pdf",UI::compulsory); … … 137 138 138 139 u.add(obs_u); // join both u, and check if they do not overlap 139 140 140 141 set_drv(concat(obs->_rv(),u) ); 141 142 } … … 163 164 res_threshold=0.5; 164 165 } 166 validate(); 165 167 } 166 168 //! load prior information from set and set internal structures accordingly … … 172 174 est=*test_emp; 173 175 } else { 174 int n;176 //int n; 175 177 if (!UI::get(n,set,"n",UI::optional)){n=10;} 176 178 // sample from prior 177 179 set_statistics(ones(n)/n, *pri); 178 180 } 181 n = est._w().length(); 179 182 //validate(); 180 183 }