Пример #1
0
        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);
        }
Пример #2
0
 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;
 }
Пример #3
0
 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 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;
 }
        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;
        }
Пример #7
0
 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;
         }
 }
Пример #8
0
        //строим линейную регрессию для одного У
        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;
        }
Пример #9
0
        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;
        }