一,说明
对销售额进行bp神经网络预测,销售额如表1
其中前17月数据用作训练样本,来预测第18个月的数据,然后利用前18个月的数据来预测第19个月的数据,以此来预测全部月份的数据,并最终给出真实值与预测值之间的误差
二,程序
程序包括两部分,main.m为主程序,NNetwork.m为训练及预测程序,NNetwork输入为真实数据,输出为预测数据。
程序如下
main程序
clear all %清除变量空间
clc %清除命令窗口所有数据
close all %关闭所有figure窗口
% 数据,前17组为训练数据
t=[124.2 117.1 108.4 102.8 99.2 98.6 100.4 100. 99.4 101.2 103.9 101.8 101.5 104.8 105.9 99.3 103.3 113.2 116.5 117.1 116.9 115.8]; %%原始数据(数据的观测值)
n=1; %每次预测个数
for i=17:21
s=t(1:i);
[a, anew]=NNetwork(s,n); %调用神经网络预测程序
disp(['预测的第',num2str(i+1),'个值为']);
anew %预测值
pred=a(1,:) ;
pred(end+1)=anew; %加上预测值新数据
end
%画图部分
figure
xx=1:i+1;
plot(xx,pred,'r-*',xx,t,'k--+');
legend('预测值','实际值');
xlabel('点数');
ylabel('数据');
figure
s=abs(pred-t)./t*100;
plot(xx,s,'b-*');
xlabel('点数');
ylabel('误差比例(%)');
disp('实际值的标准差为')
std(t) %求标准差
disp('预测值的标准差为')
std(pred)
NNetwork程序如下
function [a, anew]=NNetwork(x,n)
% x为神经网络训练数组
% n为预测数据的个数
p=1:length(x); %%数据的个数
warning off
%数据归一化
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,x);
%BP网络训练
net=newff([-1,1],[5,1],{'tansig','tansig','purelin'},'traingdx'); net.trainParam.show=1000; %每1000轮回显示一次结果net.trainParam.Lr=0.05; %学习速率为0.05
net.trainParam.epochs=5000; %循环5000次
net.trainParam.goal=1e-6; %均方误差
net=train(net,pn,tn); %训练
an=sim(net,pn); %神经网络仿真
a=postmnmx(an,mint,maxt); %还原仿真得到的数据,反归一化%对新数据进行预测
xx=1:length(x);
pnew=[length(xx):length(xx)+n];%预测数据
pnewn=tramnmx(pnew,minp,maxp);%新数据归一化
anewn=sim(net,pnewn);
anew=postmnmx(anewn,mint,maxt);%还原得到预测值
anew=anew(2);
三,程序运行截图
运行main.m文件,结果如图
并给出真实值与预测值的标准差
真是值与预测值的对比曲线及误差比例曲线如图。