CDbw.h

00001 #ifndef CDbw_H
00002 #define CDbw_H
00003 
00004 #include "Som.h"
00005 #include "defs.h"
00006 
00007 class CDbw {
00008 
00009 public:
00010         CDbw( SOM * som, TIntVector cluster, int num_clusters ) : som(som), v(cluster) , c(num_clusters)
00011         {
00012                 d = som->getData()->getDimension();
00013                 m = som->getMapcode()->getMapSize();
00014                 n = som->getData()->getDataSize();
00015                 entries                 = som->getData()->getEntries();
00016                 codebook                = som->getMapcode()->getCodebook();
00017                 entries_label   = som->getData()->getId(); // getLabel();
00018                 codebook_label  = som->getMapcode()->getLabel();
00019                 Init();
00020         };
00021         Value_Type Index();
00022 
00023 private:
00024         // Init variables
00025         void Init();
00026         void getStdev_v();
00027         TMatrix getClose_rep(int c_i, int c_j);
00028         Value_Type getDensity( TMatrix close_rep, int c_i, int c_j );
00029         Value_Type Inter_dens();
00030         Value_Type Sep();
00031         Value_Type getDensity_v( int c_i );
00032         Value_Type Intra_dens();
00033         
00034         // Overal average standard deviation
00035         Value_Type stdev();
00036 
00037         TIntVector v;
00038         TMatrix stdev_v;
00039         TVector stdev_vv;
00040         TMatrix mean_v;
00041         TVector num_v;  
00042         int c;
00043         int d;
00044         int m;
00045         int n;
00046         TMatrix entries;
00047         TMatrix codebook;
00048         TvecLabel entries_label;
00049         TLabel  codebook_label;
00050         SOM * som;
00051 };
00052 
00053 void 
00054 CDbw::Init() 
00055 {
00056         getStdev_v();
00057 };
00058 
00059 void 
00060 CDbw::getStdev_v() 
00061 {
00062         int i, j, l, k;
00063         stdev_v = create_matrix(1, c, 1, d ); 
00064         mean_v = create_matrix(1, c, 1, d ); 
00065         stdev_vv = create_vector( 1, c );
00066         
00067         for (i=1; i<=c; i++)  {
00068                 stdev_vv[i] = 0;
00069                 for (j=1; j<=d; j++) { 
00070                         stdev_v[i][j] = 0; 
00071                         mean_v[i][j] = 0; 
00072                 };
00073         };
00074 
00075         num_v = create_vector(1, c ); for (i=1; i<=c; i++) num_v[i] = 0;
00076 
00077         for (i=1; i<=m; i++ ) {
00078                 if ( v[i] > 0 ) {
00079                         for (l=0; l< codebook_label[i-1].size(); l++ )
00080                                 for (j=1; j<=n; j++) {
00081                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00082                                                 for (k=1; k<=d; k++ ) {
00083                                                         mean_v[v[i]][k] += entries[j][k];
00084                                                 }
00085                                                 ++num_v[v[i]];
00086                                                 break;
00087                                         }
00088                         }
00089                 }
00090         }
00091         for (i=1; i<=c; i++) for (j=1; j<=d; j++)
00092                 mean_v[i][j] /= num_v[i];
00093         for (i=1; i<=m; i++ ) {
00094                 if ( v[i] > 0 ) {
00095                         for (l=0; l< codebook_label[i-1].size(); l++ )
00096                                 for (j=1; j<=n; j++) {
00097                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00098                                                 for (k=1; k<=d; k++ ) {
00099                                                         stdev_v[v[i]][k] += pow((entries[j][k] - mean_v[v[i]][k]),2 );
00100                                                         stdev_vv[v[i]] += pow((entries[j][k] - mean_v[v[i]][k]),2 );
00101                                                 }                                               
00102                                                 break;
00103                                         }
00104                         }
00105                 }
00106         }
00107         for (i=1; i<=c; i++) {
00108                 if ( (num_v[i] - 1) > 0 )
00109                         stdev_vv[i] = sqrt( stdev_vv[i]/(num_v[i] - 1) );
00110                 else
00111                         stdev_vv[i] = 0;
00112                 for (j=1; j<=d; j++) {
00113                         if ((num_v[i] - 1) > 0 )
00114                                 stdev_v[i][j] = sqrt( stdev_v[i][j]/(num_v[i] - 1) );
00115                         else
00116                                 stdev_v[i][j] = 0;
00117                 }
00118         }
00119 };
00120 
00121 Value_Type 
00122 CDbw::stdev() {
00123         Value_Type sum = 0;
00124         int i;
00125         for (i=1; i<= c; i++ ) 
00126                 sum += stdev_vv[i]*stdev_vv[i]; 
00127         return sqrt( sum / c );
00128 };
00129 
00130 TMatrix 
00131 CDbw::getClose_rep(int c_i, int c_j) 
00132 {
00133         int i, j;
00134         Value_Type tmp, min_dist = 999;
00135         TMatrix close_rep = create_matrix( 1, 2, 1, d );
00136         for (i=1; i<=2; i++) for (j=1; j<=d; j++) close_rep[i][j] = 0;
00137 
00138         for (i=1; i<=m; i++)
00139                 if ( v[i] == c_i ) {
00140                         for (j=1; j<=m; j++)
00141                                 if ( v[j] == c_j ) {
00142                                         tmp = dist( codebook[i], codebook[j], d );
00143                                         if ( tmp < min_dist ) {
00144                                                 min_dist = tmp;
00145                                                 close_rep[1] = codebook[i];
00146                                                 close_rep[2] = codebook[j];
00147                                         }
00148                                 }
00149                 }
00150         return close_rep;
00151 };
00152 
00153 Value_Type 
00154 CDbw::getDensity( TMatrix close_rep, int c_i, int c_j ) 
00155 {
00156         Value_Type tmp, min_dist, sum = 0;
00157         TVector u = create_vector( 1, d );
00158         Value_Type stdev1 = 0, stdev2 = 0;
00159         int i, l, j;
00160 
00161         for (i=1; i<=d; i++ ) {
00162                 u[i] = (close_rep[1][i] + close_rep[2][i])/2;
00163                 //stdev1 += stdev_v[ c_i ][i]*stdev_v[ c_i ][i];
00164                 //stdev2 += stdev_v[ c_j ][i]*stdev_v[ c_j ][i];
00165         }
00166         
00167         min_dist = ( stdev_vv[c_i] + stdev_vv[ c_j ] ) / 2;
00168 
00169         for (i=1; i<= m; i++ ) {
00170                 if ((v[i] == c_i) || (v[i] == c_j)) {
00171                         for (l=0; l< codebook_label[i-1].size(); l++ ) {
00172                                 for ( j=1; j<= n; j++) {
00173                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00174                                                 tmp = dist( entries[j], u , d );
00175                                                 if ( tmp <= min_dist )
00176                                                         ++sum;
00177                                                 break;
00178                                         }
00179                                 }
00180                         }
00181                 }
00182         }
00183         return sum/( num_v[c_i] + num_v[c_j] );
00184 };
00185 
00186 Value_Type 
00187 CDbw::Inter_dens() 
00188 {
00189         int i, j;
00190         TMatrix close_rep;
00191         Value_Type sum = 0;
00192         Value_Type stdev1 = 0, stdev2 = 0;
00193 
00194         for (i=1; i<= c; i++)
00195                 for (j=1; j<= c; j++ )
00196                         if ( i != j ) {
00197                                 close_rep = getClose_rep(i, j);                                         
00198                                 if ( ( stdev_vv[i] + stdev_vv[j] ) > 0 )
00199                                         sum += ( dist( close_rep[1], close_rep[2], d ) * getDensity( close_rep, i, j ) )/( stdev_vv[i] + stdev_vv[j] );                         
00200                         }
00201         return  sum;
00202 };
00203 
00204 Value_Type 
00205 CDbw::Sep() 
00206 {
00207         int i, j;
00208         TMatrix close_rep;
00209         Value_Type  sum = 0;
00210 
00211         for (i=1; i<= c; i++)           
00212                 for (j=1; j<= c; j++ )
00213                         if ( i != j ) {
00214                                 close_rep = getClose_rep(i, j);
00215                                 sum += dist( close_rep[1], close_rep[2], d );
00216                         }
00217         
00218         return sum / (1 + Inter_dens() ) ;
00219 };
00220 
00221 Value_Type 
00222 CDbw::getDensity_v( int c_i )
00223 {
00224         int i, j, l, k, r_j;
00225         Value_Type tmp, sum = 0;
00226         Value_Type stdev_value = stdev();
00227         int count = 0;
00228 
00229         for (k=1; k<= m; k++ ) {
00230                 if ( v[k] == c_i ) {
00231                         r_j = k; ++count;
00232                         for (i=1; i<=m; i++ )
00233                                 if ( v[i] == c_i ) 
00234                                         for (l=0; l < codebook_label[i-1].size(); l++ )
00235                                                 for (j=1; j<=n; j++ )
00236                                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00237                                                                 tmp = dist( entries[j], codebook[r_j], d );
00238                                                                 if ( tmp <= stdev_value ) 
00239                                                                         ++sum;
00240                                                                 break;
00241                                                         }
00242                 }
00243         }
00244         return ( sum / count );
00245 };
00246 
00247 
00248 Value_Type 
00249 CDbw::Intra_dens() {
00250         int i;
00251         Value_Type sum = 0;
00252         for (i=1; i<= c; i++ ) {
00253                 sum += getDensity_v( i );
00254                 //cout << "Density_v(" << i << ") = " << getDensity_v( i ) << endl;
00255         }
00256         return ( sum / c );
00257 };
00258 
00259 
00260 Value_Type 
00261 CDbw::Index() 
00262 {
00263         Value_Type intra = Intra_dens();
00264         Value_Type sep   = Sep();
00265         //cout << "Inter_dens = " << Inter_dens() << endl;
00266         //cout << "Intra_dens = " << intra << endl;
00267         //cout << "Sep = " << sep << endl;
00268         //cout << "Stdev = " << stdev();
00269         //printmatrix( stdev_v, 1, c, 1, d );
00270         
00271         return intra*sep;
00272 };
00273 
00274 #endif

Generated on Tue Aug 7 16:03:33 2007 for SOMCode by  doxygen 1.5.3