public void FillDistanceMatrix() //заполнение матрицы расстояний - расстояния от элементов до центроидов по (i) - элементы, по (j) - центроиды { DistanceMatrix = new double[Elements.Count, Centroids.Count]; for (int i = 0; i < Elements.Count; ++i) { for (int j = 0; j < Centroids.Count; ++j) { DistanceMatrix[i, j] = Elements.ElementAt(i).EuclideanDistance(Centroids.ElementAt(j)); } } }
public MultiDimensionalVector FindClosestCentroid(MultiDimensionalVector element) //нахождение ближайшего центроида для элемента { int indexElement = Elements.IndexOf(element); int indexClosestCentroid = 0; double min = double.MaxValue; for (int j = 0; j < Centroids.Count; ++j) { if (DistanceMatrix[indexElement, j] < min) { min = DistanceMatrix[indexElement, j]; indexClosestCentroid = j; } } MultiDimensionalVector ClosestCentroid = Centroids.ElementAt(indexClosestCentroid); return(ClosestCentroid); }
public bool EqualPrevAndNewCentroids(double epsilon) //сравнение новых вычисленных центроидов для каждого кластера Cluster.Centroid с имеющимися центроидами (Centroids), вычисление с погрешностью epsilon { bool equivalent = true; for (int i = 0; i < Centroids.Count; ++i) { //if (Centroids.ElementAt(i) == Clusters.ElementAt(i).Centroid) MultiDimensionalVector differentVector = Centroids.ElementAt(i) - Clusters.ElementAt(i).Centroid; foreach (var coord in differentVector) { if (Math.Abs(coord) > epsilon) { equivalent = false; break; } } } return(equivalent); }