public RegressionModel LinReg(bool isUpgraded) //строим линейную регрессию для одного У { RegressionModel models = new RegressionModel(x, y, isUpgraded); models.GOST = GOST; models.mark = mark; int[] typesF = new int[x.Count]; int numNotes = data.GetLength(0); int numParams = x.Count; int info = 100; //результат выполнения подпрограммы alglib double[,] xy = new double[numNotes, numParams + 1]; //таблица из всех иксов и одного у //подготавливаем массив данных if (!isUpgraded) //для простой модели просто переносим все данные { for (int i = 0; i < numNotes; i++) { for (int j = 0; j < numParams; j++) { xy[i, j] = data[i, y.Count + j]; //Convert.ToDouble(plavka.Rows[i].ItemArray[y.Count + j]); //поскольку сначала все y } } } else { typesF = UpgradeFuncModel(); } for (int i = 0; i < y.Count; i++) //для каждого свойства y { if (isUpgraded) //для улучшенной модели применяем функции { for (int k = 0; k < numNotes; k++) { for (int j = 0; j < numParams; j++) { xy[k, j] = FunctionTypeConverter.CalcFx(typesF[j], data[k, y.Count + j]); // Convert.ToDouble(plavka.Rows[k].ItemArray[y.Count + j])); } } models.typesF = typesF; } for (int j = 0; j < numNotes; j++) { xy[j, numParams] = data[j, i];// Convert.ToDouble(plavka.Rows[j].ItemArray[i]); //заполняем последний столбец для нужного свойства } //строим 1 модель для конкретного свойства RegEquation model = BuildOneModel(xy, numParams, numNotes, ref info); if (info < 0) //ошибка произошла, возвращаем ее в классе модели { models.buildInfo = info; return(models); } models.equation.Add(model); } return(models); }
public double Calculate(double[] x, int[] typesF) { double result = 0; for (int i = 0; i < x.Length; i++) { result += FunctionTypeConverter.CalcFx(typesF[i], x[i]) * weights[i]; } result += weights[x.Length]; //прибавляем свободный член return(result); }
private int[] UpgradeFuncModel() //находим функции для Х, при которых ковариация с У максимальна { int[] funcTypes = new int[x.Count]; int numNotes = data.GetLength(0); int numParams = x.Count; for (int i = 0; i < numParams; i++) //для каждого параметра { double[] Y = new double[numNotes], Xbase = new double[numNotes], X = new double[numNotes]; for (int w = 0; w < numNotes; w++) { Xbase[w] = data[w, y.Count + i]; //начальный массив X } double max_sum = -1; for (int k = 0; k < FunctionTypeConverter.funcNum; k++) { double temp_sum = 0; for (int w = 0; w < numNotes; w++) { X[w] = FunctionTypeConverter.CalcFx(k, Xbase[w]); } for (int j = 0; j < y.Count; j++) //суммируем корреляции со всеми У { for (int w = 0; w < numNotes; w++) { Y[w] = data[w, j]; //Convert.ToDouble(plavka.Rows[w].ItemArray[j]); //заполнили массив свойства } temp_sum += Math.Pow(alglib.pearsoncorr2(X, Y), 2); } if (temp_sum > max_sum) { max_sum = temp_sum; funcTypes[i] = k; } } } return(funcTypes); }
private void modelView(RegressionModel modelRegress) { modelGrid.Columns.Clear(); modelGrid.AutoGenerateColumns = false; statGrid.Visibility = Visibility.Visible; if (modelRegress.isUpgraded) { funcGrid.Visibility = Visibility.Visible; } else { funcGrid.Visibility = Visibility.Collapsed; } #region вывод коэффициентов модели //изврат с отображением в датаГрид List <string[]> dataViewer = new List <string[]>(); for (int i = 0; i < modelRegress.x.Count + 1; i++) // +1 потому что еще свободный ЧЛЕН { string[] s = new string[modelRegress.y.Count + 1]; if (i != modelRegress.x.Count) { s[0] = task.xAll[modelRegress.x[i]].description; } else { s[0] = "a"; } for (int j = 0; j < modelRegress.y.Count; j++) { s[j + 1] = Math.Round(modelRegress.equation[j].weights[i], 6).ToString(); } dataViewer.Add(s); } for (int i = 0; i < modelRegress.y.Count + 1; i++) //формируем столбцы - это у { var col = new DataGridTextColumn(); var binding = new Binding(String.Format("[{0}]", i)); if (i == 0) { col.Width = new DataGridLength(2, DataGridLengthUnitType.Star); } else { col.Header = task.yAll[modelRegress.y[i - 1]].description; col.Width = new DataGridLength(3, DataGridLengthUnitType.Star); } col.Binding = binding; modelGrid.Columns.Add(col); } //тут создали выбранные параметры столбцами modelGrid.ItemsSource = dataViewer; #endregion for (int i = 0; i < task.y.Count; i++) { modelRegress.equation[i].descr = task.yAll[modelRegress.y[i]].description; } statGrid.ItemsSource = modelRegress.equation; #region вывод типов функций для уточненной модели if (modelRegress.isUpgraded) { List <itemGrid> f = new List <itemGrid>(); for (int i = 0; i < modelRegress.typesF.Length; i++) { f.Add(new itemGrid(task.xAll[modelRegress.x[i]].description, FunctionTypeConverter.ViewFx(modelRegress.typesF[i]))); } funcGrid.ItemsSource = f; funcGrid.Width = gridsDockPanel.ActualWidth / 3; } #endregion yOptData.Clear(); yOptGrid.ItemsSource = null; xOptGrid.ItemsSource = null; for (int i = 0; i < modelRegress.y.Count; i++) { yOptData.Add(new itemGrid(task.yAll[modelRegress.y[i]].description, -1)); } yOptGrid.Columns[2].Visibility = System.Windows.Visibility.Hidden; yOptGrid.Columns[3].Visibility = System.Windows.Visibility.Hidden; yOptGrid.ItemsSource = yOptData; if (modelRegress.isUpgraded) { labelRegType.Text = "Тип: улучшенная"; } else { labelRegType.Text = "Тип: простая"; } if (modelRegress.id == -1) { labelRegID.Text = "ID: local"; modelRegress.date = DateTime.Now.Date; modelRegress.mark = task.mark; modelRegress.GOST = task.GOST; } else { labelRegID.Text = "ID: " + modelRegress.id.ToString(); } Log.Text = "Регрессионная модель успешно построена"; labelRegGOST.Text = modelRegress.GOST; labelRegMark.Text = modelRegress.mark; labelRegDate.Text = "Дата: " + modelRegress.date.ToShortDateString(); expanderReg.IsExpanded = true; }