35 #ifndef KMEANSSTRATEGY_D_H 36 #define KMEANSSTRATEGY_D_H 63 int beginIndex ,
int endIndex ,
67 switch( distanceType ){
82 ASSERT( beginIndex >= 0 && endIndex >= -1 ) ;
86 if( !codeVector.empty() )
108 if( initializationType ==
"CodeVectorsGiven" ){
109 std::cout <<
" vecteurs codes donnes" << std::endl << std::endl ;
113 for(
int i = 0 ; i < nbOfClasses ; ++i ){
118 else if( initializationType ==
"InitialClasses" ){
119 std::cout <<
" classes initiales" << std::endl << std::endl ;
120 std::vector< aims::Individuals<T> >
myMeanVector( nbOfClasses + 1 ) ;
127 std::cout <<
" individus donnes (tous ds la classe 0)" << std::endl ;
129 bool change = false ;
131 std::vector< Individuals<T> > meanVector( nbOfClasses + 1 ) ;
132 int tabRandInd[nbOfClasses] ;
133 std::cout <<
"Tirage des individus: " ;
135 for(
int c = 1 ; c <= nbOfClasses ; ++c ){
138 randInd = (int) ( ( (
double)rand() / (
double)(RAND_MAX+1.0) ) * (double)(classes[0].size()) ) ;
139 tabRandInd[c] = randInd ;
140 std::cout << randInd <<
" " ;
143 for(
int i = 1 ; i < c ; ++i ){
144 if( randInd == tabRandInd[i] ){
146 randInd = (int) ( ((
double)rand() / (double)(RAND_MAX+1.0)) * (
double)(classes[0].size()) ) ;
148 std::cout <<
"(" << randInd <<
")" <<
" " ;
151 }
while( change ==
true ) ;
154 typename std::list< aims::Individuals<T> >
::const_iterator iter( classes[0].begin() ),
155 last( classes[0].end() ) ;
157 while ( iter != last && count < randInd ){
161 meanVector[c] = *iter ;
163 std::cout << std::endl << std::endl ;
167 unsigned int maxIndex =
myMeanVector[1].value().size() ;
177 std::cout <<
"Kmeans clustering - Iteration n° " << nbOfIterations << std::endl ;
178 int nbOfClasses = classes.size() ;
179 std::vector< std::list< aims::Individuals<T> > > newClasses( nbOfClasses ) ;
187 for(
int c = 0 ; c < nbOfClasses ; ++c ){
188 typename std::list< aims::Individuals<T> >
::const_iterator iter( classes[c].begin() ),
189 last( classes[c].end() ) ;
190 while( iter != last ){
192 newClasses[indMin].push_back( *iter ) ;
198 classes = newClasses ;
200 std::cout <<
"nb d'individus - iterate end:" ;
201 for(
int c = 0 ; c < nbOfClasses ; ++c )
202 std::cout <<
" " << classes[c].size() ;
203 std::cout << std::endl ;
218 unsigned int nbOfClasses = classes.size() ;
221 std::vector< aims::Individuals<T> > meanVector( nbOfClasses ) ;
225 unsigned int valIndSize = classes[1].front().value().size() ;
226 std::vector<T> meanVal( valIndSize ) ;
227 std::vector<T> varVal( valIndSize ) ;
229 for(
unsigned int cl = 1 ; cl < nbOfClasses ; ++cl ){
230 unsigned int nbOfInd = classes[cl].size() ;
231 typename std::list< aims::Individuals<T> >
::const_iterator iter( classes[cl].begin() ),
232 last( classes[cl].end() ) ;
233 while ( iter != last){
234 Point3df indPos = iter->position() ;
235 meanPos[0] += indPos[0];
236 meanPos[1] += indPos[1];
237 meanPos[2] += indPos[2];
240 meanPos[0] = meanPos[0] / nbOfInd ;
241 meanPos[1] = meanPos[1] / nbOfInd ;
242 meanPos[2] = meanPos[2] / nbOfInd ;
244 for(
unsigned int k = 0 ; k < valIndSize ; ++k ){
245 typename std::list< aims::Individuals<T> >
::const_iterator iter( classes[cl].begin() ),
246 last( classes[cl].end() ) ;
247 float sumVal = 0., prodVal = 0. ;
248 while ( iter != last){
249 std::vector<T> indVal = iter->value() ;
250 sumVal += indVal[k] ;
251 prodVal += indVal[k] * indVal[k] ;
254 meanVal[k] = sumVal / nbOfInd ;
255 varVal[k] = prodVal / nbOfInd - meanVal[k] * meanVal[k] ;
260 meanVector[cl] = meanIndiv ;
261 myVarianceVector[cl] = varIndiv ;
271 float distanceToClass ;
277 for(
int newC = 2 ; newC < nbOfClasses ; ++newC ){
280 if( distanceToClass < min ){
282 min = distanceToClass ;
294 int nbOfClasses = classes.size() ;
296 double glob_dist = 0. ;
298 for(
int c = 1 ; c < nbOfClasses ; ++c ){
299 typename std::list< aims::Individuals<T> >
::const_iterator iter( classes[c].begin() ),
300 last( classes[c].end() ) ;
301 while( iter != last ){
303 glob_dist += (double) dist ;
315 float distanceToClass = 0. ;
318 return distanceToClass ;
virtual double globInertia(const std::vector< std::list< Individuals< T > > > &classes)
float min(float x, float y)
virtual ClassifStrategy< T > * clone() const
KmeansStrategy(const KmeansStrategy< T > &kmeanStrat)
virtual void init(std::string initializationType, int nbOfClasses, std::vector< std::list< Individuals< T > > > &classes)
std::vector< Individuals< T > > myMeanVector
float(* myDistance)(const std::vector< T > &ind1, const std::vector< T > &ind2, unsigned int beginIndex, unsigned int endIndex)
virtual void analyse(const std::vector< std::list< Individuals< T > > > &classes)
virtual float distance(const Individuals< T > &individual, int classe)
std::vector< Individuals< T > > myVarianceVector
virtual ~KmeansStrategy()
const std::vector< T > & value() const
virtual int aggregate(const Individuals< T > &individual)
virtual double iterate(int &nbOfIterations, std::vector< std::list< Individuals< T > > > &classes)