public List <Point> Clusterize(VoronoiDiagramContext Context) { Neurons = NeurGen.GetNeurons(ClusterCount, Xrange, Yrange); foreach (Point Point in Points) { double ClosestDistance = double.MaxValue; int BestSoFar = -1; for (int i = 0; i < ClusterCount; i++) { if (Neurons[i].CalculateDistanceFrom(Point) < ClosestDistance) { // Console.WriteLine("Distance from Neuron" + i.ToString() + Neurons[i].CalculateDistanceFrom(Point) ); BestSoFar = i; ClosestDistance = Neurons[i].CalculateDistanceFrom(Point); } } Clusters[BestSoFar].Add(Point); //Console.WriteLine("Assigned to: " + BestSoFar.ToString()); } ; for (int Iteration = 0; Iteration < MaxIters; Iteration++) { Point Err = new Point(Iteration, 0.0); for (int i = 0; i < ClusterCount; i++) { { Double ErrorComponent = 0.0; Point Mean = CalculateMean(Clusters[i]); ErrorComponent = Neurons[i].CalculateDistanceFrom(Mean); Err.YCoordinate += ErrorComponent; //if(Iteration == 0 || Iteration == 1) Console.WriteLine(i.ToString() + Neurons[i].GetAsPoint().XCoordinate + " " + Neurons[i].GetAsPoint().YCoordinate + " MEAN " + Mean.XCoordinate + " " + Mean.YCoordinate); Neurons[i].UpdateWeight(Mean.XCoordinate, Mean.YCoordinate); } Error.Add(Err); } ; //reassign clusters; for (int i = 0; i < ClusterCount; i++) { Clusters[i] = new List <Point>(); } foreach (Point Point in Points) { double ClosestDistance = double.MaxValue; int BestSoFar = -1; for (int i = 0; i < ClusterCount; i++) { if (Neurons[i].CalculateDistanceFrom(Point) < ClosestDistance) { BestSoFar = i; ClosestDistance = Neurons[i].CalculateDistanceFrom(Point); } } Clusters[BestSoFar].Add(Point); } ; List <Point> Voro = new List <Point>(); foreach (Neuron Neuron in Neurons) { Voro.Add(Neuron.GetAsPoint()); } VoronoiDiagram.CreateImage(Context, Voro).Save("KMEANS" + Iteration.ToString() + "Means" + ClusterCount.ToString() + ".png"); } return(Error); }
public void NeuronListSort(List <Neuron> Neurons) { Neuron Comparer = new Neuron(new double[] { 1.0, 2.0 }); Neurons.Sort(); }