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自相關
圖2誤差
圖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?
library(nnet)
source <- c(10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,
6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,
10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,
12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,
16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,
12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,
15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947)
srcLen<-length(source)
for(i in 1:10){ #預測最後十個數;
real <- source[srcLen-i+1] #實際值
xNum=(srcLen-i+1)%/%7 #組數
yNum=7 #每組7個數
data<-array(1:(xNum*yNum),c(xNum,yNum))
pre=srcLen-i+1;
for(x in 1:xNum){ #數組賦值
for(y in 1:yNum){
data[x,y]=source[pre]
pre=pre-1;
}
if(pre<7){
break;
}
}
ascData<-array(1:(xNum*yNum),c(xNum,yNum)) #數組逆序
for(x in 1:xNum){
for(y in 1:yNum){
ascData[x,y]=data[xNum-x+1,y]
}
}
colnames(ascData) <- c("a","b","c","d","e","f","g") #每列列名
trainData<-data.frame(scale(ascData[,c(1:7)]))
nn<-nnet(a~b+c+d+e+f+g,trainData[1:(xNum-1),],size=10,decay=0.01,maxit=1000,linout=F,trace=F)
predict<-predict(nn,trainData[xNum,])
predict=predict*sd(ascData[,1])+mean(ascData[,1])
percent <- (predict-real)*100/real
res <- paste("預測值:",predict,"實際值:",real,"誤差:",percent)
print(res)
}
第一次預測:
[plain] view plaincopyprint?
[1] "預測值: 16279.0513125717 實際值: 14947 誤差: 8.91183055176118"
[1] "預測值: 14645.5327512872 實際值: 15381 誤差: -4.78166080692271"
[1] "預測值: 14502.4347443558 實際值: 15323 誤差: -5.35512142298625"
[1] "預測值: 9812.9237303024 實際值: 10473 誤差: -6.30264747157069"
[1] "預測值: 11366.9396330435 實際值: 12095 誤差: -6.01951522907361"
[1] "預測值: 15417.6946929827 實際值: 14246 誤差: 8.22472759358924"
[1] "預測值: 15117.3154726064 實際值: 15231 誤差: -0.746402254570258"
[1] "預測值: 16066.7818969626 實際值: 16029 誤差: 0.235709632307469"
[1] "預測值: 14360.1836579368 實際值: 14618 誤差: -1.76369094310545"
[1] "預測值: 14762.5499357273 實際值: 14775 誤差: -0.084264394400848"
第二次預測:
[plain] view plaincopyprint?
[1] "預測值: 16274.2977340541 實際值: 14947 誤差: 8.88002765808567"
[1] "預測值: 14645.5829417616 實際值: 15381 誤差: -4.78133449215549"
[1] "預測值: 14477.3978320906 實際值: 15323 誤差: -5.51851574697771"
[1] "預測值: 9851.55020425515 實際值: 10473 誤差: -5.93382789787881"
[1] "預測值: 11337.4015608863 實際值: 12095 誤差: -6.26373244409858"
[1] "預測值: 15417.5053358782 實際值: 14246 誤差: 8.2233983986956"
[1] "預測值: 15123.5455847284 實際值: 15231 誤差: -0.705498097771535"
[1] "預測值: 16049.9242132398 實際值: 16029 誤差: 0.130539729488775"
[1] "預測值: 14369.3231442035 實際值: 14618 誤差: -1.70116880419038"
[1] "預測值: 14765.8214583581 實際值: 14775 誤差: -0.0621221092516397"
第三次預測:
[plain] view plaincopyprint?
[1] "預測值: 16278.9064421534 實際值: 14947 誤差: 8.91086132436858"
[1] "預測值: 14634.2898096302 實際值: 15381 誤差: -4.85475710532337"
[1] "預測值: 14483.9746718714 實際值: 15323 誤差: -5.47559438836129"
[1] "預測值: 9818.37752965315 實際值: 10473 誤差: -6.25057261860837"
[1] "預測值: 11366.9309261672 實際值: 12095 誤差: -6.01958721647616"
[1] "預測值: 15417.7054099752 實際值: 14246 誤差: 8.22480282167056"
[1] "預測值: 15126.2971700737 實際值: 15231 誤差: -0.687432407105736"
[1] "預測值: 16066.8686059418 實際值: 16029 誤差: 0.236250582954744"
[1] "預測值: 14364.9178141514 實際值: 14618 誤差: -1.73130514330666"
[1] "預測值: 14771.585261145 實際值: 14775 誤差: -0.023111599695413"