Changeset 1009 for library/bdm/estim/mixtures.cpp
- Timestamp:
- 05/27/10 23:07:16 (14 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/mixtures.cpp
r1004 r1009 28 28 for ( i = 0; i < Coms.length(); i++ ) { 29 29 //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 } 32 36 //flatten back to oringinal 33 37 Coms ( i )->flatten ( Com0 ); … … 36 40 } 37 41 38 voidMixEF::bayes_batch ( const mat &data , const mat &cond, const vec &wData ) {42 double MixEF::bayes_batch ( const mat &data , const mat &cond, const vec &wData ) { 39 43 int ndat = data.cols(); 40 44 int t, i, niter; … … 58 62 int maxi; 59 63 double maxll; 64 65 double levid=0.0; 60 66 //Estim 61 67 while ( !converged ) { 68 levid=0.0; 62 69 // Copy components back to their initial values 63 70 // All necessary information is now in w and Coms0. … … 68 75 //#pragma omp parallel for 69 76 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); 71 78 wtmp = 0.0; 72 79 wtmp ( i ) = 1.0; … … 99 106 // !!!! note wData ==> this is extra weight of the data record 100 107 // !!!! For typical cases wData=1. 108 vec logevid(n); 101 109 for ( t = 0; t < ndat; t++ ) { 102 110 //#pragma omp parallel for 103 111 for ( i = 0; i < n; i++ ) { 104 112 Coms ( i )-> bayes_weighted ( data.get_col ( t ), empty_vec, W ( i, t ) * wData ( t ) ); 113 logevid(i) = Coms(i)->_ll(); 105 114 } 106 115 weights.bayes ( W.get_col ( t ) * wData ( t ) ); 107 116 } 108 117 levid += weights._ll()+log(weights.posterior().mean() * exp(logevid)); // inner product w*exp(evid) 118 109 119 niter++; 110 120 //TODO better convergence rule. … … 116 126 delete Coms0 ( i ); 117 127 } 128 return levid; 118 129 } 119 130 … … 127 138 128 139 129 double MixEF::logpred ( const vec &yt 140 double MixEF::logpred ( const vec &yt, const vec &cond =empty_vec) const { 130 141 131 142 vec w = weights.posterior().mean(); 132 143 double exLL = 0.0; 133 144 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 ) ); 135 146 } 136 147 return log ( exLL );