root/library/bdm/estim/arx.cpp @ 412

Revision 412, 5.5 kB (checked in by smidl, 15 years ago)

arx example for estimator workig

  • Property svn:eol-style set to native
Line 
1#include "arx.h"
2
3namespace bdm {
4
5void ARX::bayes ( const vec &dt, const double w ) {
6        double lnc;
7
8        if ( frg<1.0 ) {
9                est.pow ( frg );
10                if ( evalll ) {
11                        last_lognc = est.lognc();
12                }
13        }
14        V.opupdt ( dt,w );
15        nu+=w;
16
17        // log(sqrt(2*pi)) = 0.91893853320467
18        if ( evalll ) {
19                lnc = est.lognc();
20                ll = lnc - last_lognc - 0.91893853320467;
21                last_lognc = lnc;
22        }
23}
24
25double ARX::logpred ( const vec &dt ) const {
26        egiw pred ( est );
27        ldmat &V=pred._V();
28        double &nu=pred._nu();
29
30        double lll;
31
32        if ( frg<1.0 ) {
33                pred.pow ( frg );
34                lll = pred.lognc();
35        }
36        else//should be save: last_lognc is changed only by bayes;
37                if ( evalll ) {lll=last_lognc;}
38                else{lll=pred.lognc();}
39
40        V.opupdt ( dt,1.0 );
41        nu+=1.0;
42        // log(sqrt(2*pi)) = 0.91893853320467
43        return pred.lognc()-lll - 0.91893853320467;
44}
45
46ARX* ARX::_copy_ ( ) const {
47        ARX* Tmp=new ARX ( *this );
48        return Tmp;
49}
50
51void ARX::set_statistics ( const BMEF* B0 ) {
52        const ARX* A0=dynamic_cast<const ARX*> ( B0 );
53
54        it_assert_debug ( V.rows() ==A0->V.rows(),"ARX::set_statistics Statistics  differ" );
55        set_statistics ( A0->dimx, A0->V, A0->nu );
56}
57
58enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const {
59        int dim=dimx;//est.dimension();
60        mat mu ( dim, V.rows()-dim );
61        mat R ( dim,dim );
62
63        enorm<ldmat>* tmp;
64        tmp=new enorm<ldmat> ( );
65        //TODO: too hackish
66        if ( drv._dsize() >0 ) {
67        }
68
69        est.mean_mat ( mu,R ); //mu =
70        //correction for student-t  -- TODO check if correct!!
71        //R*=nu/(nu-2);
72        mat p_mu=mu.T() *rgr;   //the result is one column
73        tmp->set_parameters ( p_mu.get_col ( 0 ),ldmat ( R ) );
74        return tmp;
75}
76
77mlnorm<ldmat>* ARX::predictor ( ) const {
78        int dim=est.dimension();
79        int dif=V.rows() - dim ;///<----------- TODO
80        it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" );
81
82        mat mu ( dim, V.rows()-dim );
83        mat R ( dim,dim );
84        mlnorm<ldmat>* tmp;
85        tmp=new mlnorm<ldmat> ( );
86
87        est.mean_mat ( mu,R ); //mu =
88        mu = mu.T();
89        //correction for student-t  -- TODO check if correct!!
90
91        if ( dif==0 ) { // no constant term
92                tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) );
93        }
94        else {
95                //Assume the constant term is the last one:
96                tmp->set_parameters ( mu.get_cols ( 0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ) );
97        }
98        return tmp;
99}
100
101mlstudent* ARX::predictor_student ( ) const {
102        int dim = est.dimension();
103        int dif=V.rows() - est.dimension();//-------------TODO
104        it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" );
105
106        mat mu ( dim, V.rows()-dim );
107        mat R ( dim,dim );
108        mlstudent* tmp;
109        tmp=new mlstudent ( );
110
111        est.mean_mat ( mu,R ); //
112        mu = mu.T();
113
114        int xdim = dimx;
115        int end = V._L().rows()-1;
116        ldmat Lam ( V._L() ( xdim,end,xdim,end ), V._D() ( xdim,end ) );  //exp val of R
117
118
119        if ( dif==0 ) { // no constant term
120                tmp->set_parameters ( mu, zeros ( xdim ), ldmat ( R ), Lam );
121        }
122        else {
123                //Assume the constant term is the last one:
124                if ( mu.cols() >1 ) {
125                        tmp->set_parameters ( mu.get_cols ( 0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ), Lam );
126                }
127                else {
128                        tmp->set_parameters ( mat(dim,0), mu.get_col ( mu.cols()-1 ), ldmat ( R ), Lam );
129                }
130        }
131        return tmp;
132}
133
134/*! \brief Return the best structure
135@param Eg a copy of GiW density that is being examined
136@param Eg0 a copy of prior GiW density before estimation
137@param Egll likelihood of the current Eg
138@param indeces current indeces
139\return best likelihood in the structure below the given one
140*/
141double egiw_bestbelow ( egiw Eg, egiw Eg0, double Egll, ivec &indeces ) { //parameter Eg is a copy!
142        ldmat Vo = Eg._V(); //copy
143        ldmat Vo0 = Eg._V(); //copy
144        ldmat& Vp = Eg._V(); // pointer into Eg
145        ldmat& Vp0 = Eg._V(); // pointer into Eg
146        int end = Vp.rows()-1;
147        int i;
148        mat Li;
149        mat Li0;
150        double maxll=Egll;
151        double tmpll=Egll;
152        double belll=Egll;
153
154        ivec tmpindeces;
155        ivec maxindeces=indeces;
156
157
158        cout << "bb:(" << indeces <<") ll=" << Egll <<endl;
159
160        //try to remove only one rv
161        for ( i=0;i<end;i++ ) {
162                //copy original
163                Li = Vo._L();
164                Li0 = Vo0._L();
165                //remove stuff
166                Li.del_col ( i+1 );
167                Li0.del_col ( i+1 );
168                Vp.ldform ( Li,Vo._D() );
169                Vp0.ldform ( Li0,Vo0._D() );
170                tmpll = Eg.lognc()-Eg0.lognc(); // likelihood is difference of norm. coefs.
171
172                cout << "i=(" << i <<") ll=" << tmpll <<endl;
173
174                //
175                if ( tmpll > Egll ) { //increase of the likelihood
176                        tmpindeces = indeces;
177                        tmpindeces.del ( i );
178                        //search for a better match in this substructure
179                        belll=egiw_bestbelow ( Eg, Eg0, tmpll, tmpindeces );
180                        if ( belll>maxll ) { //better match found
181                                maxll = belll;
182                                maxindeces = tmpindeces;
183                        }
184                }
185        }
186        indeces = maxindeces;
187        return maxll;
188}
189
190ivec ARX::structure_est ( egiw est0 ) {
191        ivec ind=linspace ( 1,est.dimension()-1 );
192        egiw_bestbelow ( est, est0, est.lognc()- est0.lognc(), ind );
193        return ind;
194}
195
196void ARX::from_setting( const Setting &set ) 
197{       
198        RV *yrv = UI::build<RV>(set,"y");
199        RV *rrv = UI::build<RV>(set,"rgr");
200        int ylen = yrv->_dsize();
201        int rgrlen = rrv->_dsize();
202       
203        //init
204        mat V0;
205        vec dV0;
206        try {
207                UI::get( dV0, set, "dV0" );
208        } catch(...){
209                dV0=concat ( 1e-3*ones ( ylen ), 1e-5*ones ( rgrlen ) );
210        }
211        V0=diag ( dV0 );
212       
213        double nu0;
214        if ( !set.lookupValue( "nu0", nu0 ) ) 
215                nu0 = rgrlen+ylen+2;
216
217        double frg;
218        if ( !set.lookupValue( "frg", frg ) ) 
219                frg = 1.0;
220
221        set_parameters(frg);
222        set_statistics(ylen,V0, nu0);
223        set_drv(concat(*yrv,*rrv));
224       
225        //name results (for logging)
226        set_rv(RV("{theta r }", vec_2(ylen*rgrlen, ylen*ylen)));
227       
228        delete yrv; 
229        delete rrv;
230}
231
232/*void ARX::to_setting( Setting &set ) const
233{       
234        Transport::to_setting( set );
235
236        Setting &kilometers_setting = set.add("kilometers", Setting::TypeInt );
237        kilometers_setting = kilometers;
238
239        UI::save( passengers, set, "passengers" );
240}*/
241
242
243}
Note: See TracBrowser for help on using the browser.