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);
        }
示例#4
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;
        }