public static Dictionary <List <double>, List <double> > MakeClusters(List <List <double> > points, List <List <double> > clusterCenters) { Dictionary <List <double>, List <double> > distancesToClusterCenters = AlgorithmsUtils.CalculateDistancesToClusterCenters(points, clusterCenters); Dictionary <List <double>, List <double> > clusters = new Dictionary <List <double>, List <double> >(); foreach (KeyValuePair <List <double>, List <double> > distanceToClusterCenter in distancesToClusterCenters) { int clusterNumber = ListUtils.GetMinIndex(distanceToClusterCenter.Value); clusters.Add(distanceToClusterCenter.Key, clusterCenters[clusterNumber]); } return(clusters); }
public ActionResult <KMeansResponse> Post([FromForm(Name = "file")] IFormFile file, [FromQuery] int numberOfClusters = 3) { var lines = _getScvRows.GetLines(file); var points = lines.Transform(); var result = new KMeansResponse(); var centroid = new Centroids(); List <List <double> > clusterCenters = AlgorithmsUtils.MakeInitialSeeds(points, numberOfClusters); bool stop = false; Dictionary <List <double>, List <double> > clusters = null; while (!stop) { _logger.LogInformation($"Iteration = {iteration}"); iteration++; clusters = KMeansAlgorithm.MakeClusters(points, clusterCenters); List <List <double> > oldClusterCenters = clusterCenters; //recalculete center of clusters clusterCenters = KMeansAlgorithm.RecalculateCoordinateOfClusterCenters(clusters, clusterCenters); if (ListUtils.IsListEqualsToAnother(clusterCenters, oldClusterCenters)) { int counter = 1; stop = true; result.Centroids = new Centroids(); var list = new List <PointsAndClusterNumber>(); foreach (var center in clusterCenters) { var map = clusters.Where(point => ListUtils.IsListEqualsToAnother(point.Value, center)); foreach (var item in map) { var pointAndCluster = new PointsAndClusterNumber() { Point = new List <double>() }; pointAndCluster.Point = item.Key; pointAndCluster.ClusterNumber = counter; list.Add(pointAndCluster); } counter++; } result.PointsAndClusterNumber = list; result.Centroids.Centroid = clusterCenters; } } return(Ok(result)); }