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

Revision 577, 5.9 kB (checked in by smidl, 15 years ago)

preparatory stuff for #12

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