Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. vector<size_t> KMeans(const vector<double>& data, size_t K) {
  2.     size_t dimensions = dim;
  3.     size_t d_size = data.size();
  4.     size_t data_size = d_size / dimensions;
  5.     vector<size_t> clusters(data_size);
  6.     size_t new_size = K * dimensions;
  7.     // Initialize centroids randomly at data points
  8.     vector<double> centroids(new_size);
  9.     for (size_t i = 0; i < K; i++) {
  10.         if (dim == 2) {
  11.             size_t index = UniformRandom(data_size - 1);
  12.             centroids[2 * i] = data[2 * index];
  13.             centroids[2 * i + 1] = data[2 * index + 1];
  14.         } else {
  15.             continue;
  16.         }
  17.     }
  18.  
  19.     bool converged = false;
  20.     while (!converged) {
  21.         converged = true;
  22.         for (size_t i = 0; i < data_size; ++i) {
  23.             // делать точку из data[i], if dim == 2
  24.             Point tmp;
  25.             tmp.push_back(data[i * dimensions]);
  26.             tmp.push_back(data[i * dimensions + 1]);
  27.             size_t nearest_cluster = FindNearestCentroid(centroids, tmp/*FIXED*/);
  28.             if (clusters[i] != nearest_cluster) {
  29.                 clusters[i] = nearest_cluster;
  30.                 converged = false;
  31.             }
  32.         }
  33.         if (converged) {
  34.             break;
  35.         }
  36.         vector<size_t> clusters_sizes(K);
  37.         vector<double> centroids(K * dimensions);
  38.         for (size_t i = 0; i < data_size; ++i) {     // добавить хардкод для dim == 2
  39.             for (size_t d = 0; d < dimensions; ++d) {
  40.                 centroids[clusters[i] * dimensions + d] += data[i * dimensions + d];
  41.             }
  42.             ++clusters_sizes[clusters[i]];
  43.         }
  44.         for (size_t i = 0; i < K; ++i) {
  45.             if (clusters_sizes[i] != 0) {
  46.                 for (size_t d = 0; d < dimensions; ++d) {
  47.                     centroids[i * dimensions + d] /= clusters_sizes[i];
  48.                 }
  49.             }
  50.         }
  51.         for (size_t i = 0; i < K; ++i) {
  52.             if (clusters_sizes[i] == 0) {
  53.                 auto el = GetRandomPosition(centroids);
  54.                 if (dimensions == 2) {
  55.                     centroids[i * 2] = el[0];
  56.                     centroids[i * 2 + 1] = el[1];
  57.                 } else {
  58.                     for (size_t j = 0; j < el.size(); ++j) {
  59.                         centroids[i * dimensions + j] = el[j];
  60.                     }
  61.                 }
  62.             }
  63.         }
  64.     }
  65.     return clusters;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement