private void PointsСlassification() { for (int i = 0; i < class_count; i++) { OldKernels[i] = NewKernels[i]; CountPointsInClasses[i] = 0; } for (int i = 0; i < points_count; i++) { ClassDistance[] distances = new ClassDistance[class_count]; ClassDistance min; for (int j = 0; j < class_count; j++) { distances[j].Class = j; distances[j].distance = EvklidDistance(Points[i], NewKernels[j]); } min.Class = distances[0].Class; min.distance = distances[0].distance; for (int k = 1; k < class_count; k++) { if (distances[k].distance < min.distance) { min.Class = distances[k].Class; min.distance = distances[k].distance; } } Points[i].Class = min.Class; CountPointsInClasses[Points[i].Class]++; } }
private void button3_Click(object sender, EventArgs e) { int step = 0; DateTime start_time = DateTime.Now; bool is_class_change = true; string caption = "Найдены наилучшие ядра", message; while (is_class_change) { point[,] PointsInClasses = new point[class_count, MAX_POINTS_COUNT]; int[] CountPointsInClasses = new int[class_count]; step++; is_class_change = false; for (int i = 0; i < class_count; i++) { OldKernels[i] = NewKernels[i]; CountPointsInClasses[i] = 0; } for (int i = 0; i < points_count; i++) //Points classification { ClassDistance[] distances = new ClassDistance[class_count]; ClassDistance min; for (int j = 0; j < class_count; j++) { distances[j].Class = j; distances[j].distance = EvklidDistance(Points[i], NewKernels[j]); } min.Class = distances[0].Class; min.distance = distances[0].distance; for (int k = 1; k < class_count; k++) { if (distances[k].distance < min.distance) { min.Class = distances[k].Class; min.distance = distances[k].distance; } } Points[i].Class = min.Class; CountPointsInClasses[Points[i].Class]++; } for (int i = 0; i < class_count; i++) { dataGridView1.Rows[i + 1].Cells[1].Value = CountPointsInClasses[i]; } for (int i = 0; i < class_count; i++) //Points distribution into classes { int TempCountPoints = 0; for (int j = 0; j < points_count; j++) { if (Points[j].Class == i) { PointsInClasses[i, TempCountPoints] = Points[j]; TempCountPoints++; } } } for (int i = 0; i < class_count; i++) //Search best kernels { double MinAverageSquareDistance = MINAVERAGESQUAREDISTANCE; int number = -1; for (int j = 0; j < min(CountPointsInClasses[i], PRECISION1); j++) { double SumSquareDistance = 0, TempAverageSquareDistances; for (int k = 0; k < min(CountPointsInClasses[i], PRECISION2); k++) { SumSquareDistance += Math.Pow(EvklidDistance(PointsInClasses[i, j], PointsInClasses[i, k]), 2); } TempAverageSquareDistances = Math.Sqrt(SumSquareDistance / CountPointsInClasses[i]); if (TempAverageSquareDistances < MinAverageSquareDistance) //Best kernel was found { MinAverageSquareDistance = TempAverageSquareDistances; number = j; } } if (number != -1) { NewKernels[i] = PointsInClasses[i, number]; } } for (int i = 0; i < class_count; i++) { if ((OldKernels[i].x != NewKernels[i].x) || (OldKernels[i].y != NewKernels[i].y)) { is_class_change = true; } } ClearImage(); //Draw points with new kernels for (int i = 0; i < points_count; i++) { bufferedGraphics.Graphics.FillRectangle(new SolidBrush(Colors[Points[i].Class]), Points[i].x, Points[i].y, POINTS_WIDTH, POINTS_WIDTH); } for (int i = 0; i < class_count; i++) { bufferedGraphics.Graphics.FillEllipse(new SolidBrush(Colors[NewKernels[i].Class]), NewKernels[i].x, NewKernels[i].y, KERNELS_WIDTH, KERNELS_WIDTH); } bufferedGraphics.Render(); } DateTime end_time = DateTime.Now; message = caption + " за " + (end_time - start_time).Minutes.ToString() + " мин " + (end_time - start_time).Seconds.ToString() + " с " + (end_time - start_time).Milliseconds.ToString() + " мс."; caption += '!'; MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Information); }