public void NextEpoch(List <Point> points) { SimilarityCalculator.DistanceCalculationAlgorithm algorithm = SimilarityCalculator.EuclideanDistance; foreach (Point point in points) { Point winnerNeuronCoordinate = new Point(0, 0); double minimumSimilarity = int.MaxValue; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { double similarity = point.SimilarityTo(neurons[i, j].coordinate, algorithm); if (similarity < minimumSimilarity) { minimumSimilarity = similarity; winnerNeuronCoordinate = new Point(i, j); } } } Neuron winnerNeuron = neurons[winnerNeuronCoordinate.X, winnerNeuronCoordinate.Y]; int newX = (int)(winnerNeuron.coordinate.X + rataInvatare[epoch] * (point.X - winnerNeuron.coordinate.X)); int newY = (int)(winnerNeuron.coordinate.Y + rataInvatare[epoch] * (point.Y - winnerNeuron.coordinate.Y)); winnerNeuron.coordinate = new Point(newX, newY); SetNeuron(winnerNeuronCoordinate.X, winnerNeuronCoordinate.Y, winnerNeuron); } epoch++; }
private void stepToolStripMenuItem_Click(object sender, EventArgs e) { foreach (Centroid centroid in centroids) { centroid.points.Clear(); } SimilarityCalculator.DistanceCalculationAlgorithm algorithm = SimilarityCalculator.EuclideanDistance; for (int i = 0; i < points.Count; i++) { double minimumSimilarity = Int32.MaxValue; int centroidIndex = -1; for (int j = 0; j < centroids.Count; j++) { double similarity = points[i].SimilarityTo(centroids[j].Coordinate, algorithm); if (similarity < minimumSimilarity) { minimumSimilarity = similarity; centroidIndex = j; } } centroids[centroidIndex].points.Add(points[i]); } chart.Series.Clear(); foreach (Centroid centroid in centroids) { centroid.RecalculateCoordinate(); Series series = CreateSeries(new List <Point> { centroid.Coordinate }); series.MarkerSize = 30; series.Color = centroid.color; chart.Series.Add(series); series = CreateSeries(centroid.points); series.Color = Color.FromArgb(127, centroid.color); chart.Series.Add(series); } }
public static double SimilarityTo(this Point point1, Point point2, SimilarityCalculator.DistanceCalculationAlgorithm algorithm) { return(algorithm(point1, point2)); }