Advertisement
Guest User

Untitled

a guest
Oct 20th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.30 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <random>
  5. #include <set>
  6. #include <string>
  7. #include <vector>
  8. #include <math.h>
  9.  
  10. using namespace std;
  11.  
  12. namespace clustering {
  13.  
  14. struct Point2D {
  15. double x, y;
  16. };
  17.  
  18. double EuclidianDistance(const Point2D& first, const Point2D& second) {
  19. return std::sqrt((first.x - second.x) * (first.x - second.x) +
  20. (first.y - second.y) * (first.y - second.y));
  21. }
  22.  
  23. vector<Point2D> Random2DClusters(const vector<Point2D>& centers,
  24. const vector<double>& xVariances,
  25. const vector<double>& yVariances,
  26. size_t pointsCount) {
  27. auto baseGenerator = std::default_random_engine();
  28. auto generateCluster = std::uniform_int_distribution<size_t>(0, centers.size() - 1);
  29. auto generateDeviation = std::normal_distribution<double>();
  30.  
  31. vector<Point2D> results;
  32. for (size_t i = 0; i < pointsCount; ++i) {
  33. size_t c = generateCluster(baseGenerator);
  34. double x = centers[c].x + generateDeviation(baseGenerator) * xVariances[c];
  35. double y = centers[c].y + generateDeviation(baseGenerator) * yVariances[c];
  36. results.push_back({ x, y });
  37. }
  38.  
  39. return results;
  40. }
  41.  
  42. // Generate files for plotting in gnuplot
  43. void GNUPlotClusters2D(const vector<Point2D>& points,
  44. const vector<size_t>& labels,
  45. size_t clustersCount,
  46. const string& outFile) {
  47.  
  48. std::ofstream fileOut(outFile);
  49. for (size_t cluster = 0; cluster < clustersCount; ++cluster) {
  50. for (size_t i = 0; i < points.size(); ++i) {
  51. if (labels[i] == cluster) {
  52. fileOut << points[i].x << "\t" << points[i].y << std::endl;
  53. }
  54. }
  55. fileOut << "--" << std::endl;
  56. }
  57. }
  58.  
  59. vector<Point2D> Random2DClusters(size_t clusterCount, size_t pointsCount) {
  60. // for large number of clusters
  61. auto generator = std::default_random_engine();
  62. auto variance = std::uniform_real_distribution<double>(0.2, 2);
  63. auto mean = std::uniform_real_distribution<double>(-30, 30);
  64. auto deviation = std::normal_distribution<double>();
  65. auto clusterNumber = std::uniform_int_distribution<size_t>(0, clusterCount - 1);
  66.  
  67. vector<double> xVariances(clusterCount, 0);
  68. vector<double> yVariances(clusterCount, 0);
  69. vector<double> xMeans(clusterCount, 0);
  70. vector<double> yMeans(clusterCount, 0);
  71.  
  72. for (size_t i = 0; i < clusterCount; ++i) {
  73. xVariances[i] = variance(generator);
  74. yVariances[i] = variance(generator);
  75. xMeans[i] = mean(generator);
  76. yMeans[i] = mean(generator);
  77. }
  78.  
  79. vector<Point2D> results;
  80.  
  81. for (size_t i = 0; i < pointsCount; ++i) {
  82. size_t c = clusterNumber(generator);
  83. double x = xMeans[c] + deviation(generator) * xVariances[c];
  84. double y = yMeans[c] + deviation(generator) * yVariances[c];
  85. results.push_back({ x, y });
  86. }
  87.  
  88. return results;
  89. }
  90.  
  91. }
  92.  
  93.  
  94. vector<size_t> ClusterMST(
  95. const vector<clustering::Point2D>& objects, size_t clusterCount) {
  96. vector<size_t> subtrees;
  97. vector<pair<float, pair<int, int> > > edges;
  98. for (size_t i = 0; i != objects.size(); ++i) {
  99. subtrees.push_back(i);
  100. }
  101. for (size_t i = 0; i != objects.size(); ++i) {
  102. for (size_t j = i + 1; j != objects.size(); ++j) {
  103. edges.push_back(make_pair(sqrt((objects[i].x - objects[j].x)*(objects[i].x - objects[j].x)
  104. + (objects[i].y - objects[j].y)*(objects[i].y - objects[j].y)), make_pair(i, j)));
  105. }
  106. }
  107. sort(edges.begin(), edges.end());
  108. vector<pair<int, int> > min_tree;
  109. int count = 0;
  110. for (size_t i = 0; i != edges.size(); ++i) {
  111. if (subtrees[edges[i].second.first] != subtrees[edges[i].second.second]) {
  112. ++count;
  113. int replace_from = subtrees[edges[i].second.first];
  114. int replace_to = subtrees[edges[i].second.second];
  115. for (size_t j = 0; j != subtrees.size(); ++j) {
  116. if (subtrees[j] == replace_from) {
  117. subtrees[j] = replace_to;
  118. }
  119. }
  120. min_tree.push_back(edges[i].second);
  121. if (min_tree.size() == objects.size() - clusterCount) {
  122. break;
  123. }
  124. }
  125. }
  126. std::set<int> exc;
  127. for (auto elem : subtrees) {
  128.  
  129. }
  130. return subtrees;
  131. }
  132.  
  133.  
  134.  
  135. int main() {
  136. auto points = clustering::Random2DClusters(
  137. { { 0, 0 },{ 1, 2 },{ 2, 1 } },
  138. { 0.35, 0.1, 0.35 },
  139. { 0.2, 0.1, 0.1 },
  140. 1000);
  141.  
  142. vector<size_t> labels(points.size(), 0);
  143.  
  144. size_t clustersCount = 3;
  145. labels = ClusterMST(points, clustersCount);
  146. clustering::GNUPlotClusters2D(points, labels, clustersCount, "./-f");
  147.  
  148.  
  149. system("pause");
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement