static std::vector<double> computeKMeans( KMdata & datapoints, uint64_t const k, uint64_t const runs, bool const debug ) { KMterm const term(runs, 0, 0, 0, 0.10, 0.10, 3, 0.50, 10, 0.95); datapoints.buildKcTree(); KMfilterCenters ctrs(k, datapoints); KMlocalHybrid kmAlg(ctrs, term); ctrs = kmAlg.execute(); std::vector<double> centrevector; for ( uint64_t i = 0; i < k; ++i ) { centrevector.push_back(ctrs[i][0]); if ( debug ) std::cerr << "centre[" << i << "]=" << ctrs[i][0] << std::endl; } std::sort(centrevector.begin(),centrevector.end()); return centrevector; }
int CVML_API doKMeans(int dim, int k, int numofSamples, std::vector<std::vector<double>>& _samples,std::vector<std::vector<double>> & center) { typedef double T; center.clear(); center.resize(k); try{ // execution parameters (see KMterm.h and KMlocal.h) KMterm term(100, 0, 0, 0, // run for 100 stages 0.10, 0.10, 3, // other typical parameter values 0.50, 10, 0.95); //int dim = 1; // dimension int nPts = numofSamples; // number of data points KMdata dataPts(dim, nPts); // allocate data storage //KMdata *dataPts = new KMdata(dim, nPts); for ( unsigned int i = 0 ; i < numofSamples ; i++ ){ for(int j=0;i<dim;j++){ dataPts[i][j] = _samples[i][j]; } } dataPts.buildKcTree(); // build filtering structure KMfilterCenters ctrs(k, dataPts); // allocate centers // run the algorithm //KMlocalLloyds kmAlg(ctrs, term); // repeated Lloyd's // KMlocalSwap kmAlg(ctrs, term); // Swap heuristic // KMlocalEZ_Hybrid kmAlg(ctrs, term); // EZ-Hybrid heuristic KMlocalHybrid kmAlg(ctrs, term); // Hybrid heuristic ctrs = kmAlg.execute(); // execute for ( unsigned int i = 0 ; i < k ; i++ ){ for(int j=0;i<dim;j++){ T v = static_cast<T>(ctrs[i][j]); center[i].push_back(v); } } return 1; } catch(...) { //cvml::TRACK("doKMeans error \n"); return 0; } return 1; }
vector<DataPoint> SpeechKMeans::WeightedKMeans(vector<DataPoint> &points, vector<double> &weights, int k) { KMterm term(100, 0, 0, 0, // run for 100 stages 0.10, 0.10, 3, // other typical parameter values 0.50, 10, 0.95); int dim = problems_.num_features(); // dimension int nPts = points.size(); // number of data points KMdata dataPts(dim, nPts); // allocate data storage for (int p = 0; p < nPts; ++p) { dataPts[p] = new double[dim]; for (int i = 0; i < dim; ++i) { dataPts[p][i] = points[p][i]; } } //kmUniformPts(dataPts.getPts(), nPts, dim); // generate random points dataPts.buildKcTree(); // build filtering structure KMfilterCenters ctrs(k, dataPts); // allocate centers // run the algorithm //KMlocalLloyds kmAlg(ctrs, term); // repeated Lloyd's // KMlocalSwap kmAlg(ctrs, term); // Swap heuristic // KMlocalEZ_Hybrid kmAlg(ctrs, term); // EZ-Hybrid heuristic KMlocalHybrid kmAlg(ctrs, term); // Hybrid heuristic ctrs = kmAlg.execute(); // execute // print number of stages cout << "Number of stages: " << kmAlg.getTotalStages() << "\n"; // print average distortion cout << "Average distortion: " << ctrs.getDist(false)/nPts << "\n"; ctrs.print(); // print final centers cerr << "copying points" << endl; vector<DataPoint> results(k); for (int j = 0; j < k; ++j) { results[j].resize(dim); for (int i = 0; i < dim; ++i) { results[j][i] = ctrs.getCtrPts()[j][i]; } } cerr << "done copying points" << endl; return results; }
int CVML_API doKMeans(int dim, int k, int numofSamples, const double * _samples, double*& center) { typedef double T; if(center) { delete [] center; center=0; } center = new T[k*dim]; memset( center,0,sizeof(T)*k*dim ); try{ // execution parameters (see KMterm.h and KMlocal.h) KMterm term(100, 0, 0, 0, // run for 100 stages 0.10, 0.10, 3, // other typical parameter values 0.50, 10, 0.95); //int dim = 1; // dimension int nPts = numofSamples; // number of data points KMdata dataPts(dim, nPts); // allocate data storage //KMdata *dataPts = new KMdata(dim, nPts); for ( unsigned int i = 0 ; i < numofSamples ; i++ ){ for(int j=0;i<dim;j++){ int idx = i * dim + j; dataPts[i][j] = _samples[idx]; } } dataPts.buildKcTree(); // build filtering structure KMfilterCenters ctrs(k, dataPts); // allocate centers // run the algorithm //KMlocalLloyds kmAlg(ctrs, term); // repeated Lloyd's // KMlocalSwap kmAlg(ctrs, term); // Swap heuristic // KMlocalEZ_Hybrid kmAlg(ctrs, term); // EZ-Hybrid heuristic KMlocalHybrid kmAlg(ctrs, term); // Hybrid heuristic ctrs = kmAlg.execute(); // execute for ( unsigned int i = 0 ; i < k ; i++ ){ for(int j=0;i<dim;j++){ int idx = i * dim + j; center[idx] = static_cast<T>(ctrs[i][j]); } } return 1; } catch(...) { //cvml::TRACK("doKMeans error \n"); return 0; } return 1; }