std::vector<int> Quantizer2::getDiscreteSequence(Gesture& gesture){ this->init(gesture); std::vector<Sample_3d> data = gesture.getData(); int size = data.size(); // associazioni (componente della gesture) <-> centroide std::vector<int> assoc; for(int i=0; i<size; i++) assoc.push_back(-1); // n° vettori associati a ciascun centroide int numVectPerCentroid[n_centroids]; for(int i=0; i<n_centroids; i++ ) numVectPerCentroid[i] = 0; // determina centroide a distanza minima per ogni vettore for(int i=0; i<size; i++){ // minima distanza finora riscontrata double min_dist = std::numeric_limits<double>::max(); // centroide a minima distanza int centroid_count = -1; for(int j=0; j<n_centroids; j++){ // calcola la distanza dell'elemento dal centroide corrente double d = distance(data.at(i), centroids[j]); // se la nuova distanza è minore della minima finora riscontrata, // allora il centroide è il più vicino if(d < min_dist){ min_dist = d; centroid_count = j; } }//j // associa il sample al centroide più vicino if(assoc.at(i) != centroid_count){ assoc.at(i) = centroid_count; } }//i return assoc; }
void Quantizer2::train(std::vector<Gesture> gestures, int considered_gestures){ //metagesture: contiene tutte le componenti di tutte le gesture. Gesture gesture; //costruzione della metagesture int gesture_number; if(considered_gestures<gestures.size()){ gesture_number = considered_gestures; }else{ gesture_number = gestures.size(); } for(int k=0; k<gesture_number; k++){ std::vector<Sample_3d> curGesturData = gestures.at(k).getData(); for(int w=0; w<curGesturData.size(); w++){ gesture.add( curGesturData.at(w) ); } } this->init(gesture); std::vector<Sample_3d> data = gesture.getData(); int size = data.size(); // associazioni (componente della gesture) <-> centroide int* assoc = new int[size]; for(int i=0; i<size; i++) assoc[i] = -1; // n° vettori associati a ciascun centroide // contando il centroide stesso! (infatti si inizializza a 1) int numVectPerCentroid[n_centroids]; for(int i=0; i<n_centroids; i++ ) numVectPerCentroid[i] = 1; bool modified; int n_iter = 0; do{ // determina centroide a distanza minima per ogni vettore modified = false; for(int i=0; i<size; i++){ // minima distanza finora riscontrata double min_dist = std::numeric_limits<double>::max(); // centroide a minima distanza int centroid_count = -1; for(int j=0; j<n_centroids; j++){ // calcola la distanza dell'elemento dal centroide corrente double d = distance(data.at(i), centroids[j]); // se la nuova distanza è minore della minima finora riscontrata, // aggiorna il centroide più vicino if(d < min_dist){ min_dist = d; centroid_count = j; } }//j // associa il sample al centroide più vicino if(assoc[i] != centroid_count){ assoc[i] = centroid_count; modified = true; } }//i // ricalcola posizione dei centroidi for(int i=0; i<size; i++){ numVectPerCentroid[assoc[i]]++; centroids[assoc[i]] += data.at(i); } for(int j=0; j<n_centroids; j++) centroids[j] /= numVectPerCentroid[j]; n_iter++; } while(modified && n_iter < 100); }