基於神經網絡的預測模型

http://zhidao.baidu.com/link?url=fLsRwA_uBmpyE5YIYC6TekEUzWK8xvOTClbL4wRPea9PmJpmzwkRNM7kNh-svP3ikxWKHInCugOPjS0aHZPXEJ7quYysefMYX6JQ4mUX_Dq

http://blog.csdn.net/desilting/article/details/38981673

基本思想:

根據前幾次的數據模擬下一次的數據。

需要數據具有“週期性”且週期可知。


matlab代碼:

x=[54167    
55196    
56300    
57482    
58796    
60266    
61465    
62828    
64653    
65994    
67207    
66207    
65859    
67295    
69172    
70499    
72538    
74542    
76368    
78534    
80671    
82992    
85229    
87177    
89211    
 90859    
 92420    
 93717    
 94974    
 96259    
 97542    
 98705    
100072    
101654    
103008    
104357    
105851    
107507    
109300    
111026    
112704    
114333    
115823    
117171    
118517    
119850    
121121    
122389    
123626    
124761    
125786    
126743    
127627    
128453    
129227    
129988    
130756    
131448    
132129    
132802    
134480    
135030    
135770    
136460    
137510]';
% 該腳本用來做NAR神經網絡預測
% 作者:Macer程
lag=3;    % 自迴歸階數
iinput=x; % x爲原始序列(行向量)
n=length(iinput);

%準備輸入和輸出數據
inputs=zeros(lag,n-lag);
for i=1:n-lag
    inputs(:,i)=iinput(i:i+lag-1)';
end
targets=x(lag+1:end);

%創建網絡
hiddenLayerSize = 10; %隱藏層神經元個數
net = fitnet(hiddenLayerSize);

% 避免過擬合,劃分訓練,測試和驗證數據的比例
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

%訓練網絡
[net,tr] = train(net,inputs,targets);
%% 根據圖表判斷擬合好壞
yn=net(inputs);
errors=targets-yn;
figure, ploterrcorr(errors)                      %繪製誤差的自相關情況(20lags)
figure, parcorr(errors)                          %繪製偏相關情況
%[h,pValue,stat,cValue]= lbqtest(errors)         %Ljung-Box Q檢驗(20lags)
figure,plotresponse(con2seq(targets),con2seq(yn)) %看預測的趨勢與原趨勢
%figure, ploterrhist(errors)                      %誤差直方圖
%figure, plotperform(tr)                          %誤差下降線


%% 下面預測往後預測幾個時間段
fn=7;  %預測步數爲fn。


f_in=iinput(n-lag+1:end)';
f_out=zeros(1,fn);  %預測輸出
% 多步預測時,用下面的循環將網絡輸出重新輸入
for i=1:fn
    f_out(i)=net(f_in);
    f_in=[f_in(2:end);f_out(i)];
end
% 畫出預測圖
figure,plot(1949:2013,iinput,'b',2013:2020,[iinput(end),f_out],'r')

                                             圖1自相關






7e3e6709c93d70cfc7ea5f08fbdcd100baa12ba7

                                                 圖2誤差

f603918fa0ec08fa3fdf99a25aee3d6d54fbdadc

                                                  圖3預測

      上面的程序是可以通用的,只要你根據自己需要是可以修改用在其他地方的,基本思想就是用前lag年的人口數來預測下一年的人口,至於lag等於幾你是可以自己改的。還有在對結果好壞的判斷中,僅僅看誤差圖是不夠的,如果是一個好的預測,那麼自相關性圖中除了0階自相關外,其他的自相關係數係數都不應該超過上下置信區間。還有其他的統計量和圖表都都寫在”%“後面了,如果需要,去掉就可用。最後的預測值爲f_out,我的預測值爲

138701.065269972    139467.632609654    140207.209707364    141210.109373609    141981.285378849    142461.332139592    143056.073139776


R代碼:

說明:測試數據具有週期性特徵(7天)


[plain] view plaincopyprint?

  1. library(nnet)  

  2. source <- c(10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,  

  3. 6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,  

  4. 10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,  

  5. 12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,  

  6. 16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,  

  7. 12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,  

  8. 15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947)  

  9. srcLen<-length(source)  

  10. for(i in 1:10){  #預測最後十個數;  

  11.     real <- source[srcLen-i+1] #實際值  

  12.     xNum=(srcLen-i+1)%/%7      #組數  

  13.     yNum=7                     #每組7個數  

  14.     data<-array(1:(xNum*yNum),c(xNum,yNum))  

  15.    

  16.     pre=srcLen-i+1;  

  17.     for(x in 1:xNum){          #數組賦值  

  18.         for(y in 1:yNum){  

  19.             data[x,y]=source[pre]  

  20.             pre=pre-1;  

  21.              

  22.         }  

  23.         if(pre<7){  

  24.             break;  

  25.         }  

  26.     }  

  27.     ascData<-array(1:(xNum*yNum),c(xNum,yNum)) #數組逆序  

  28.     for(x in 1:xNum){  

  29.         for(y in 1:yNum){  

  30.             ascData[x,y]=data[xNum-x+1,y]  

  31.         }  

  32.     }  

  33.     colnames(ascData) <- c("a","b","c","d","e","f","g") #每列列名  

  34.    

  35.     trainData<-data.frame(scale(ascData[,c(1:7)]))        

  36.      

  37.     nn<-nnet(a~b+c+d+e+f+g,trainData[1:(xNum-1),],size=10,decay=0.01,maxit=1000,linout=F,trace=F)  

  38.     predict<-predict(nn,trainData[xNum,])  

  39.      

  40.     predict=predict*sd(ascData[,1])+mean(ascData[,1])  

  41.     percent <- (predict-real)*100/real  

  42.     res <- paste("預測值:",predict,"實際值:",real,"誤差:",percent)  

  43.     print(res)  

  44.  }  


第一次預測:



[plain] view plaincopyprint?

  1. [1] "預測值: 16279.0513125717 實際值: 14947 誤差: 8.91183055176118"  

  2. [1] "預測值: 14645.5327512872 實際值: 15381 誤差: -4.78166080692271"  

  3. [1] "預測值: 14502.4347443558 實際值: 15323 誤差: -5.35512142298625"  

  4. [1] "預測值: 9812.9237303024 實際值: 10473 誤差: -6.30264747157069"  

  5. [1] "預測值: 11366.9396330435 實際值: 12095 誤差: -6.01951522907361"  

  6. [1] "預測值: 15417.6946929827 實際值: 14246 誤差: 8.22472759358924"  

  7. [1] "預測值: 15117.3154726064 實際值: 15231 誤差: -0.746402254570258"  

  8. [1] "預測值: 16066.7818969626 實際值: 16029 誤差: 0.235709632307469"  

  9. [1] "預測值: 14360.1836579368 實際值: 14618 誤差: -1.76369094310545"  

  10. [1] "預測值: 14762.5499357273 實際值: 14775 誤差: -0.084264394400848"  


第二次預測:



[plain] view plaincopyprint?

  1. [1] "預測值: 16274.2977340541 實際值: 14947 誤差: 8.88002765808567"  

  2. [1] "預測值: 14645.5829417616 實際值: 15381 誤差: -4.78133449215549"  

  3. [1] "預測值: 14477.3978320906 實際值: 15323 誤差: -5.51851574697771"  

  4. [1] "預測值: 9851.55020425515 實際值: 10473 誤差: -5.93382789787881"  

  5. [1] "預測值: 11337.4015608863 實際值: 12095 誤差: -6.26373244409858"  

  6. [1] "預測值: 15417.5053358782 實際值: 14246 誤差: 8.2233983986956"  

  7. [1] "預測值: 15123.5455847284 實際值: 15231 誤差: -0.705498097771535"  

  8. [1] "預測值: 16049.9242132398 實際值: 16029 誤差: 0.130539729488775"  

  9. [1] "預測值: 14369.3231442035 實際值: 14618 誤差: -1.70116880419038"  

  10. [1] "預測值: 14765.8214583581 實際值: 14775 誤差: -0.0621221092516397"  



第三次預測:


[plain] view plaincopyprint?

  1. [1] "預測值: 16278.9064421534 實際值: 14947 誤差: 8.91086132436858"  

  2. [1] "預測值: 14634.2898096302 實際值: 15381 誤差: -4.85475710532337"  

  3. [1] "預測值: 14483.9746718714 實際值: 15323 誤差: -5.47559438836129"  

  4. [1] "預測值: 9818.37752965315 實際值: 10473 誤差: -6.25057261860837"  

  5. [1] "預測值: 11366.9309261672 實際值: 12095 誤差: -6.01958721647616"  

  6. [1] "預測值: 15417.7054099752 實際值: 14246 誤差: 8.22480282167056"  

  7. [1] "預測值: 15126.2971700737 實際值: 15231 誤差: -0.687432407105736"  

  8. [1] "預測值: 16066.8686059418 實際值: 16029 誤差: 0.236250582954744"  

  9. [1] "預測值: 14364.9178141514 實際值: 14618 誤差: -1.73130514330666"  

  10. [1] "預測值: 14771.585261145 實際值: 14775 誤差: -0.023111599695413"  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章