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();
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
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
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
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
00091
00092
00093
00094
00095
00096
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
00105
00106
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
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