root/bdm/estim/mixef.cpp @ 195

Revision 195, 3.1 kB (checked in by smidl, 16 years ago)

prvni nastrel dopravy

Line 
1#include "mixef.h"
2#include <vector>
3
4using namespace itpp;
5
6
7void MixEF::init ( BMEF* Com0, const mat &Data, int c ) {
8        //prepare sizes
9        Coms.set_size ( c );
10        n=c;
11        weights.set_parameters ( ones ( c ) ); //assume at least one observation in each comp.
12        //est will be done at the end
13        //
14        int i;
15        int ndat = Data.cols();
16        //Estimate  Com0 from all data
17        Coms ( 0 ) = ( BMEF* ) Com0->_copy_();
18//      Coms(0)->set_evalll(false);
19        Coms ( 0 )->bayesB ( Data );
20        // Flatten it to its original shape
21        Coms ( 0 )->flatten ( Com0 );
22
23        //Copy it to the rest
24        for ( i=1;i<n;i++ ) {
25                //copy Com0 and create new rvs for them
26                Coms ( i ) = ( BMEF* ) Coms ( 0 )->_copy_ ( true );
27        }
28        //Pick some data for each component and update it
29        for ( i=0;i<n;i++ ) {
30                //pick one datum
31                int ind=floor(ndat*UniRNG.sample());
32                Coms ( i )->bayes ( Data.get_col ( ind ),1.0 );
33        }
34
35        //est already exists - must be deleted before build_est() can be used
36        delete est;
37        build_est();
38
39}
40
41void MixEF::bayesB ( const mat &data , const vec &wData ) {
42        int ndat=data.cols();
43        int t,i,niter;
44        bool converged=false;
45
46        multiBM weights0 ( weights );
47
48        Array<BMEF*> Coms0 ( n );
49        for ( i=0;i<n;i++ ) {Coms0 ( i ) = ( BMEF* ) Coms ( i )->_copy_();}
50
51        niter=0;
52        mat W=ones ( n,ndat ) / n;
53        mat Wlast=ones ( n,ndat ) / n;
54        vec w ( n );
55        vec ll ( n );
56        // tmp for weights
57        vec wtmp = zeros ( n );
58        int maxi;
59        double maxll;
60        //Estim
61        while ( !converged ) {
62                // Copy components back to their initial values
63                // All necessary information is now in w and Coms0.
64                Wlast = W;
65                //
66                for ( t=0;t<ndat;t++ ) {
67                        for ( i=0;i<n;i++ ) {
68                                ll ( i ) =Coms ( i )->logpred ( data.get_col ( t ) );
69                                wtmp =0.0; wtmp ( i ) =1.0;
70                                ll ( i ) += weights.logpred ( wtmp );
71                        }
72                       
73                        maxll = max(ll,maxi);
74                        switch (method) {
75                                case QB:
76                                        w = exp ( ll-maxll );
77                                        w/=sum(w);
78                                        break;
79                                case EM:
80                                        w = 0.0;
81                                        w(maxi) = 1.0;
82                                        break;
83                        }
84                       
85                        W.set_col ( t, w );
86                }
87
88                // copy initial statistics
89                for ( i=0;i<n;i++ ) {
90                        Coms ( i )-> set_statistics ( Coms0 ( i ) );
91                }
92                weights.set_statistics ( &weights0 );
93
94                // Update statistics
95                // !!!!    note  wData ==> this is extra weight of the data record
96                // !!!!    For typical cases wData=1.
97                for ( t=0;t<ndat;t++ ) {
98                        for ( i=0;i<n;i++ ) {
99                                Coms ( i )-> bayes ( data.get_col ( t ),W ( i,t ) * wData ( t ) );
100                        }
101                        weights.bayes ( W.get_col ( t ) * wData ( t ) );
102                }
103
104                niter++;
105                //TODO better convergence rule.
106                converged = ( sumsum ( abs ( W-Wlast ) ) /n<0.001 );
107        }
108
109        //Clean Coms0
110        for ( i=0;i<n;i++ ) {delete Coms0 ( i );}
111}
112
113void MixEF::bayes ( const vec &data ) {
114
115};
116
117void MixEF::bayes ( const mat &data ) {
118        this->bayesB ( data, ones ( data.cols() ) );
119};
120
121
122double MixEF::logpred ( const vec &dt ) const {
123
124        vec w=weights._epdf().mean();
125        double exLL=0.0;
126        for ( int i=0;i<n;i++ ) {
127                exLL+=w ( i ) *exp ( Coms ( i )->logpred ( dt ) );
128        }
129        return log ( exLL );
130}
131
132emix* MixEF::predictor ( const RV &rv ) {
133        Array<epdf*> pC ( n );
134        for ( int i=0;i<n;i++ ) {pC ( i ) =Coms ( i )->predictor ( rv );}
135        emix* tmp;
136        tmp = new emix ( rv );
137        tmp->set_parameters ( weights._epdf().mean(), pC, false );
138        tmp->ownComs();
139        return tmp;
140}
Note: See TracBrowser for help on using the browser.