/// <summary> /// recalculates the centroid of a cluster based on its current members /// </summary> public void ReCalculateCentroid() { int maxFeature = this.currentCentroid.ExpectedNoOfFeatures; if (this.members.Count == 0)//implement better check #### TO-DOOOO { } else { //calculate the mean value for each attribute of the current centroid Observation newCentroid = new Observation(maxFeature); newCentroid = members.ElementAt(0); for (int i = 0; i < maxFeature; i++) { for (int j = 1; j < this.members.Count; j++) { newCentroid.ReplaceFeature(i, newCentroid.GetFeature(i).Sum(this.members.ElementAt(j).GetFeature(i))); } newCentroid.ReplaceFeature(i, newCentroid.GetFeature(i).Average(this.members.Count)); } this.prevCentroid = currentCentroid; this.currentCentroid = newCentroid; } }
public int GetDistance(Observation observation) { //#### CONSIDER NORMALIZING in KMEANS int runningSum = 0; for (int i = 0; i < this.features.Count; i++) { runningSum += this.features.ElementAt(i).CalculateDistance(observation.GetFeature(i)); } return(runningSum); }