DaviesBouldin.h

00001 #ifndef DaviesBouldin_H
00002 #define DaviesBouldin_H
00003 
00004 
00005 class DaviesBouldin {
00006 public:
00007         DaviesBouldin( SOM * som, TIntVector clusters, int num_clusters ) : _som(som), _clusters(clusters), _num_clusters(num_clusters) {};
00008         double Index(Value_Type p, Value_Type q);
00009 
00010 private:
00011         TIntVector _clusters;
00012         int _num_clusters;
00013         SOM * _som;
00014 };
00015 
00016 double 
00017 DaviesBouldin::Index(Value_Type p, Value_Type q)
00018 {
00019         int ii, i, j, k, l;
00020         int d  = _som->getMapcode()->getNumVar();
00021         TMatrix entries = _som->getData()->getEntries();
00022 
00023         TVector         _S                                      = create_vector( 1, _num_clusters );
00024         TMatrix         _cluster_centroid       = create_matrix(1, _num_clusters, 1, d );
00025         TIntVector      _num_vector_cluster = create_intvector( 1, _num_clusters );
00026         TMatrix         _M                                      = create_matrix( 1, _num_clusters,1, _num_clusters );
00027         TMatrix         _R                                      = create_matrix( 1, _num_clusters,1, _num_clusters );
00028 
00029         TvecLabel entries_label                 = _som->getData()->getId(); //getLabel();
00030         TLabel  codebook_label                  = _som->getMapcode()->getLabel();
00031         int n                                                   = _som->getData()->getDataSize();                                               
00032         int m                                                   = _som->getMapcode()->getMapSize();
00033 
00034         for (i=1; i<= _num_clusters; i++ ) {
00035                 _S[i] = 0.0; 
00036                 _num_vector_cluster[i] = 0;
00037                 for (j=1; j <= _num_clusters; j++ )     _R[i][j] = _M[i][j] = 0.0;
00038                 for (j=1; j<= d; j++ )  _cluster_centroid[i][j] = 0.0;
00039         }
00040 
00041         // Calculo dos centroides <<Dados de entrada>>
00042         TVector count = create_vector( 1, _num_clusters ); for (i=1;i<=_num_clusters; i++) count[i] = 0.0;
00043         for (i=1; i<=m; i++ ) {
00044                 if ( _clusters[i] > 0 ) {
00045                         for (l=0; l< codebook_label[i-1].size(); l++ )
00046                                 for (j=1; j<=n; j++) {
00047                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00048                                                 for (k=1; k<=d; k++ ) {                                                 
00049                                                         _cluster_centroid[_clusters[i] ][k] += entries[j][k];
00050                                                 }
00051                                                 ++count[ _clusters[i] ];
00052                                                 break;
00053                                         }
00054                         }
00055                 }
00056         }
00057 
00058         for (i=1; i<= _num_clusters; i++) for (k=1; k<=d; k++ ) _cluster_centroid[i][k] /= count[i];
00059 
00060                 // Calculo da distancia M entre os centroides ij
00061         Value_Type sum;
00062         for (i=1; i<= _num_clusters; i++)
00063                 for (j=1; j<= _num_clusters; j++) {
00064                         sum = 0.0;
00065                         for (k=1; k<= d; k++) sum += pow( fabs(_cluster_centroid[i][k] - _cluster_centroid[j][k]), p );
00066                         _M[i][j] = pow( sum, (1.0/p) );                 
00067                 }
00068 
00069                 // Calculo da dispersão S nos agrupamentos i
00070         for (i=1; i<=_num_clusters; i++) count[i] = 0.0;
00071 
00072         for (ii=1; ii<= _num_clusters; ii++)
00073         for (i=1; i<=m; i++ ) {
00074                 if ( _clusters[i] == ii ) {
00075                         for (l=0; l< codebook_label[i-1].size(); l++ )
00076                                 for (j=1; j<=n; j++) {
00077                                         if ( codebook_label[i-1][l] == entries_label[j-1] ) {
00078                                                 sum = 0.0;
00079                                                 for (k=1; k<=d; k++ ) {                                                 
00080                                                         sum += pow( fabs( entries[j][k] - _cluster_centroid[ii][k]), q );
00081                                                 }
00082                                                 _S[ii] += sum;
00083                                                 count[ii]++;
00084                                                 break;
00085                                         }
00086                         }
00087                 }
00088         }
00089 /*
00090         for (i=1; i<= _num_clusters; i++)
00091                 for (j=1; j<=m; j++ ) {
00092                         if ( _clusters[j] == i  ) {
00093                                 count[i]++;
00094                                 sum = 0.0;
00095                                 for (k=1; k<=d; k++) sum += pow( fabs( codebook[j][k] - _cluster_centroid[i][k]), q );                                                          
00096                                 _S[i] += sum;
00097                         }
00098                 }
00099 */
00100         for (i=1; i<= _num_clusters; i++)   _S[i] = pow( (_S[i]/count[i]) ,(1.0/q) );
00101         
00102 
00103 
00104         //printmatrix( _M, 1, _num_clusters,1,_num_clusters);
00105         //cout << endl;
00106         //for (i=1; i<= _num_clusters; i++ ) cout << _S[i] << " "; cout << endl;
00107 
00108         for (i=1; i<= _num_clusters; i++)
00109                 for (j=1; j<= _num_clusters; j++)
00110                         if ( i!=j )
00111                                 _R[i][j] = ( _S[i] + _S[j] )/ _M[i][j];
00112                         else
00113                                 _R[i][j] = 0;   
00114 
00115         //printmatrix( _R,1, _num_clusters,1,_num_clusters);
00116 
00117         double result = 0.0, max;
00118         for (i=1; i<= _num_clusters; i++) {
00119                 max = 0.0; 
00120                 for (j=1; j<= _num_clusters; j++) {
00121                         if (_R[i][j] > max)
00122                                 max = _R[i][j];
00123                 }
00124                 result += max;
00125         }
00126         
00127         result /= (double)_num_clusters;
00128 
00129         return result;
00130 };
00131 
00132 #endif

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