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