private RegEquation BuildOneModel(double[,] xy, int numParams, int numNotes, ref int info) //строим модель, в инфо - успех или нет { double[] weights = new double[numParams + 1]; double Ysr = 0; alglib.linreg.linearmodel LM = new alglib.linreg.linearmodel(); alglib.linreg.lrreport AR = new alglib.linreg.lrreport(); alglib.linreg.lrbuild(xy, numNotes, numParams, ref info, LM, AR); if (info < 0) { return(null); } alglib.linreg.lrunpack(LM, ref weights, ref numParams); //получили веса моделей, свободный член последний //проверим на значимость по Фишеру for (int i = 0; i < numNotes; i++) { Ysr += xy[i, numParams]; } Ysr = Ysr / numNotes; double SSreg = 0, SSresid = 0; for (int j = 0; j < numNotes; j++) { double Ymodel = 0; for (int k = 0; k < numParams; k++) { Ymodel += xy[j, k] * weights[k]; } Ymodel += weights[numParams]; //прибавили свободный ЧЛЕН SSreg += Math.Pow(Ymodel - Ysr, 2); SSresid += Math.Pow(Ymodel - xy[j, numParams], 2); } SSreg = SSreg / numParams; SSresid = SSresid / (numNotes - numParams - 1); double F = SSreg / SSresid; double F_test = alglib.fcdistribution(numParams, numNotes - numParams - 1, F); return(new RegEquation(weights, F, F_test, AR.rmserror)); }
//строим модель, в инфо - успех или нет private RegEquation BuildOneModel(double[,] xy, int numParams, int numNotes, ref int info) { double[] weights = new double[numParams + 1]; double Ysr = 0; alglib.linreg.linearmodel LM = new alglib.linreg.linearmodel(); alglib.linreg.lrreport AR = new alglib.linreg.lrreport(); alglib.linreg.lrbuild(xy, numNotes, numParams, ref info, LM, AR); if (info < 0) return null; alglib.linreg.lrunpack(LM, ref weights, ref numParams); //получили веса моделей, свободный член последний //проверим на значимость по Фишеру for (int i = 0; i < numNotes; i++) Ysr += xy[i, numParams]; Ysr = Ysr / numNotes; double SSreg = 0, SSresid = 0; for (int j = 0; j < numNotes; j++) { double Ymodel = 0; for (int k = 0; k < numParams; k++) Ymodel += xy[j, k] * weights[k]; Ymodel += weights[numParams]; //прибавили свободный ЧЛЕН SSreg += Math.Pow(Ymodel - Ysr, 2); SSresid += Math.Pow(Ymodel - xy[j, numParams], 2); } SSreg = SSreg / numParams; SSresid = SSresid / (numNotes - numParams - 1); double F = SSreg / SSresid; double F_test = alglib.fcdistribution(numParams, numNotes - numParams - 1, F); return new RegEquation(weights, F, F_test, AR.rmserror); }