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); }