Changeset 205

Show
Ignore:
Timestamp:
11/10/08 15:40:30 (15 years ago)
Author:
smidl
Message:

merger posledni verze

Files:
2 added
5 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/merger.cpp

    r204 r205  
    1616                case 3://Ratio of Bessel 
    1717                        coef = sqrt ( ( 3*beta-2 ) /3*beta ); 
    18                         return log( besselk ( 0,sq2bl*coef )) - log( besselk ( 0,sq2bl ) ) +  mu; 
     18                        return log ( besselk ( 0,sq2bl*coef ) ) - log ( besselk ( 0,sq2bl ) ) +  mu; 
    1919                        break; 
    2020                case 4: 
     
    3131        it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); 
    3232        //Empirical density - samples 
    33         eEmp eSmp ( rv,Ns ); 
    3433        eSmp.set_parameters ( ones ( Ns ), g0 ); 
    3534        Array<vec> &Smp = eSmp._samples(); //aux 
     
    6261        char str[100]; 
    6362 
    64         epdf* Mpred; 
     63        epdf* Mpred=Mix.predictor(rv); 
    6564        vec Mix_pdf ( Ns ); 
    6665        while ( !converged ) { 
     
    6968                Mix.flatten ( &Mix_init ); 
    7069                Mix.bayesB ( Smp_ex, w*Ns ); 
     70                delete Mpred; 
    7171                Mpred = Mix.predictor ( rv ); // Allocation => must be deleted at the end!! 
    72  
    73 //              sprintf ( str,"Mpred_mean%d",niter ); 
    74 //              dbg << Name ( str ) << Mpred->mean(); 
    75  
    76                 if ( 1 ) { 
     72                 
     73                if ( 1./sum_sqr ( w ) <0.5*Ns ) { 
    7774                        // Generate new samples 
    7875                        eSmp.set_samples ( Mpred ); 
    7976                        for ( int i=0;i<Ns;i++ ) { 
    8077                                //////////// !!!!!!!!!!!!! 
    81                                 if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = GamRNG(); } 
     78                                if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = 0.01; } 
    8279                                set_col_part ( Smp_ex,i,Smp ( i ) ); 
    8380                        } 
    84                         {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     81                        {cout<<"Resampling =" << 1./sum_sqr ( w ) << endl;} 
    8582                        cout << sum ( Smp_ex,2 ) /Ns <<endl; 
     83                        cout << Smp_ex*Smp_ex.T()/Ns << endl;  
    8684                } 
    87                 else 
    88                         {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     85//              sprintf ( str,"Mpred_mean%d",niter ); 
     86//              dbg << Name ( str ) << Mpred->mean(); 
     87 
    8988 
    9089//              sprintf ( str,"Mpdf%d",niter ); 
     
    135134                                                                        zdls ( i )->get_cond ( Smp ( k ) ) ) ); 
    136135                                                if ( !std::isfinite ( lw_src ( k ) ) ) { 
    137                                                         cout << endl; 
     136                                                        lw_src ( k ) = -1e16; cout << "!"; 
    138137                                                } 
    139138                                        } 
     
    166165                //Importance weighting 
    167166                lw -=  lw_mix; // hoping that it is not numerically sensitive... 
    168                 w = exp(lw-max(lw)); 
     167                w = exp ( lw-max ( lw ) ); 
    169168                //renormalize 
    170169                double sumw =sum ( w ); 
     
    173172                } 
    174173                else { 
    175                          
     174 
    176175                } 
    177                 { 
    178                         double eff = 1./sum_sqr ( w ); 
    179                         if ( eff<2 ) { 
    180                                 int mi= max_index ( w ); 
    181                                 cout << w(mi) <<endl; 
    182                                 cout << lW.get_col ( mi ) <<endl; 
    183                                 mat mm(2,1);mm.set_col(0,lW.get_col(mi)); 
    184                                 cout << lognorm_merge(mm) <<endl; 
    185                                 cout << lw_mix ( mi ) <<endl; 
    186                                 cout << lw ( mi ) <<endl; 
    187                                 cout << Smp ( mi ) <<endl; 
    188                                 cout << Mix._Coms(0)->_e()->mean() <<endl; 
    189                         } 
    190                         cout << "Eff: " << eff <<endl; 
    191                 } 
     176 
    192177//              sprintf ( str,"w_is_%d",niter ); 
    193178//              dbg << Name ( str ) << w; 
  • bdm/estim/merger.h

    r198 r205  
    4343        //!Prior on the log-normal merging model 
    4444        double beta; 
     45        //! Projection to empirical density 
     46        eEmp eSmp; 
     47 
    4548public: 
    4649//!Default constructor 
    4750        merger ( const Array<mpdf*> &S ) : 
    4851                        compositepdf ( S ), epdf ( getrv ( false ) ), 
    49                         Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ) { 
     52                        Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp(rv,0) { 
    5053                RV ztmp; 
    5154                // Extend rv by rvc! 
     
    6871        } 
    6972//! Set internal parameters used in approximation 
    70         void set_parameters ( double beta0, int Ns0, int Nc0 ) {        beta=beta0;Ns=Ns0;Nc=Nc0;} 
     73        void set_parameters ( double beta0, int Ns0, int Nc0 ) {beta=beta0;Ns=Ns0;Nc=Nc0;eSmp.set_n(Ns0,false);} 
    7174//!Initialize the proposal density. This function must be called before merge()! 
    7275        void init() { ////////////// NOT FINISHED 
     
    9093                return Mix.logpred ( dtf ); 
    9194        } 
    92         vec mean() const {return Mix._epdf().mean();} 
     95        vec mean() const { 
     96                const Vec<double> &w = eSmp._w(); 
     97                const Array<vec> &S = eSmp._samples(); 
     98                vec tmp=zeros ( rv.count() );  
     99                for ( int i=0; i<Ns; i++ ) { 
     100                        tmp+=w ( i ) *S ( i ); 
     101                } 
     102                return tmp; 
     103        } 
     104        mat variance() const { 
     105                const vec &w = eSmp._w(); 
     106                const Array<vec> &S = eSmp._samples(); 
     107                 
     108                vec mea = mean();  
     109                 
     110                cout << sum(w) << "," << w*w <<endl; 
     111                 
     112                mat Tmp=zeros(rv.count(), rv.count()); 
     113                for ( int i=0; i<Ns; i++ ) { 
     114                        Tmp+=w ( i ) *outer_product(S ( i ), S(i)); 
     115                } 
     116                return Tmp-outer_product(mea,mea); 
     117        } 
    93118//! for future use 
    94119        virtual ~merger() { 
     
    101126//! Access function 
    102127        MixEF& _Mix() {return Mix;} 
     128//! Access function 
     129        eEmp& _Smp() {return eSmp;} 
    103130}; 
    104131 
  • bdm/stat/libEF.h

    r204 r205  
    200200        ldmat& _V() {return V;} 
    201201        //! returns a pointer to the internal statistics. Use with Care! 
    202         double& _nu() {return nu;} 
     202        const ldmat& _V() const {return V;} 
     203        //! returns a pointer to the internal statistics. Use with Care! 
     204        double& _nu()  {return nu;} 
     205        const double& _nu() const {return nu;} 
    203206        void pow ( double p ) {V*=p;nu*=p;}; 
    204207}; 
     
    520523        //! Set sample 
    521524        void set_samples ( const epdf* pdf0 ); 
     525        //! Set sample 
     526        void set_n ( int n0, bool copy=true ){w.set_size(n0,copy);samples.set_size(n0,copy);}; 
    522527        //! Potentially dangerous, use with care. 
    523528        vec& _w()  {return w;}; 
     529        //! Potentially dangerous, use with care. 
     530        const vec& _w() const {return w;}; 
    524531        //! access function 
    525532        Array<vec>& _samples() {return samples;}; 
     533        //! access function 
     534        const Array<vec>& _samples() const {return samples;}; 
    526535        //! Function performs resampling, i.e. removal of low-weight samples and duplication of high-weight samples such that the new samples represent the same density. 
    527536        ivec resample ( RESAMPLING_METHOD method = SYSTEMATIC ); 
  • mpdm/merg_giw.cpp

    r204 r205  
    1717        RV uu=u1; uu.add ( u2 ); 
    1818 
     19        double a1t = 1.5; 
     20        double a2t = 0.8; 
     21        double sqr=0.10; 
    1922        // Full system 
    20         vec thg ( "1 1" ); //Simulated system - zero for constant term 
    21         double sqr=1.0; 
     23        vec thg =vec_2 ( a1t,a2t ); //Simulated system - zero for constant term 
    2224        vec Th = concat ( thg, sqr ); //Full parameter 
    2325 
     
    2830        RV all =a1; all.add ( a2 ); all.add ( r ); 
    2931        RV allj =a1; allj.add ( r ); allj.add ( a2 ); 
    30         vec Thj("1 1 1"); 
     32        vec Thj=vec_3 ( a1t,sqr,a2t ); 
    3133        // Setup values 
    3234 
     
    3739        ARX P1 ( concat ( a1,r ), V0, -1 ); 
    3840        ARX P2 ( concat ( a2,r ), V0, -1 ); 
    39         ARX PG ( all, V0g, -1 ); 
     41        ARX PG ( all, V0g, -1 ); //or -1? 
     42//      ARX PGk ( all, V0g, -1 ); 
    4043 
    4144        //Test estimation 
     
    4447 
    4548        // Logging 
    46         dirfilelog L ( "exp/merg_giw",1 ); 
     49        dirfilelog L ( "exp/merg_giw",ndat ); 
    4750        int Li_Data = L.add ( RV ( "{Y U1 U2 }" ), "" ); 
    48         int Li_LL   = L.add ( RV ( "{1 2 G M }" ), "LL" ); 
     51        int Li_LL   = L.add ( RV ( "{G M }" ), "LL" ); 
     52        int Li_P1m   = L.add ( RV ( "{a1 r }" ), "P1" ); 
     53        int Li_P2m   = L.add ( RV ( "{a2 r }" ), "P2" ); 
    4954        int Li_Gm   = L.add ( RV ( "{a1 a2 r }" ), "G" ); 
    5055        int Li_Mm   = L.add ( RV ( "{a1 r a2 }" ), "M" ); 
     
    5459        vec yt ( 1 ); 
    5560 
    56         vec LLs ( 4 ); 
     61        vec LLs ( 2 ); 
    5762        vec rgrg ( 2 ); 
    58          
     63 
    5964        //Proposal 
    60         enorm<ldmat> g0 ( a1 ); g0.set_parameters ( "1  ",mat("1") ); 
     65        enorm<ldmat> g0 ( a1 ); g0.set_parameters ( "1  ",mat ( "1" ) ); 
    6166        egamma g1 ( r ); g1.set_parameters ( "2  ", "2" ); 
    62         enorm<ldmat> g2 ( a2 ); g2.set_parameters ( "1  ",mat("1") ); 
     67        enorm<ldmat> g2 ( a2 ); g2.set_parameters ( "1  ",mat ( "1" ) ); 
    6368 
    64         Array<const epdf*> A(3); A(0) = &g0; A(1)=&g1; A(2) = &g2; 
    65         eprod G0(A); 
    66          
     69        Array<const epdf*> A ( 3 ); A ( 0 ) = &g0; A ( 1 ) =&g1; A ( 2 ) = &g2; 
     70        eprod G0 ( A ); 
     71 
    6772        for ( t=0; t<ndat; t++ ) { 
    6873                // True system 
    6974                rgrg ( 0 ) = pow ( sin ( ( t/40.0 ) *pi ),3 ); 
    70                 rgrg ( 1 ) = pow ( cos ( ( t/40.0 ) *pi ),3 ); 
     75                rgrg ( 1 ) = pow ( cos ( ( t/40.0 +0.1 ) *pi ),3 ); 
    7176 
    7277                Yt ( t ) = thg*rgrg + sqr * NorRNG(); 
    7378 
    7479                // Bayes for all 
    75                 P1.bayes ( concat ( Yt ( t ),vec_1(rgrg ( 0 ) )) ); 
    76                 P2.bayes ( concat ( Yt ( t ),vec_1(rgrg ( 1 ) )) ); 
     80                P1.bayes ( concat ( Yt ( t ),vec_1 ( rgrg ( 0 ) ) ) ); 
     81                P2.bayes ( concat ( Yt ( t ),vec_1 ( rgrg ( 1 ) ) ) ); 
    7782                PG.bayes ( concat ( Yt ( t ),rgrg ) ); 
    7883 
     84 
     85                // crippling PGk by substituting zeros. 
     86                /*      ldmat &Vk=const_cast<egiw*>(PGk._e())->_V();  //PG ldmat does not like 0! 
     87                        mat fVk=PG._e()->_V().to_mat(); 
     88                        fVk(1,2) = 0.0; 
     89                        fVk(2,1) = 0.0; 
     90                        Vk = ldmat(fVk); 
     91                */      //PGk is now krippled 
     92 
    7993                // Merge estimates 
    80                 mepdf eG1(P1._e()); 
    81                 mepdf eG2(P2._e()); 
     94                mepdf eG1 ( P1._e() ); 
     95                mepdf eG2 ( P2._e() ); 
    8296                Array<mpdf*> A ( 2 ); A ( 0 ) =&eG1;A ( 1 ) =&eG2; 
    8397                merger M ( A ); 
    84                 M.set_parameters ( 10.0, 100,2 ); 
     98                M.set_parameters ( 1.5, 100,3 ); //M._Mix().set_method(QB); 
     99                //M2.set_parameters ( 100.0, 1000,3 ); //M2._Mix().set_method(QB); 
    85100                M.merge ( &G0 ); 
     101                //M2.merge ( &G0 ); 
    86102 
    87103                //Likelihood 
    88104                yt ( 0 ) = Yt ( t ); 
    89105 
    90                 LLs ( 0 ) = P1._e()->evalpdflog ( get_vec(Th, "1 2") ); 
    91                 LLs ( 1 ) = P2._e()->evalpdflog ( get_vec(Th, "3 2")  ); 
    92                 LLs ( 2 ) = PG._e()->evalpdflog (Th ); 
    93                 LLs ( 3 ) = M._Mix().logpred ( concat(Thj, vec_1(1.0)) ); 
     106//              LLs ( 0 ) = P1._e()->evalpdflog ( get_vec(Th, "1 2") ); 
     107//              LLs ( 1 ) = P2._e()->evalpdflog ( get_vec(Th, "3 2")  ); 
     108                LLs ( 0 ) = PG._e()->evalpdflog ( Th ); 
     109                LLs ( 1 ) = M._Mix().logpred ( concat ( Thj, vec_1 ( 1.0 ) ) ); 
     110//              LLs ( 3 ) = M2._Mix().logpred ( concat(Thj, vec_1(1.0)) ); 
    94111                L.logit ( Li_LL, LLs ); //log-normal 
    95112 
    96113                //Logger 
    97114                L.logit ( Li_Data, vec_3 ( Yt ( t ), rgrg ( 0 ), rgrg ( 1 ) ) ); 
     115                L.logit ( Li_P1m, P1._e()->mean() ); 
     116                L.logit ( Li_P2m, P2._e()->mean() ); 
    98117                L.logit ( Li_Gm, PG._e()->mean() ); 
    99                 emix *tm =M._Mix().predictor(allj); 
    100                 L.logit ( Li_Mm, tm->mean() ); 
    101                 delete tm; 
     118                L.logit ( Li_Mm, M.mean() ); 
     119 
    102120                L.step ( ); 
     121 
     122                cout << "Vg: " << PG._e()->_V().to_mat() <<endl; 
     123                vec mea = M.mean(); 
     124                cout << "Ve: " << M.variance() <<endl; 
    103125        } 
    104126        L.finalize( ); 
    105127        L.itsave ( "merg_egiw.it" ); 
     128        cout << endl; 
    106129} 
  • tests/CMakeLists.txt

    r201 r205  
    4242TEST(arx_elem_test) 
    4343TEST(merger_test) 
     44TEST(merger_2d_test) 
    4445TEST(merger_iter_test) 
    4546TEST(mixef_test)