root/library/tests/emix_test.cpp @ 477

Revision 477, 2.8 kB (checked in by mido, 15 years ago)

panove, vite, jak jsem peclivej na upravu kodu.. snad se vam bude libit:) konfigurace je v souboru /system/astylerc

  • Property svn:eol-style set to native
Line 
1#include "shared_ptr.h"
2#include "stat/exp_family.h"
3#include "stat/emix.h"
4
5using namespace bdm;
6
7//These lines are needed for use of cout and endl
8using std::cout;
9using std::endl;
10
11double normcoef ( const epdf* ep, const vec &xb, const vec &yb, int Ngr = 100 ) {
12        mat PPdf ( Ngr + 1, Ngr + 1 );
13        vec rgr ( 2 );
14
15        int i = 0, j = 0;
16        double xstep = ( xb ( 1 ) - xb ( 0 ) ) / Ngr;
17        double ystep = ( yb ( 1 ) - yb ( 0 ) ) / Ngr;
18
19        for ( double x = xb ( 0 ); x <= xb ( 1 ); x += xstep, i++ ) {
20                rgr ( 0 ) = x;
21                j = 0;
22                for ( double y = yb ( 0 ); y <= yb ( 1 ); y += ystep, j++ ) {
23                        rgr ( 1 ) = y;
24                        PPdf ( i, j ) = exp ( ep->evallog ( rgr ) );
25                }
26        }
27        return sumsum ( PPdf ) *xstep*ystep;
28}
29
30int main() {
31        RNG_randomize();
32
33        RV x ( "{x }" );
34        RV y ( "{y }" );
35        RV xy = concat ( x, y );
36
37        enorm<ldmat> E1;
38        E1.set_rv ( xy );
39
40        E1.set_parameters ( "1.00054 1.0455" , mat ( "0.740142 -0.259015; -0.259015 1.0302" ) );
41        enorm<ldmat> E2;
42        E2.set_rv ( xy );
43        E2.set_parameters ( "-1.2 -0.1" , mat ( "1 0.4; 0.4 0.5" ) );
44
45        Array<epdf*> A1 ( 1 );
46        A1 ( 0 ) = &E1;
47
48        emix M1;
49        M1.set_rv ( xy );
50        M1.set_parameters ( vec ( "1" ), A1, false );
51        cout << "======== test if ARX and emix with one ARX are the same ===" << endl;
52
53        epdf* Mm = M1.marginal ( y );
54        epdf* Am = E1.marginal ( y );
55        mpdf* Mc = M1.condition ( y );
56        mpdf* Ac = E1.condition ( y );
57
58        cout << * ( ( mlnorm<ldmat>* ) Ac ) << endl;
59
60        cout << "Mix marg at 0: " << Mm->evallog ( vec_1 ( 0.0 ) ) << endl;
61        cout << "ARX marg at 0: " << Am->evallog ( vec_1 ( 0.0 ) ) << endl;
62        cout << "Mix cond at 0,0: " << Mc->evallogcond ( vec_1 ( 0.0 ), vec_1 ( 0.0 ) ) << endl;
63        cout << "ARX cond at 0,0: " << Ac->evallogcond ( vec_1 ( 0.0 ), vec_1 ( 0.0 ) ) << endl;
64
65        cout << "======== Mixture with two components ===" << endl;
66        Array<epdf*> A2 ( 2 );
67        A2 ( 0 ) = &E1;
68        A2 ( 1 ) = &E2;
69
70        emix M2;
71        M2.set_rv ( xy );
72        M2.set_parameters ( vec ( "1" ), A2, false );
73
74
75        cout << "Mixture normalization: " << normcoef ( &M2, vec ( "-3 3 " ), vec ( "-3 3 " ) ) << endl;
76
77        int N = 3;
78        vec ll ( N );
79        vec ll2 ( N );
80        mat Smp = M2.sample_m ( N );
81        ll = M2.evallog_m ( Smp );
82
83        vec Emu = sum ( Smp, 2 ) / N;
84        mat Er = ( Smp * Smp.transpose() ) / N - outer_product ( Emu, Emu );
85
86        cout << "original empirical mean: " << Emu << endl;
87        cout << "original empirical variance: " << Er << endl;
88
89        shared_ptr<epdf> Mg ( dynamic_cast<epdf *> ( M2.marginal ( y ) ) );
90        mpdf* Cn = ( mpdf* ) M2.condition ( x );
91
92        it_file it ( "emix_test.it" );
93        it << Name ( "Smp" ) << Smp;
94
95        cout << "marginal mean: " << Mg->mean() << endl;
96
97        cout << "========== putting them back together ======= " << endl;
98        mepdf mMg ( Mg );
99        Array<mpdf*> AA ( 2 );
100        AA ( 0 ) = Cn;
101        AA ( 1 ) = &mMg;
102        mprod mEp ( AA );
103
104        for ( int j = 0; j < N; j++ ) {
105                ll2 ( j ) = mEp.evallogcond ( Smp.get_col ( j ), vec ( 0 ) );
106        }
107        it << Name ( "ll" ) << ll;
108        it << Name ( "ll2" ) << ll2;
109
110
111}
Note: See TracBrowser for help on using the browser.