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 ;
111 if(
int(myMeanVector.size()) != nbOfClasses )
112 this->myValidStrategy = false ;
113 for(
int i = 0 ; i < nbOfClasses ; ++i ){
114 if( myMeanVector[i].value().size() != myMeanVector[1].value().size() )
115 this->myValidStrategy = false ;
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 ;
164 myMeanVector = meanVector ;
167 unsigned int maxIndex = myMeanVector[1].value().size() ;
168 if( ( myEndIndex == -1 ) || ( (
unsigned int)myEndIndex >= maxIndex ) )
169 myEndIndex = maxIndex - 1 ;
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 ){
191 int indMin = aggregate( *iter ) ;
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 ;
206 double new_inertia = globInertia( classes ) ;
218 unsigned int nbOfClasses = classes.size() ;
221 std::vector< aims::Individuals<T> > meanVector( nbOfClasses ) ;
222 std::vector< aims::Individuals<T> > myVarianceVector( 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 ;
263 myMeanVector = meanVector ;
271 float distanceToClass ;
272 int nbOfClasses = myMeanVector.size() ;
275 float min = myDistance( individual.
value(), myMeanVector[1].value(),
276 myBeginIndex, myEndIndex ) ;
277 for(
int newC = 2 ; newC < nbOfClasses ; ++newC ){
278 distanceToClass = myDistance( individual.
value(), myMeanVector[newC].value(),
279 myBeginIndex, myEndIndex ) ;
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 ){
302 dist = myDistance( iter->value(), myMeanVector[c].value(), myBeginIndex, myEndIndex ) ;
303 glob_dist += (double) dist ;
315 float distanceToClass = 0. ;
316 distanceToClass = myDistance( individual.
value(), myMeanVector[classe].value(),
317 myBeginIndex, myEndIndex ) ;
318 return distanceToClass ;
const std::vector< T > & value() const
virtual int aggregate(const Individuals< T > &individual)
virtual ~KmeansStrategy()
virtual ClassifStrategy< T > * clone() const
virtual void init(std::string initializationType, int nbOfClasses, std::vector< std::list< Individuals< T > > > &classes)
virtual double iterate(int &nbOfIterations, std::vector< std::list< Individuals< T > > > &classes)
virtual double globInertia(const std::vector< std::list< Individuals< T > > > &classes)
virtual float distance(const Individuals< T > &individual, int classe)
float(* myDistance)(const std::vector< T > &ind1, const std::vector< T > &ind2, unsigned int beginIndex, unsigned int endIndex)
KmeansStrategy(const KmeansStrategy< T > &kmeanStrat)
virtual void analyse(const std::vector< std::list< Individuals< T > > > &classes)
std::vector< Individuals< T > > myMeanVector
std::vector< Individuals< T > > myVarianceVector
float min(float x, float y)