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