Пример #1
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);
        }
        //грузим регрессионную модель
        private int LoadRegress(int id)
        {
            DBWorker dbConnection = new DBWorker();
                if (dbConnection.isConnected)
                {
                    DataTable modelTable = dbConnection.LoadModel(DbSelect.SelectReg, id);
                    if (W.task == null) W.task = new DataPlavka(dbConnection.GetPlavka(DbSelect.Columns, null)); //берем список параметров
                    if (modelTable == null)
                    {
                        if (W.modelRegress != null) W.modelRegress.buildInfo = -3;
                        return -1;
                    }
                    if (modelTable.Rows.Count == 0) return 0;
                    W.modelRegress = new RegressionModel(id);
                    W.modelRegress.date = Convert.ToDateTime(modelTable.Rows[0]["DATE_REG"]);
                    W.modelRegress.GOST = modelTable.Rows[0]["GOST_ID"].ToString();
                    W.modelRegress.mark = modelTable.Rows[0]["MARKA"].ToString() + " " + modelTable.Rows[0]["VYTYAZHKA"].ToString();
                    //W.task.GOST = W.modelRegress.GOST;
                    //W.task.mark = W.modelRegress.mark;
                    //формируем массив факторов Х
                    for (int i = 0; i < W.task.xAll.Count; i++)
                        if (modelTable.Rows[0][W.task.xAll[i].name] != System.DBNull.Value)
                            W.modelRegress.x.Add(i);
                    for (int i = 0; i < W.modelRegress.x.Count; i++) //проверяем простая или точная модель
                        if (modelTable.Rows[0][W.task.xAll[W.modelRegress.x[i]].name + "_F"] != System.DBNull.Value) { W.modelRegress.isUpgraded = true; break; }
                    if (W.modelRegress.isUpgraded)
                    {
                        W.modelRegress.typesF = new int[W.modelRegress.x.Count];
                        for (int i = 0; i < W.modelRegress.x.Count; i++)
                            W.modelRegress.typesF[i] = Convert.ToInt32(modelTable.Rows[0][W.task.xAll[W.modelRegress.x[i]].name + "_F"]);
                    }

                    for (int i = 0; i < modelTable.Rows.Count; i++) //каждая строка - модель
                    {
                        W.modelRegress.y.Add(Convert.ToInt32(modelTable.Rows[i]["Y_ID"]));
                        //W.task.y.Add(Convert.ToInt32(modelTable.Rows[i]["Y_ID"]));
                        double[] weights = new double[W.modelRegress.x.Count + 1]; //последний - свобоный ЧЛЕН
                        for (int j = 0; j < W.modelRegress.x.Count; j++)
                            weights[j] = Convert.ToDouble(modelTable.Rows[i][W.task.xAll[W.modelRegress.x[j]].name]);
                        weights[W.modelRegress.x.Count] = Convert.ToDouble(modelTable.Rows[i]["A"]);
                        RegEquation modelOne = new RegEquation(weights, Convert.ToDouble(modelTable.Rows[i]["FISHER"]),
                            Convert.ToDouble(modelTable.Rows[i]["FISHER_VAL"]), Convert.ToDouble(modelTable.Rows[i]["RMSERROR"]));
                        modelOne.descr = W.task.yAll[W.modelRegress.y[i]].description;
                        if (modelOne.F_test == 0) modelOne.F_test = 1.0e-16;
                        W.modelRegress.equation.Add(modelOne);
                    }
                }
                dbConnection.CloseConnection();
                return 1;
        }
        private int LoadRegress(int id) //грузим регрессионную модель
        {
            DBWorker dbConnection = new DBWorker();

            if (dbConnection.isConnected)
            {
                DataTable modelTable = dbConnection.LoadModel(DbSelect.SelectReg, id);
                if (W.task == null)
                {
                    W.task = new DataPlavka(dbConnection.GetPlavka(DbSelect.Columns, null));                     //берем список параметров
                }
                if (modelTable == null)
                {
                    if (W.modelRegress != null)
                    {
                        W.modelRegress.buildInfo = -3;
                    }
                    return(-1);
                }
                if (modelTable.Rows.Count == 0)
                {
                    return(0);
                }
                W.modelRegress      = new RegressionModel(id);
                W.modelRegress.date = Convert.ToDateTime(modelTable.Rows[0]["DATE_REG"]);
                W.modelRegress.GOST = modelTable.Rows[0]["GOST_ID"].ToString();
                W.modelRegress.mark = modelTable.Rows[0]["MARKA"].ToString() + " " + modelTable.Rows[0]["VYTYAZHKA"].ToString();
                //W.task.GOST = W.modelRegress.GOST;
                //W.task.mark = W.modelRegress.mark;
                //формируем массив факторов Х
                for (int i = 0; i < W.task.xAll.Count; i++)
                {
                    if (modelTable.Rows[0][W.task.xAll[i].name] != System.DBNull.Value)
                    {
                        W.modelRegress.x.Add(i);
                    }
                }
                for (int i = 0; i < W.modelRegress.x.Count; i++)     //проверяем простая или точная модель
                {
                    if (modelTable.Rows[0][W.task.xAll[W.modelRegress.x[i]].name + "_F"] != System.DBNull.Value)
                    {
                        W.modelRegress.isUpgraded = true; break;
                    }
                }
                if (W.modelRegress.isUpgraded)
                {
                    W.modelRegress.typesF = new int[W.modelRegress.x.Count];
                    for (int i = 0; i < W.modelRegress.x.Count; i++)
                    {
                        W.modelRegress.typesF[i] = Convert.ToInt32(modelTable.Rows[0][W.task.xAll[W.modelRegress.x[i]].name + "_F"]);
                    }
                }

                for (int i = 0; i < modelTable.Rows.Count; i++)     //каждая строка - модель
                {
                    W.modelRegress.y.Add(Convert.ToInt32(modelTable.Rows[i]["Y_ID"]));
                    //W.task.y.Add(Convert.ToInt32(modelTable.Rows[i]["Y_ID"]));
                    double[] weights = new double[W.modelRegress.x.Count + 1];     //последний - свобоный ЧЛЕН
                    for (int j = 0; j < W.modelRegress.x.Count; j++)
                    {
                        weights[j] = Convert.ToDouble(modelTable.Rows[i][W.task.xAll[W.modelRegress.x[j]].name]);
                    }
                    weights[W.modelRegress.x.Count] = Convert.ToDouble(modelTable.Rows[i]["A"]);
                    RegEquation modelOne = new RegEquation(weights, Convert.ToDouble(modelTable.Rows[i]["FISHER"]),
                                                           Convert.ToDouble(modelTable.Rows[i]["FISHER_VAL"]), Convert.ToDouble(modelTable.Rows[i]["RMSERROR"]));
                    modelOne.descr = W.task.yAll[W.modelRegress.y[i]].description;
                    if (modelOne.F_test == 0)
                    {
                        modelOne.F_test = 1.0e-16;
                    }
                    W.modelRegress.equation.Add(modelOne);
                }
            }
            dbConnection.CloseConnection();
            return(1);
        }