Example #1
0
        public List <List <double> > solveCoeOfARMA()
        {
            List <List <double> > vec = new List <List <double> >();
            ARMAMath ar_math          = new ARMAMath();

            List <double> armaCoe = new List <double>(ar_math.computeARMACoe(this.data, p, q));
            List <double> arCoe   = new List <double>(this.p + 1);
            List <double> maCoe   = new List <double>(this.q + 1);

            for (int i = 0; i <= this.p; i++)
            {
                arCoe.Add(0);
            }
            for (int i = 0; i <= this.q; i++)
            {
                maCoe.Add(0);
            }
            for (int i = 0; i < arCoe.Count; i++)
            {
                arCoe[i] = armaCoe[i];
            }
            for (int i = 0; i < maCoe.Count; i++)
            {
                maCoe[i] = armaCoe[i + this.p + 1];
            }
            vec.Add(arCoe);
            vec.Add(maCoe);

            return(vec);
        }
Example #2
0
        public List <List <double> > solveCoeOfAR()
        {
            List <List <double> > vec = new List <List <double> >();
            ARMAMath      ar_math     = new ARMAMath();
            List <double> arCoe       = new List <double>(ar_math.computeARCoe(this.data, this.p));

            vec.Add(arCoe);
            return(vec);
        }
Example #3
0
        public List <int> getARIMAModel(int period, List <List <int> > notModel, bool needNot)
        {
            List <double> data = this.preDealDiff(period);
            //for(int i=0;i<data.size();i++) std::cout<<data[i]<<std::endl;

            double     minAIC    = 1.7976931348623157E308;
            List <int> bestModel = new List <int>(3);

            for (int i = 0; i < 3; i++)
            {
                bestModel.Add(0);
            }
            int type = 0;
            List <List <double> > coe = new List <List <double> >();
            // model产生, 即产生相应的p, q参数
            int len = data.Count;

            if (len > 5)
            {
                len = 5;
            }

            int size = ((len + 2) * (len + 1)) / 2 - 1;
            List <List <int> > model = new List <List <int> >(size);

            for (int i = 0; i < size; i++)
            {
                List <int> pn = new List <int>(size);
                for (int j = 0; j < size; j++)
                {
                    pn.Add(0);
                }
                model.Add(pn);
            }
            int cnt = 0;

            for (int i = 0; i <= len; ++i)
            {
                for (int j = 0; j <= len - i; ++j)
                {
                    if (i == 0 && j == 0)
                    {
                        continue;
                    }
                    model[cnt][0]   = i;
                    model[cnt++][1] = j;
                }
            }
            //std::cout<<size<<std::endl;
            for (int i = 0; i < cnt; ++i)
            {
                // 控制选择的参数

                bool token = false;
                if (needNot)
                {
                    for (int k = 0; k < notModel.Count; ++k)
                    {
                        if (model[i][0] == notModel[k][0] && model[i][1] == notModel[k][1])
                        {
                            token = true;
                            break;
                        }
                    }
                }
                if (token)
                {
                    continue;
                }

                if (model[i][0] == 0)
                {
                    MAModel ma = new MAModel(data, model[i][1]);

                    //List<List<double>>
                    coe = ma.solveCoeOfMA();

                    // std::cout<<i<<coe.size()<<std::endl;
                    //for(int ks=0;ks<ma.solveCoeOfMA().size();ks++) tmp.push_back(ma.solveCoeOfMA()[ks]);
                    //coe.assign(tmp.begin(),tmp.end());
                    type = 1;
                }
                else if (model[i][1] == 0)
                {
                    ARModel ar = new ARModel(data, model[i][0]);
                    //List<List<double>> tmp(
                    coe = ar.solveCoeOfAR();

                    //   std::cout<<i<<coe.size()<<std::endl;
                    //for(int ks=0;ks<ar.solveCoeOfAR().size();ks++) tmp.push_back(ar.solveCoeOfAR()[ks]);
                    //coe.assign(tmp.begin(),tmp.end());
                    type = 2;
                }
                else
                {
                    //std::cout<<i<<model[i][0]<<" "<<model[i][1]<<std::endl;
                    ARMAModel arma = new ARMAModel(data, model[i][0], model[i][1]);;

                    //List<List<double>> tmp(
                    coe = arma.solveCoeOfARMA();

                    //  std::cout<<i<<coe.size()<<std::endl;
                    //for(int ks=0;ks<arma.solveCoeOfARMA().size();ks++) tmp.push_back(arma.solveCoeOfARMA()[ks]);
                    //coe.assign(tmp.begin(),tmp.end());
                    type = 3;
                }
                ARMAMath ar_math = new ARMAMath();
                double   aic     = ar_math.getModelAIC(coe, data, type);
                //std::cout<<aic<<std::endl;
                // 在求解过程中如果阶数选取过长,可能会出现NAN或者无穷大的情况

                if (aic <= 1.7976931348623157E308 && !Double.IsNaN(aic) && aic < minAIC)
                {
                    minAIC = aic;
                    // std::cout<<aic<<std::endl;
                    bestModel[0] = model[i][0];
                    bestModel[1] = model[i][1];
                    bestModel[2] = (int)Math.Round(minAIC);
                    this.arima   = coe;
                }
            }
            return(bestModel);
        }