public void Cluster() { var iterations = 0; var improved = true; while (improved && (iterations < 100)) { Console.WriteLine("\nCentroids updated:"); View.View.Show(this); foreach (var point in Points) { var distance = Distance.Compare(point, Centroids[0]); point.Cluster = 0; for (var i = 1; i < Clusters; i++) { if (distance > Distance.Compare(point, Centroids[i])) { point.Cluster = i; } } } Console.WriteLine("\nClusters updated:"); View.View.Show(this); var oldCentroids = new List <Point>(); for (var i = 0; i < Clusters; i++) { oldCentroids.Add(new Point(Centroids[i])); } for (var i = 0; i < Clusters; i++) { var newX = 0.0; var newY = 0.0; var cluster = i; var clusterPoints = new List <Point>(Points.Where(p => p.Cluster == cluster)); if (clusterPoints.Count == 0) { continue; } foreach (var point in clusterPoints) { newX += point.X; newY += point.Y; } Centroids[i].X = newX / clusterPoints.Count; Centroids[i].Y = newY / clusterPoints.Count; } improved = false; for (var i = 0; i < Clusters; i++) { if ((Math.Abs(Centroids[i].X - oldCentroids[i].X) < 0.0001) && (Math.Abs(Centroids[i].Y - oldCentroids[i].Y) < 0.0001)) { continue; } improved = true; break; } iterations++; } Console.WriteLine("\nCentroids updated:"); View.View.Show(this); }