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();
00018 codebook_label = som->getMapcode()->getLabel();
00019 Init();
00020 };
00021 Value_Type Index();
00022
00023 private:
00024
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
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
00164
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
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
00266
00267
00268
00269
00270
00271 return intra*sep;
00272 };
00273
00274 #endif