clear all
clc
clf
%% 1,读取1961-2015的人口数据,并做归一化处理
input_1=[14.05,14.04,14.07,13.80,13.90,13.96,13.99,13.95,14.06,14.04,13.94,14.02,14.16,13.93,13.99,13.88,14.15,14.06,14.12,14.23,14.28,14.09,14.27,14.12,14.08,14.15,14.29,14.35,14.24,14.39,14.38,14.19,14.21,14.29,14.43,14.33,14.46,14.62,14.40,14.41,14.53,14.62,14.60,14.51,14.66];
n=length(input_1);
row=4; %通过前四年数据,预测第五年
input=zeros(4,n-row);
for i =1:row
input(i,:)=input_1(i:n-row+i-1);
end
output=input_1(row+1:end);
[inputn,inputps]=mapminmax(input);
[outputn,outputps]=mapminmax(output);
%% 2,划分训练集和测试集
inputn_train=inputn(:,1:n-row-5);
inputn_test=inputn(:,n-row-4:end);
outputn_train=outputn(1:n-row-5);
outputn_test=outputn(n-row-4:end);
%% 3,构建BP神经网络
hiddennum=10;%隐含层节点数量经验公式p=sqrt(m+n)+a ,故分别取3~13进行试验
net=newff(inputn_train,outputn_train,hiddennum,{'tansig','purelin'},'trainlm'); %tansig :正切S型传递函数。purelin:线性传递函数。trainlm:Levenberg-Marquardt算法
%% 4,网络参数配置
net.trainParam.epochs=1000;
net.trainParam.lr=0.2;
%% 5,BP神经网络训练
[net,tr]=train(net,inputn_train,outputn_train);
%% 6,仿真计算
resultn=sim(net,inputn_test);
%% 7,计算与测试集之间误差
result=mapminmax('reverse',resultn,outputps);
output_test=mapminmax('reverse',outputn_test,outputps);
error=result-output_test;
rmse=sqrt(error*error')/length(error);
figure(1)
plot(output_test,'b')
hold on
plot(result,'r*');
hold on
plot(error,'s','MarkerFaceColor','k')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('值')
%% 8,预测未来五年2016-2020的人口数据
pn=5;
[p_in,ps]=mapminmax(input_1(n-row+1:end));
p_in=p_in';
p_outn=zeros(1,pn);
for i = 1:pn
p_outn(i)=sim(net,p_in);
p_in=[p_in(2:end);p_outn(i)];
end
p_out=mapminmax('reverse',p_outn,ps)
error2=p_out-[14.55,14.57,14.60,14.68,14.73];
rmse2=sqrt(error2*error2')/length(error2)
figure(2)
plot(1961:2020,[input_1,14.55,14.57,14.60,14.68,14.73],'r*')
hold on
plot(2011:2015,result,'b')
hold on
plot(2015:2020,[result(end),p_out],'g')
plot(1961:2020,[input_1,14.55,14.57,14.60,14.68,14.73],'r*')
1961:2020 是60长度序列,input_1是45长度,[input_1,14.55,14.57,14.60,14.68,14.73]长度是50。
差10个不匹配。