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);
        }