神经网络算法,对于预测分析具有很好的效果,此外,该算法能够较快的得出结果,适合多种不同场合使用,倘若运用在数学建模之上,更是能加一波大分。

x=[5452.1
5848.1
6212
6775.5
7539.4
8115.9
9278
10070.3
10813.1
11355.5
11670
12393
13556
14808
16540
19105.8
22033.1
25002.6
28657.3
32815.5
34957.6
37146.5
42071.6
47130.2
49875.5
54316.4
57944.6
58105.8
]';
% 该脚本用来做NAR神经网络预测
% 作者:Macer程
lag=5;    % 自回归阶数
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 = 13; %隐藏层神经元个数
net = fitnet(hiddenLayerSize);
 
% 避免过拟合,划分训练,测试和验证数据的比例
net.divideParam.trainRatio = 81.8/100;
net.divideParam.valRatio = 9.1/100;
net.divideParam.testRatio = 9.1/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=5;  %预测步数为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(1:55,iinput,'b',50:55,[iinput(end),f_out],'r')