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));
        }
Esempio n. 2
0
        //строим модель, в инфо - успех или нет
        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);
        }