public CondOptModel(RegressionModel regr, DescrModel descr, double[] _y, double _epsg, double _epsi, int _iter) { regModel = regr; desModel = descr; epsg = _epsg; epsx = _epsi; epsi = _epsi; iter = _iter; yModel = new double[regModel.y.Count]; technology = new Technology(regr.x, regr.y, descr.id, regr.id, _y); }
private void startModeling_Click(object sender, RoutedEventArgs e) { if (task.data == null) { Log.Text = "Данные не загружены"; return; } modelRegress = task.LinReg(false); if (modelRegress.buildInfo < 0) { // MessageBox.Show("buildInfo = " + modelRegress.buildInfo.ToString()); Log.Text = "Ошибка построения модели: выборка имеет малое количество записей"; return; } modelView(modelRegress); expanderReg.IsExpanded = true; }
public CondOptModel(RegressionModel regr, DescrModel descr, Technology tech, double _epsg, double _epsi, int _iter, double[] _xCur) { regModel = regr; desModel = descr; epsg = _epsg; epsx = _epsi; epsi = _epsi; iter = _iter; yModel = new double[regModel.y.Count]; technology = tech; technology.baseTechnologyID = tech.id; technology.id = -1; xDone = _xCur; for (int i = 0; i < xDone.Length; i++) { if (xDone[i] == -1) { numDone = i; break; } } }
private void startUpgrade_Click(object sender, RoutedEventArgs e) { if (task.data == null) { Log.Text = "Данные не загружены"; return; } modelRegress = task.LinReg(true); if (modelRegress.buildInfo < 0) { MessageBox.Show("buildInfo = " + modelRegress.buildInfo.ToString()); Log.Text = "Ошибка построения модели"; return; } modelView(modelRegress); expanderReg.IsExpanded = true; }
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; }
public CondOptModel(RegressionModel regr, DescrModel descr, Technology tech, double _epsg, double _epsi, int _iter, double[] _xCur) { regModel = regr; desModel = descr; epsg = _epsg; epsx = _epsi; epsi = _epsi; iter = _iter; yModel = new double[regModel.y.Count]; technology = tech; technology.baseTechnologyID = tech.id; technology.id = -1; xDone = _xCur; for (int i = 0; i < xDone.Length; i++) if (xDone[i] == -1) { numDone = i; break; } }
//строим линейную регрессию для одного У 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; }
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; }