Changeset 629

Show
Ignore:
Timestamp:
09/18/09 00:17:11 (15 years ago)
Author:
smidl
Message:

egiw.variance works for multidimensional + cleanup in tests

Location:
library
Files:
2 removed
6 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/stat/exp_family.cpp

    r565 r629  
    1717        this->bayes ( dt, 1.0 ); 
    1818}; 
     19 
     20void egiw::set_parameters (int dimx0, ldmat V0, double nu0) { 
     21        dimx = dimx0; 
     22        nPsi = V0.rows() - dimx; 
     23        dim = dimx * (dimx + nPsi); // size(R) + size(Theta) 
     24         
     25        V = V0; 
     26        if (nu0 < 0) { 
     27                nu = 0.1 + nPsi + 2 * dimx + 2; // +2 assures finite expected value of R 
     28                // terms before that are sufficient for finite normalization 
     29        } else { 
     30                nu = nu0; 
     31        } 
     32} 
    1933 
    2034vec egiw::sample() const { 
     
    119133                mat R; 
    120134                mean_mat ( M, R ); 
    121                 return cvectorize ( concat_vertical ( M, R ) ); 
     135                return concat( cvectorize (  M),cvectorize( R ) ); 
    122136        } 
    123137 
     
    125139 
    126140vec egiw::variance() const { 
    127  
     141        int l = V.rows(); 
     142        // cut out rest of lower-right part of V 
     143        const ldmat tmp ( V, linspace ( dimx, l - 1 ) ); 
     144        // invert it 
     145        ldmat itmp ( l ); 
     146        tmp.inv ( itmp ); 
     147         
     148        // following Wikipedia notation 
     149        // m=nu-nPsi-dimx-1, p=dimx  
     150        double mp1p=nu-nPsi-2*dimx; // m-p+1 
     151        double mp1m=mp1p-2;         // m-p-1 
     152         
    128153        if ( dimx == 1 ) { 
    129                 int l = V.rows(); 
    130                 const ldmat tmp ( V, linspace ( 1, l - 1 ) ); 
    131                 ldmat itmp ( l ); 
    132                 tmp.inv ( itmp ); 
    133                 double cove = V._D() ( 0 ) / ( nu - nPsi - 2 * dimx - 2 ); 
     154                double cove = V._D() ( 0 ) / mp1m ; 
    134155 
    135156                vec var ( l ); 
    136157                var.set_subvector ( 0, diag ( itmp.to_mat() ) *cove ); 
    137                 var ( l - 1 ) = cove * cove / ( nu - nPsi - 2 * dimx - 2 ); 
     158                var ( l - 1 ) = cove * cove / (mp1m-2); 
    138159                return var; 
    139160        } else { 
    140                 bdm_error ( "not implemented" ); 
    141                 return vec(); 
     161                ldmat Vll( V, linspace(0,dimx-1)); // top-left part of V 
     162                mat Y=Vll.to_mat(); 
     163                mat varY(Y.rows(), Y.cols());  
     164                 
     165                double denom = (mp1p-1)*mp1m*mp1m*(mp1m-2);         // (m-p)(m-p-1)^2(m-p-3) 
     166                 
     167                int i,j; 
     168                for ( i=0; i<Y.rows(); i++){ 
     169                        for ( j=0; j<Y.cols(); j++){ 
     170                                varY(i,j) = (mp1p*Y(i,j)*Y(i,j) + mp1m * Y(i,i)* Y(j,j)) /denom; 
     171                        } 
     172                } 
     173                vec mean_dR = diag(Y)/mp1m; // corresponds to cove 
     174                vec var_th=diag ( itmp.to_mat() ); 
     175                vec var_Th ( mean_dR.length()*var_th.length() ); 
     176                // diagonal of diag(mean_dR) \kron diag(var_th) 
     177                for (int i=0; i<mean_dR.length(); i++){ 
     178                        var_Th.set_subvector(i*var_th.length(), var_th*mean_dR(i));   
     179                } 
     180                 
     181                return concat(var_Th, cvectorize(varY)); 
    142182        } 
    143183} 
  • library/bdm/stat/exp_family.h

    r621 r629  
    217217                egiw (int dimx0, ldmat V0, double nu0 = -1.0) : eEF() {set_parameters (dimx0, V0, nu0);}; 
    218218 
    219                 void set_parameters (int dimx0, ldmat V0, double nu0 = -1.0) { 
    220                         dimx = dimx0; 
    221                         nPsi = V0.rows() - dimx; 
    222                         dim = dimx * (dimx + nPsi); // size(R) + size(Theta) 
    223  
    224                         V = V0; 
    225                         if (nu0 < 0) { 
    226                                 nu = 0.1 + nPsi + 2 * dimx + 2; // +2 assures finite expected value of R 
    227                                 // terms before that are sufficient for finite normalization 
    228                         } else { 
    229                                 nu = nu0; 
    230                         } 
    231                 } 
     219                void set_parameters (int dimx0, ldmat V0, double nu0 = -1.0); 
    232220                //!@} 
    233221 
  • library/tests/CMakeLists.txt

    r607 r629  
    77link_directories (./unittest-cpp) 
    88 
    9 SET(testutil_src egiw_harness.cpp egiw_harness.h epdf_harness.cpp epdf_harness.h mat_checks.cpp mat_checks.h  
     9SET(testutil_src epdf_harness.cpp epdf_harness.h mat_checks.cpp mat_checks.h  
    1010        mpdf_harness.cpp mpdf_harness.h square_mat_point.cpp square_mat_point.h test_util.cpp test_util.h) 
    1111 
  • library/tests/arx_straux_test.cpp

    r607 r629  
    55 
    66TEST(test_arx_straux){ 
    7 mat A="[   0.8147    0.9134    0.2785;" 
     7mat A="0.8147    0.9134    0.2785;" 
    88    "0.9058    0.6324    0.5469;" 
    9     "0.1270    0.0975    0.9575]"; 
     9    "0.1270    0.0975    0.9575"; 
    1010 
    11 mat B="[0.9649    0.9572    0.1419;" 
     11mat B="0.9649    0.9572    0.1419;" 
    1212    "0.1576    0.4854    0.4218;" 
    13     "0.9706    0.8003    0.9157]"; 
     13    "0.9706    0.8003    0.9157"; 
    1414//when updateing matrices do not forget to update CHECK_EQUAL below!!! 
    1515         
  • library/tests/egiw.cfg

    r473 r629  
    11data = ( 
    22{ 
    3   class = "egiw_harness"; 
     3  class = "epdf_harness"; 
    44  epdf = { 
    55    class = "egiw"; 
     
    1313  }; 
    1414  mean = [ 1.1, 0.1 ]; 
    15   lognc = 3.39463; 
    1615  variance = [ 0.01, 8e-05 ]; 
    1716  support = ( "matrix", 2, 2, [ -2.0, 4.0, 0.01, 2.0 ] ); 
     
    2019}, 
    2120{ 
    22   class = "egiw_harness"; 
     21  class = "epdf_harness"; 
    2322  epdf = { 
    2423    class = "egiw"; 
    25     V = ( "matrix", 2, 2, [ 20.0, 8.0, 8.0, 4.0 ] ); 
    26     nu = 4.0; 
     24    V = ( "matrix", 2, 2, [ 200.0, 80.0, 80.0, 40.0 ] ); 
     25    nu = 40.0; 
    2726    dimx = 1; 
    2827    rv :  
     
    3231    }; 
    3332  }; 
    34   mean = [ 2, -4 ]; 
    35   lognc = 0.451583; 
    36   variance = [ -1, -16 ]; 
     33  mean = [2.0, 1.14286]; 
     34  variance = [0.0285714, 0.0395795]; 
    3735} ); 
    3836 
  • library/tests/egiw_test.cpp

    r557 r629  
    55#include "itpp_ext.h" 
    66#include "epdf_harness.h" 
    7 #include "egiw_harness.h" 
    87#include "mat_checks.h" 
    98#include "UnitTest++.h"