Esempio n. 1
0
        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]++;
            }
        }
Esempio n. 2
0
        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);
        }