예제 #1
0
        //Кросс-валидация
        double crossValidation(selectionElement[] selectionTable, int m, double lambda = -1)
        {
            //Разделение выборки на блоки
            int countOfElementsInBlock = selectionTable.Length / COUNT_OF_BLOCKS_IN_CROSS;

            selectionElement[] blockForControl = new selectionElement[countOfElementsInBlock];
            for (int i = 0; i < countOfElementsInBlock; i++)
            {
                blockForControl[i] = new selectionElement();
            }

            selectionElement[] blockForEducation = new selectionElement[selectionTable.Length - countOfElementsInBlock];
            for (int i = 0; i < selectionTable.Length - countOfElementsInBlock; i++)
            {
                blockForEducation[i] = new selectionElement();
            }

            int    t          = 0;
            int    d          = 0;
            double blockError = 0; //ошибка для текущего блока контроля
            double fullError  = 0; //полная общая ошибка для всей выборки

            int elementIter = selectionTable.Length / countOfElementsInBlock;
            int needElement = 0;

            for (int i = 0; i < COUNT_OF_BLOCKS_IN_CROSS; i++)
            {
                needElement = i;
                //Добавление элементов текущей группы элементов для контроля в массив контроля
                for (int j = 0; j < selectionTable.Length; j++)
                {
                    if (j == needElement)
                    {
                        blockForControl[d].X = selectionTable[j].X;
                        blockForControl[d].Y = selectionTable[j].Y;
                        d++;
                        needElement += elementIter;
                    }
                    else
                    {
                        blockForEducation[t].X = selectionTable[j].X;
                        blockForEducation[t].Y = selectionTable[j].Y;
                        t++;
                    }
                }

                t = 0;
                d = 0;
                //Получение полинома из обучающей выборки
                double[] w = findPolynomCoeff(blockForEducation, m, lambda);
                //Рассчет ошибки с помощью контрольной выборки
                blockError = calculateError(w, blockForControl) / blockForControl.Length;
                fullError += blockError;
                blockError = 0;
            }

            fullError = fullError / COUNT_OF_BLOCKS_IN_CROSS;

            return(fullError);
        }
예제 #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                chart1.Series[i].Points.Clear();
            }

            int functionNumber = 0;
            int mistakeType    = 1;

            if (radioButton1.Checked)
            {
                functionNumber = 1;
            }
            else if (radioButton2.Checked)
            {
                functionNumber = 2;
            }
            else if (radioButton3.Checked)
            {
                functionNumber = 3;
            }
            else if (radioButton6.Checked)
            {
                functionNumber = 5;
            }
            else if (radioButton7.Checked)
            {
                functionNumber = 6;
            }
            else if (radioButton8.Checked)
            {
                functionNumber = 7;
            }

            if (radioButton4.Checked)
            {
                mistakeType = 1;
            }
            else if (radioButton5.Checked)
            {
                mistakeType = 2;
            }

            int    n = Convert.ToInt32(numericUpDown1.Text);
            int    m = Convert.ToInt32(numericUpDown3.Text);
            double d = Convert.ToDouble(numericUpDown2.Text);

            //Отрисовка графика для заданной функции
            drawFunction(functionNumber);

            //Создание массива под выборку
            selectionElement[] SelectionTable = new selectionElement[n];
            for (int i = 0; i < n; i++)
            {
                SelectionTable[i] = new selectionElement();
            }

            //Генерирование выборки
            createSelection(functionNumber, SelectionTable, n, mistakeType, d);

            //вывод выборки на экран
            foreach (selectionElement elem in SelectionTable)
            {
                chart1.Series[1].Points.AddXY(elem.X, elem.Y);
            }

            double[] w = findPolynomCoeff(SelectionTable, m);
            drawResultFunction(w, functionNumber);

            double currentError = 0;    // ошибка, полученная для текущей степени M полинома
            double minError     = 0;    // минимальная ошибка среди всех степеней M полинома
            int    bestM        = 1;    // лучшая степень полинома
            double bestLambda   = 0;    // лучшее значение лямбды

            //0-ая итерация
            minError = crossValidation(SelectionTable, m, 0.3);
            bestM    = m;

            for (int mCh = 3; mCh < 15; mCh++)
            {
                for (double lam = 0.0; lam < 1.0; lam += 0.1)
                {
                    currentError = crossValidation(SelectionTable, mCh, lam);
                    if (currentError < minError)
                    {
                        minError   = currentError;
                        bestM      = mCh;
                        bestLambda = lam;
                    }
                }
            }

            label6.Text  = minError.ToString();
            label8.Text  = bestM.ToString();
            label10.Text = bestLambda.ToString();
            double[] wBest = findPolynomCoeff(SelectionTable, bestM);
            drawResultFunction(wBest, functionNumber, true);

            regularization(SelectionTable, functionNumber, bestM, bestLambda);
        }