// method for calculating euclidean distances public double EuclideanDistance(DataClass.DataPoint point, ClusterClass.ClusterCenter center) { double distance = 0; double a = point.CoordX - center.CoordX; double b = point.CoordY - center.CoordY; distance = Math.Sqrt((Math.Pow(a, 2)) + (Math.Pow(b, 2))); return(distance); }
// update step of algorithm public void UpdateStep() { DataClass.NumberOfDataPoints = DataClass.Data.Count; ClusterClass.NumberOfClusters = ClusterClass.Cluster.Count; int CentersNotChanged = 0; for (int i = 0; i < ClusterClass.NumberOfClusters; i++) { double NewCoordX = 0; double NewCoordY = 0; var ClusterMembers = from a in Assignments where a.Value.ID == ClusterClass.Cluster[i].ID select a.Key; foreach (var cm in ClusterMembers) { NewCoordX = NewCoordX + cm.CoordX; NewCoordY = NewCoordY + cm.CoordY; } int ClusterSize = ClusterMembers.Count(); NewCoordX = NewCoordX / ClusterSize; NewCoordY = NewCoordY / ClusterSize; if (NewCoordX == ClusterClass.Cluster[i].CoordX && NewCoordY == ClusterClass.Cluster[i].CoordY) { CentersNotChanged = CentersNotChanged + 1; } else { ClusterClass.ClusterCenter center = ClusterClass.Cluster[i]; center.ID = i; center.CoordX = NewCoordX; center.CoordY = NewCoordY; ClusterClass.Cluster[i] = center; } } if (CentersNotChanged == ClusterClass.NumberOfClusters) { StopAlgorithm = true; } else { StopAlgorithm = false; } }