예제 #1
0
        public double Calculate(
            ISign <double>[] signs,
            Region region,
            IClusteringCenter <double> center)
        {
            double[] regionSignsValues = signs.Select(sign => sign.Calculate(region)).ToArray();

            double sum = regionSignsValues
                         .Zip(center.SignsValues, (first, second) => Math.Pow(first - second, 2))
                         .Sum();

            return(Math.Sqrt(sum));
        }
예제 #2
0
        public Region[] Distribute(Region[] sourceRegions)
        {
            InitializeClusterCenters(clustersNumber, signs.Length, sourceRegions);

            //InitializeClustersByRegions(clustersNumber, sourceRegions);

            bool clustersChanged = true;

            while (clustersChanged)
            {
                foreach (Region region in sourceRegions.Where(r => !r.IsCenter))
                {
                    int newClusterNumber = DetermineClusterNumber(region);

                    clustersChanged = newClusterNumber != region.Number;

                    region.Number = newClusterNumber;
                }

                foreach (IClusteringCenter <double> clusterCenter in clusterCenters)
                {
                    IClusteringCenter <double> center = clusterCenter;

                    Region[] clustersRegions = sourceRegions
                                               .Where(region => region.Number == center.Number && !region.IsCenter)
                                               .ToArray();

                    clusterCenter.Recalculate(signs, clustersRegions, centerDeterminingAlgorithm);

                    foreach (Region region in sourceRegions)
                    {
                        region.IsCenter = false;
                    }
                }
            }
            return(sourceRegions);
        }