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

changes in bayes_batch

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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 );