//Кросс-валидация 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); }
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); }