Changeset 204

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

merger is now in logarithms + new merge_test

Files:
1 added
6 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/arx.cpp

    r201 r204  
    1515        nu+=w; 
    1616 
     17        // log(sqrt(2*pi)) = 0.91893853320467 
    1718        if ( evalll ) { 
    1819                lnc = est.lognc(); 
    19                 ll = lnc - last_lognc; 
     20                ll = lnc - last_lognc - 0.91893853320467; 
    2021                last_lognc = lnc; 
    2122        } 
  • bdm/estim/merger.cpp

    r198 r204  
    1111        switch ( nu ) { 
    1212                case 2: 
    13                         coef= ( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) ); 
    14                         return exp ( coef*sq2bl + mu ); 
     13                        coef= ( 1-0.5*sqrt ( ( 4.0*beta-3.0 ) /beta ) ); 
     14                        return  coef*sq2bl + mu ; 
    1515                        break; 
    1616                case 3://Ratio of Bessel 
    1717                        coef = sqrt ( ( 3*beta-2 ) /3*beta ); 
    18                         return elem_mult ( 
    19                                    elem_div ( besselk ( 0,sq2bl*coef ), besselk ( 0,sq2bl ) ), 
    20                                    exp ( mu ) ); 
     18                        return log( besselk ( 0,sq2bl*coef )) - log( besselk ( 0,sq2bl ) ) +  mu; 
    2119                        break; 
    2220                case 4: 
     
    4644        vec lw_src ( Ns ); 
    4745        vec lw_mix ( Ns ); 
     46        vec lw ( Ns ); 
    4847        mat lW=zeros ( n,Ns ); 
    4948        vec vec0 ( 0 ); 
     
    7574//              dbg << Name ( str ) << Mpred->mean(); 
    7675 
    77                 if ( niter<10 ) { 
     76                if ( 1 ) { 
    7877                        // Generate new samples 
    7978                        eSmp.set_samples ( Mpred ); 
    80                         for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
    81  
    82                 } 
     79                        for ( int i=0;i<Ns;i++ ) { 
     80                                //////////// !!!!!!!!!!!!! 
     81                                if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = GamRNG(); } 
     82                                set_col_part ( Smp_ex,i,Smp ( i ) ); 
     83                        } 
     84                        {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     85                        cout << sum ( Smp_ex,2 ) /Ns <<endl; 
     86                } 
     87                else 
     88                        {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     89 
    8390//              sprintf ( str,"Mpdf%d",niter ); 
    8491//              for ( int i=0;i<Ns;i++ ) {Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) );} 
     
    127134                                                                        zdls ( i )->get_val ( Smp ( k ) ), 
    128135                                                                        zdls ( i )->get_cond ( Smp ( k ) ) ) ); 
     136                                                if ( !std::isfinite ( lw_src ( k ) ) ) { 
     137                                                        cout << endl; 
     138                                                } 
    129139                                        } 
    130140                                        delete tmp_cond; 
     
    147157//              dbg << Name ( str ) << lW; 
    148158 
    149                 w = lognorm_merge ( lW ); //merge 
     159                lw = lognorm_merge ( lW ); //merge 
    150160 
    151161//              sprintf ( str,"w%d",niter ); 
     
    155165 
    156166                //Importance weighting 
    157                 w /=exp ( lw_mix ); // hoping that it is not numerically sensitive... 
     167                lw -=  lw_mix; // hoping that it is not numerically sensitive... 
     168                w = exp(lw-max(lw)); 
    158169                //renormalize 
    159                 w /=sum ( w ); 
    160  
     170                double sumw =sum ( w ); 
     171                if ( std::isfinite ( sumw ) ) { 
     172                        w = w/sumw; 
     173                } 
     174                else { 
     175                         
     176                } 
     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                } 
    161192//              sprintf ( str,"w_is_%d",niter ); 
    162193//              dbg << Name ( str ) << w; 
     
    170201                // ==== stopping rule === 
    171202                niter++; 
    172                 converged = ( niter>5 ); 
     203                converged = ( niter>20 ); 
    173204        } 
     205        cout << endl; 
    174206 
    175207} 
  • bdm/stat/emix.h

    r193 r204  
    4747        //!Default constructor. By default, the given epdf is not copied! 
    4848        //! It is assumed that this function will be used only temporarily. 
    49         mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,nom0->_rv().subt(rv) ), dl(rv,rvc,nom0->_rv()) { 
     49        mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,nom0->_rv().subt ( rv ) ), dl ( rv,rvc,nom0->_rv() ) { 
    5050                if ( copy ) { 
    5151//                      nom = nom0->_copy_(); 
    52                         it_error("todo"); 
     52                        it_error ( "todo" ); 
    5353                        destroynom=true; 
    5454                } 
     
    6161        }; 
    6262        double evalcond ( const vec &val, const vec &cond ) { 
    63                 vec nom_val(rv.count()+rvc.count()); 
    64                 dl.fill_val_cond(nom_val,val,cond); 
     63                vec nom_val ( rv.count() +rvc.count() ); 
     64                dl.fill_val_cond ( nom_val,val,cond ); 
    6565                return exp ( nom->evalpdflog ( nom_val ) - den->evalpdflog ( cond ) ); 
    6666        } 
     
    132132        //! Auxiliary function for taking ownership of the Coms() 
    133133        void ownComs() {destroyComs=true;} 
    134          
     134 
    135135        //!access function 
    136         epdf* _Coms(int i){return Coms(i);} 
     136        epdf* _Coms ( int i ) {return Coms ( i );} 
    137137}; 
    138138 
     
    175175                                                // add logarithms 
    176176                                                res += epdfs ( i )->evalpdflog ( dls ( i )->get_val ( val ) );*/ 
    177                         res *= mpdfs ( i )->evalcond (  
    178                                                    dls ( i )->get_val ( val ), 
    179                         dls ( i )->get_cond ( val, cond ) 
    180                                                                                 ); 
     177                        res *= mpdfs ( i )->evalcond ( 
     178                                   dls ( i )->get_val ( val ), 
     179                                   dls ( i )->get_cond ( val, cond ) 
     180                              ); 
    181181                } 
    182182                return res; 
     
    222222                        independent=rv.add ( epdfs ( i )->_rv() ); 
    223223                        it_assert_debug ( independent==true, "eprod:: given components are not independent ." ); 
    224                         dls ( i ) = new datalink_e2e( epdfs ( i )->_rv() , rv ); 
     224                } 
     225                for ( int i=0;i<epdfs.length();i++ ) { 
     226                        dls ( i ) = new datalink_e2e ( epdfs ( i )->_rv() , rv ); 
    225227                } 
    226228        } 
     
    230232                for ( int i=0;i<epdfs.length();i++ ) { 
    231233                        vec pom = epdfs ( i )->mean(); 
    232                         dls(i)->fill_val(tmp, pom ); 
     234                        dls ( i )->fill_val ( tmp, pom ); 
    233235                } 
    234236                return tmp; 
     
    238240                for ( int i=0;i<epdfs.length();i++ ) { 
    239241                        vec pom = epdfs ( i )->sample(); 
    240                         dls(i)->fill_val(tmp, pom ); 
     242                        dls ( i )->fill_val ( tmp, pom ); 
    241243                } 
    242244                return tmp; 
     
    245247                double tmp=0; 
    246248                for ( int i=0;i<epdfs.length();i++ ) { 
    247                         tmp+=epdfs ( i )->evalpdflog ( dls(i)->get_val ( val ) ); 
     249                        tmp+=epdfs ( i )->evalpdflog ( dls ( i )->get_val ( val ) ); 
    248250                } 
    249251                return tmp; 
     
    251253        //!access function 
    252254        const epdf* operator () ( int i ) const {it_assert_debug ( i<epdfs.length(),"wrong index" );return epdfs ( i );} 
    253          
     255 
    254256        //!Destructor 
    255         ~eprod(){for(int i=0;i<epdfs.length();i++){delete dls(i);}} 
     257        ~eprod() {for ( int i=0;i<epdfs.length();i++ ) {delete dls ( i );}} 
    256258}; 
    257259 
  • bdm/stat/libEF.h

    r203 r204  
    4848        virtual double evalpdflog_nn ( const vec &val ) const{it_error ( "Not implemented" );return 0.0;}; 
    4949        //!Evaluate normalized log-probability 
    50         virtual double evalpdflog ( const vec &val ) const {return evalpdflog_nn ( val )-lognc();} 
     50        virtual double evalpdflog ( const vec &val ) const {double tmp;tmp= evalpdflog_nn ( val )-lognc();it_assert_debug(std::isfinite(tmp),"why?"); return tmp;} 
    5151        //!Evaluate normalized log-probability for many samples 
    5252        virtual vec evalpdflog ( const mat &Val ) const { 
  • mpdm/CMakeLists.txt

    r198 r204  
    2020target_link_libraries (merg_pred ${BdmLibs}) 
    2121 
     22add_executable (merg_giw merg_giw.cpp) 
     23target_link_libraries (merg_giw ${BdmLibs}) 
     24 
    2225add_executable (merger_iter_cond merger_iter_cond.cpp) 
    2326target_link_libraries (merger_iter_cond ${BdmLibs}) 
  • mpdm/merg_pred.cpp

    r198 r204  
    3434        mat V0g = 0.001*eye ( thrg.count() ); V0g ( 0,0 ) *= 10; // 
    3535        double nu0 = ord+6.0; 
    36         double frg = 1.0;//0.99; 
     36        double frg = 0.95; 
    3737 
    3838        ARX P1 ( thri, V0, nu0, frg ); 
     
    4040        ARX PG ( thrg, V0g, nu0, frg ); 
    4141        //Test estimation 
    42         int ndat = 500; 
     42        int ndat = 200; 
    4343        int t; 
    4444 
     
    5151        int Li_Data = L.add ( RV ( "{Y U1 U2 }" ), "" ); 
    5252        int Li_LL   = L.add ( RV ( "{1 2 G }" ), "LL" ); 
    53         int Li_Pred = L.add ( RV ( "{1 2 G ar ge ln}" ), "Pred" ); 
     53        int Li_Pred = L.add ( RV ( "{1 2 G ar ge }" ), "Pred" ); 
    5454 
    5555        L.init(); 
     
    6666        vec PostLLs(3); 
    6767        vec PredLLs_m=zeros(5); 
    68         vec PostLLs_m=zeros(3); 
    6968        ivec ind_r1 = "0 1 3"; 
    7069        ivec ind_r2 = "0 2 3"; 
     
    8483                        // Test predictors 
    8584                        if (t>2){ 
    86                                 mlnorm<ldmat>* P1p = P1.predictor_student(y,concat(ym,u1)); 
    87                                 mlnorm<ldmat>* P2p = P2.predictor_student(y,concat(ym,u2)); 
    88                                 mlnorm<ldmat>* Pgp = PG.predictor_student(y,concat(ym,uu)); 
     85                                mlnorm<ldmat>* P1p = P1.predictor(y,concat(ym,u1)); 
     86                                mlnorm<ldmat>* P2p = P2.predictor(y,concat(ym,u2)); 
     87                                mlnorm<ldmat>* Pgp = PG.predictor(y,concat(ym,uu)); 
    8988                                 
    9089                                Array<mpdf*> A(2); A(0)=P1p;A(1)=P2p; 
    9190                                merger M(A); 
    9291                                enorm<ldmat> g0(concat(yy,uu)); g0.set_parameters("0 0 0 0 ",3*eye(4)); 
    93                                 M.set_parameters(1.2, 100,1); 
     92                                M.set_parameters(10000000.0, 100,1); 
    9493                                M.merge(&g0); 
    9594                                 
     
    9897                                double P2pl = P2p->evalcond(yt,rgr2);    
    9998                                double PGpl = Pgp->evalcond(yt,rgrg);    
    100                                 PredLLs(0) = log(P1pl); PredLLs(1) = log(P2pl); PredLLs(2) = log(PGpl); 
     99                                { 
     100                                        cout << "yt: " << yt << endl; 
     101                                        cout << "yt_1: " << P1p->_epdf().mean() << endl; 
     102                                        cout << "yt_2: " << P2p->_epdf().mean() << endl; 
     103                                        cout << "yt_G: " << P2p->_epdf().mean() << endl; 
     104                                } 
     105                                double cP1pl; 
     106                                double cP2pl; 
    101107                                { 
    102108                                        ARX* Apred = (ARX*)M._Mix()._Coms(0); 
     
    107113                                        mlnorm<ldmat>* cP2p = (mlnorm<ldmat>*)mP2p->condition(y); 
    108114 
    109                                         double cP1pl = cP1p->evalcond(yt,rgr1);  
    110                                         double cP2pl = cP2p->evalcond(yt,rgr2);  
    111                                         PredLLs(3) = log(cP1pl); 
    112                                         PredLLs(4) = log(cP2pl); 
     115                                        cP1pl = cP1p->evalcond(yt,rgr1);         
     116                                        cP2pl = cP2p->evalcond(yt,rgr2);         
     117                                 
     118                                        cout << "ytm1: " << cP1p->_epdf().mean() << endl; 
     119                                        cout << "ytm2: " << cP2p->_epdf().mean() << endl; 
    113120                                } 
    114121 
    115                                 L.logit(Li_Pred, PredLLs_m*frg+ PredLLs); //log-normal 
    116                                 PredLLs_m *=frg; 
    117                                 PredLLs_m += PredLLs; 
     122                                PredLLs *=frg; 
     123                                PredLLs += log(concat(vec_3(P1pl, P2pl, PGpl), vec_2(cP1pl,cP2pl))); 
     124                                L.logit(Li_Pred, PredLLs); //log-normal 
    118125                                 
    119126                                delete P1p;