⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 road_yunliang.m

📁 公路客流量预测用matlabbp神经网络程序
💻 M
字号:
%rood_yunliang.m,公路客运量运量BP网络预测,何东健2007年11月20-21日调试
%问题:用BP网络预测公路客运量
%现有某省1978~2002年的客运量数据,即时间序列有N=25个历史观察值,
%采用长度n=5为一期,n0=2为滚动间隔。即用前5年的数据预测下一年的数据,
%每隔2年开始一期长度为5年的观察数据。要求预测出2003年、2004年的客运量。
%分析:20期数据样本分成两组,每组10个,分别做为训练集(1978年开始)和
%测试集(1979年开始)。设计BP网络有5个输入,1个输出。采用双隐含层,
%隐含层神经元数目采用试差法确定,经试验,第1、2隐含层神经元数目分别为8、5,
%即BP网络设计为5-8-5-1。
%将表1中的输入、输出数据比例化到区间[0.2~0.9]内,并将初始权值随机化,取η=0 6,
%用1978年开始的10个训练集训练网络。经1979年开始的10个测试集测试。 
%1978~2002年的客运量数据
%年份	客运量	
%1978 	12815	
%1979	15543	
%1980	19326	
%1981	22864	
%1982	26150	
%1983	28468	
%1984	30882	
%1985	39375	
%1986	45759	
%1987	49589	
%1988	52560	
%1989	48726	
%1990	51083	
%1991	56495	
%1992	62767	
%1993	83606	
%1994	92090	
%1995	101370	
%1996	107317	
%1997	108654	
%1998	111847	
%1999	112872	
%2000	116997	
%2001	126007	
%2002	128980	

close all
clc;
clear;
%按年份排列的原始客运量数据
p0=[12815 15543 19326  22864  26150 28468 30882 39375  45759  49589  52560  48726 ...
      51083  56495  62767  83606  92090  101370  107317  108654  111847  112872 ...
     116997  126007  128980];

 %绘制客运量随年份的变换曲线
year=1978:2002;
plot(year,p0,'b+')
hold on
plot(year,p0,'b-.')
pause

 %将原始数据归一化到[0.2  0.9]
 %规一化公式:规一化后数据=z1+(z2-z1)*(x-xmin)/(xmax-xmin)
 %[z1 z2]为规格化后的数据范围,如本例z1=0.2,z2=0.9;x为待规格化数据;
 %xmin、xmax分别为数据序列的最小、最大值。
  p1=0.2+(0.9-0.2).*(p0-min(p0))./(max(p0)-min(p0));

 %绘制规一化后客运量随年份的变换曲线
 %plot(year,p1)
%pause

%按每5年为一期组织样本,作为训练集,p为输入,t为目标。从第1978年客运量开始
j=0;
for i=1:10;
       p(:,i)=p1(i+j:i+j+4);  %取第i个训练样本,给p
       t(:,i)=p1(i+j+5);
       j=j+1;
end
p
t
pause

%按每5年为一期组织样本,作为测试集,testp为输入,testt为目标。从1979年客运量开始
j=0;
for i=1:10;
       testp(:,i)=p1(i+j+1:i+j+5);
       testt(:,i)=p1(i+j+6);
       j=j+1;
end

%建立BP网络,两层隐含层,隐层神经元数为8、 5,输出为1个单元,训练函数为trainlm
net = newff(minmax(p),[8 5 1],{'tansig' 'tansig' 'purelin'},'trainlm');
%可以设计为一个隐含层的BP网络,隐层神经元数为14;因为数据规一化处理过,
%所以输出层传递函数也可以用'tansig'
%net = newff(minmax(p),[14  1],{'tansig'  'tansig'},'trainlm');
%可以用'trainlm','traingd',' traingdm',' traingda',' traingdx'分别训练网络,看不同训练函数的效果.

%设置训练参数
net.trainParam.lr=0.6;    %学习率
net.trainParam.epochs = 10000; %最大训练次数
net.trainParam.goal = 0.0000001;  %目标误差

%训练网络
net = train(net,p,t);

%仿真
y = sim(net,testp);         %将1979起的10组测试数据输入网络进行测试
E=testt-y;                       %计算测试集网络输出和目标的误差
mse=MSE(E)                 %计算均方误差

%预测2003年客运情况
p03=p1(21:25)'              %取预测数据,1998-2002共5年,转置成列矢量
y03=sim(net,p03)         %用sim仿真,计算2003年客运量(规一化值) 

y2003=min(p0)+(y03-0.2)*(max(p0)-min(p0))/0.7;   %求出客运量实际值

p2=[p0 y2003];                          %将2003年数据加入原始数据p0中
year=[year 2003];                      %将2003年加入年份中
figure
plot(year,p2,'g-.')
hold on
plot(year,p2,'g+')                     %绘制包括2003年预测数据的客运量曲线
hold on
plot(2003,y2003,'ro')                %用红色0绘制2003年预测的数据点。
pause
disp('2003年客运量预测值为:'),y2003
disp('程序运行结束');


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -