- public class GM1_1
- {
- private int T;//樣本數量
- private int M;
- private double[] X;//原始數列
- private double[] XF;//預測值
- private double[] WC;//誤差值
- private double[][] B; //B矩陣
- private double[][] YN; //YN矩陣
- private double[] X1; //AGO結果
- private double a=0,u=0;//[a,u]T向量
- protected DataSet observedData = new DataSet();
- public GM1_1()
- {
- }
- /**
- * 取預測類型
- * @return
- */
- public String getForecastType(){
- return "longshine.epdsm.forecase.GM1_1";
- }
- /**
- * 取預測模型名稱
- * @return
- */
- public String toString(){
- return "灰色模型GM(1,1)";
- }
- /**
- * 取預測模型代碼
- * @return
- */
- public String getForecastModelNo(){
- return "mypack.GM1_1";
- }
- public double forecast( IDataPoint dataPoint ){
- int x= (int)Math.round(dataPoint.getIndependentValue("x"));
- Matrix M_YN;
- Matrix M_B;
- Matrix M_Reverse;
- try{
- M_YN= new Matrix(YN);
- M_B=new Matrix(B);
- Matrix tmp=M_B.transpose().multiply(M_B).inverse();
- //利用最小二乘法求a係數向量a~=(B'B)-1B'YN
- M_Reverse=GMUtils.getGrayModelModulus(M_B,M_YN);
- a=M_Reverse.getEntry(1,1);
- u=M_Reverse.getEntry(2,1);
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- //開始預測
- try
- {
- XF[0]=X[0];
- for(int i=1;i<XF.length;i++)
- {
- XF[i]=GMUtils.getT1Time(a,u,X[0],i);
- }
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- WC=GMUtils.getRelativeError(X,XF);
- if(x<T) return X[x];
- else
- {
- try
- {
- double res=GMUtils.getT1Time(a,u,X[0],x);
- return res;
- }catch(Exception e)
- {
- e.printStackTrace();
- return 0.;
- }
- }
- }
- public void init( DataSet dataSet )
- {
- this.observedData = dataSet;
- setT(dataSet.size());
- X=new double[T];
- initX();
- setT(X.length);
- this.M=X.length-1;
- XF=new double[X.length];
- WC=new double[X.length];
- B=new double[M][2];
- YN=new double[M][1];
- X1=GMUtils.sumArray(X);
- a=0;u=0;
- //初始化B,Yn
- for(int i=0;i<M;i++)
- {
- B[i][0]=-(X1[i]+X1[i+1])/2;
- B[i][1]=1;
- }
- for(int i=0;i<M;i++)
- {
- YN[i][0]=X[i+1];
- }
- }
- public int getM()
- {
- return this.M;
- }
- private void initX() //X賦值
- {
- for (int i=1 ;i<=T ;i++ )
- {
- IDataPoint dp = (IDataPoint)observedData.get(i-1);
- X[i-1] = dp.getDependentValue();
- }
- }
- public int getT()
- {
- return T;
- }
- public void setT(int T)
- {
- this.T = T;
- }
- public static void main(String[] args)
- {
- final double[] powers={
- 124.8,
- 110.7,
- 129.0,
- 155.3,
- 219.03
- };
- DataSet dataset = new DataSet();
- IDataPoint dp;
- int count = 1;
- for (int i=0 ;i<powers.length ;i++ )
- {
- dp = new Observation( powers[i] );
- dp.setIndependentValue( "x", i+1 );
- dp.setTitle("xxx");
- dataset.add( dp );
- };
- GM1_1 aa = new GM1_1();
- aa.init(dataset);
- dp = new Observation(0);
- dp.setIndependentValue( "x", 5);
- System.out.println("7="+aa.forecast(dp));
- dp.setIndependentValue( "x", 6);
- System.out.println("8="+aa.forecast(dp));
- dp.setIndependentValue( "x", 7);
- System.out.println("9="+aa.forecast(dp));
- dp.setIndependentValue( "x", 8);
- System.out.println("10="+aa.forecast(dp));
- dp.setIndependentValue( "x", 9);
- System.out.println("11="+aa.forecast(dp));
- }
- }
灰色預測法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.