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