Changeset 477 for library/bdm/estim/mixtures.cpp
- Timestamp:
- 08/05/09 14:40:03 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/mixtures.cpp
r389 r477 2 2 #include "mixtures.h" 3 3 4 namespace bdm {4 namespace bdm { 5 5 6 6 … … 8 8 //prepare sizes 9 9 Coms.set_size ( c ); 10 n =c;10 n = c; 11 11 weights.set_parameters ( ones ( c ) ); //assume at least one observation in each comp. 12 12 //est will be done at the end … … 22 22 23 23 //Copy it to the rest 24 for ( i =1;i<n;i++ ) {24 for ( i = 1; i < n; i++ ) { 25 25 //copy Com0 and create new rvs for them 26 26 Coms ( i ) = Coms ( 0 )->_copy_ ( ); 27 27 } 28 28 //Pick some data for each component and update it 29 for ( i =0;i<n;i++ ) {29 for ( i = 0; i < n; i++ ) { 30 30 //pick one datum 31 int ind =floor(ndat*UniRNG.sample());32 Coms ( i )->bayes ( Data.get_col ( ind ), 1.0 );31 int ind = floor ( ndat * UniRNG.sample() ); 32 Coms ( i )->bayes ( Data.get_col ( ind ), 1.0 ); 33 33 //flatten back to oringinal 34 Coms (i)->flatten(Com0);34 Coms ( i )->flatten ( Com0 ); 35 35 } 36 36 … … 42 42 43 43 void MixEF::bayesB ( const mat &data , const vec &wData ) { 44 int ndat =data.cols();45 int t, i,niter;46 bool converged =false;44 int ndat = data.cols(); 45 int t, i, niter; 46 bool converged = false; 47 47 48 48 multiBM weights0 ( weights ); 49 49 50 50 Array<BMEF*> Coms0 ( n ); 51 for ( i=0;i<n;i++ ) {Coms0 ( i ) = ( BMEF* ) Coms ( i )->_copy_();} 51 for ( i = 0; i < n; i++ ) { 52 Coms0 ( i ) = ( BMEF* ) Coms ( i )->_copy_(); 53 } 52 54 53 niter =0;54 mat W =ones ( n,ndat ) / n;55 mat Wlast =ones ( n,ndat ) / n;55 niter = 0; 56 mat W = ones ( n, ndat ) / n; 57 mat Wlast = ones ( n, ndat ) / n; 56 58 vec w ( n ); 57 59 vec ll ( n ); … … 67 69 // 68 70 //#pragma omp parallel for 69 for ( t =0;t<ndat;t++ ) {71 for ( t = 0; t < ndat; t++ ) { 70 72 //#pragma omp parallel for 71 for ( i=0;i<n;i++ ) { 72 ll ( i ) =Coms ( i )->logpred ( data.get_col ( t ) ); 73 wtmp =0.0; wtmp ( i ) =1.0; 73 for ( i = 0; i < n; i++ ) { 74 ll ( i ) = Coms ( i )->logpred ( data.get_col ( t ) ); 75 wtmp = 0.0; 76 wtmp ( i ) = 1.0; 74 77 ll ( i ) += weights.logpred ( wtmp ); 75 78 } 76 77 maxll = max (ll,maxi);78 switch ( method) {79 80 w = exp ( ll-maxll );81 w/=sum(w);82 83 84 85 w(maxi) = 1.0;86 79 80 maxll = max ( ll, maxi ); 81 switch ( method ) { 82 case QB: 83 w = exp ( ll - maxll ); 84 w /= sum ( w ); 85 break; 86 case EM: 87 w = 0.0; 88 w ( maxi ) = 1.0; 89 break; 87 90 } 88 91 89 92 W.set_col ( t, w ); 90 93 } … … 92 95 // copy initial statistics 93 96 //#pragma omp parallel for 94 for ( i =0;i<n;i++ ) {97 for ( i = 0; i < n; i++ ) { 95 98 Coms ( i )-> set_statistics ( Coms0 ( i ) ); 96 99 } … … 100 103 // !!!! note wData ==> this is extra weight of the data record 101 104 // !!!! For typical cases wData=1. 102 for ( t =0;t<ndat;t++ ) {105 for ( t = 0; t < ndat; t++ ) { 103 106 //#pragma omp parallel for 104 for ( i =0;i<n;i++ ) {105 Coms ( i )-> bayes ( data.get_col ( t ), W ( i,t ) * wData ( t ) );107 for ( i = 0; i < n; i++ ) { 108 Coms ( i )-> bayes ( data.get_col ( t ), W ( i, t ) * wData ( t ) ); 106 109 } 107 110 weights.bayes ( W.get_col ( t ) * wData ( t ) ); … … 110 113 niter++; 111 114 //TODO better convergence rule. 112 converged = ( niter>10);//( sumsum ( abs ( W-Wlast ) ) /n<0.1 );115 converged = ( niter > 10 );//( sumsum ( abs ( W-Wlast ) ) /n<0.1 ); 113 116 } 114 117 115 118 //Clean Coms0 116 for ( i=0;i<n;i++ ) {delete Coms0 ( i );} 119 for ( i = 0; i < n; i++ ) { 120 delete Coms0 ( i ); 121 } 117 122 } 118 123 … … 128 133 double MixEF::logpred ( const vec &dt ) const { 129 134 130 vec w =weights.posterior().mean();131 double exLL =0.0;132 for ( int i =0;i<n;i++ ) {133 exLL +=w ( i ) *exp ( Coms ( i )->logpred ( dt ) );135 vec w = weights.posterior().mean(); 136 double exLL = 0.0; 137 for ( int i = 0; i < n; i++ ) { 138 exLL += w ( i ) * exp ( Coms ( i )->logpred ( dt ) ); 134 139 } 135 140 return log ( exLL ); 136 141 } 137 142 138 emix* MixEF::epredictor ( 143 emix* MixEF::epredictor ( ) const { 139 144 Array<epdf*> pC ( n ); 140 for ( int i=0;i<n;i++ ) {pC ( i ) =Coms ( i )->epredictor ( );} 145 for ( int i = 0; i < n; i++ ) { 146 pC ( i ) = Coms ( i )->epredictor ( ); 147 } 141 148 emix* tmp; 142 tmp = new emix( 149 tmp = new emix( ); 143 150 tmp->set_parameters ( weights.posterior().mean(), pC, false ); 144 151 tmp->ownComs(); … … 146 153 } 147 154 148 void MixEF::flatten (const BMEF* M2){149 const MixEF* Mix2 =dynamic_cast<const MixEF*>(M2);150 it_assert_debug (Mix2->n==n,"Different no of coms");155 void MixEF::flatten ( const BMEF* M2 ) { 156 const MixEF* Mix2 = dynamic_cast<const MixEF*> ( M2 ); 157 it_assert_debug ( Mix2->n == n, "Different no of coms" ); 151 158 //Flatten each component 152 for ( int i=0; i<n;i++){153 Coms (i)->flatten(Mix2->Coms(i));159 for ( int i = 0; i < n; i++ ) { 160 Coms ( i )->flatten ( Mix2->Coms ( i ) ); 154 161 } 155 162 //Flatten weights = make them equal!! 156 weights.set_statistics (&(Mix2->weights));163 weights.set_statistics ( & ( Mix2->weights ) ); 157 164 } 158 165 }