28 #ifndef __INCLUDE_MIST_KMEANS__
29 #define __INCLUDE_MIST_KMEANS__
31 #ifndef __INCLUDE_MIST_H__
35 #ifndef __INCLUDE_MIST_RANDOM__
36 #include "../random.h"
39 #ifndef __INCLUDE_MIST_CRITERIA__
51 double nearestCenter(
const matrix< double > &in,
int col,
const matrix< double > ¢er,
int n,
int &idx )
55 for(
int i = 0 ; i < n ; ++i )
58 for(
int j = 0 ; j < static_cast< int >( in.rows() ) ; ++j )
60 dist += pow( in( j, col ) - center( j, i ), 2.0 );
80 inline void clustering(
81 const matrix< double > &in,
83 array1< int > &response,
84 matrix< double > ¢er,
85 criteria crt = criteria( criteria::iteration, 0.0, 20 ) )
87 response.resize( in.cols() );
88 center.resize( in.rows(), k );
91 matrix< double > minv( in.rows(), 1 );
92 matrix< double > maxv( in.rows(), 1 );
93 for(
size_t i = 0 ; i < in.rows() ; ++i )
97 for(
size_t j = 0 ; j < in.cols() ; ++j )
99 minv( i, 0 ) = min( minv( i, 0 ), in( i, j ) );
100 maxv( i, 0 ) = max( maxv( i, 0 ), in( i, j ) );
118 for(
int i = 0 ; i < k ; ++i )
122 for(
int j = 0 ; j < static_cast< int >( in.rows() ) ; ++j )
124 center( j, i ) = minv( j, 0 ) + rnd.real3() * ( maxv( j, 0 ) - minv( j, 0 ) );
136 double max_prob = 0.0;
138 for(
int l = 0 ; l < static_cast< int >( in.cols() ) ; ++l )
141 double prob = detail::nearestCenter( in, l, center, i, idx );
142 if( prob > max_prob )
149 for(
int j = 0 ; j < static_cast< int >( in.rows() ) ; ++j )
151 center( j, i ) = in( j, max_idx );
156 array1< bool > is_set( k );
157 for(
int m = 0 ; ( crt.type & criteria::iteration ) ? ( m < crt.max_itr ) : true ; ++m )
159 bool is_finish =
true;
160 is_set.fill(
false );
163 for(
size_t i = 0 ; i < in.cols() ; ++i )
183 detail::nearestCenter( in, i, center, k, minidx );
185 if( response( i ) != minidx )
187 response( i ) = minidx;
190 is_set( minidx ) =
true;
194 for(
int i = 0 ; i < k ; ++i )
196 for(
size_t j = 0 ; j < center.rows() ; ++j )
202 for(
size_t j = 0 ; j < in.cols() ; ++j )
204 if( response( j ) == i )
206 for(
size_t l = 0 ; l < center.rows() ; ++l )
208 center( l, i ) += in( l, j );
216 for(
size_t j = 0 ; j < center.rows() ; ++j )
218 center( j, i ) /= cnt;
231 array1< int > idx_map( k );
233 for(
size_t i = 0 ; i < is_set.size() ; ++i )
237 idx_map( i ) = cnt++;
248 matrix< double > tmp = center;
249 center.resize( in.rows(), cnt );
252 for(
size_t i = 0 ; i < tmp.cols() ; ++i )
256 for(
size_t j = 0 ; j < tmp.rows() ; ++j )
258 center( j, c ) = tmp( j, i );
264 for(
size_t i = 0 ; i < response.size() ; ++i )
266 response( i ) = idx_map( response( i ) );