📄 lmbptraffic2.m
字号:
%这是****货运量****的神经网络公式计算程序
clear
clf reset;
figure(gcf);
%setfsize(500,200);
echo on
clc
%初始数据及进行归一化处理——————————————————————————————————
%初始数据是两个,分别是客运量和货运量
clc
primary=[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;
2690 2998 3012 3042 3616 3728 ...
3988 9397 17680 19426 24128 24354 ...
22879 24162 28957 36439 40593 45052 ...
47400 45224 45338 45815 47151 55705 63532]';
%矩阵转置,第一列是客运量,第二列是货运量。
%归一化
maxium=max(primary);%求出两列的最大值,客运量最大值:maxium(1),货运量最大值:maxium(2).
minium=min(primary);%求出两列的最小值,客运量最小值: minium(1),货运量最小值:minium(2).
p1=0.7*(primary(:,1)-minium(1))./(maxium(1)-minium(1))+0.2;%代表归一化后的客运量列向量
p2=0.7*(primary(:,2)-minium(2))./(maxium(2)-minium(2))+0.2;%代表归一化后的货运量列向量
%归一化,将来计算仿真值的原值,需用上面的公式!!!!!
second=[p1';
p2'];%将向量又转置,第一行p1'代表客运量的归一化后的向量,第二行p2'代表货运量的归一化后的向量。
%初始数据及进行归一化处理结束!———————————————————————————————
%开始划分数据,分为训练集和检验集——————————————————————————————
%总样本量N=25,取序列长度n=5,滚动间隔为n0=2。
% 货运量———————————本程序只划分货运量数据集———————————————
for i=1:10
y1(i)=p2(2*i);
y2(i)=p2(2*i+1);
y3(i)=p2(2*i+2);
y4(i)=p2(2*i+3);
y5(i)=p2(2*i+4);%y1等是时间序列行向量。
t(i)=p2(2*i+5);
%上为训练集,下为测试集——————————————
cs1(i)=p2(2*i-1);
cs2(i)=p2(2*i);
cs3(i)=p2(2*i+1);
cs4(i)=p2(2*i+2);
cs5(i)=p2(2*i+3);%cs1等是测试集时间序列行向量。
tcs(i)=p2(2*i+4);
end
y=[y1;
y2;
y3;
y4;
y5];%y是货运量的矩阵,y1,y2,y3,y4,y5为5次输入,8个样本。
p=y;
t=t;%目标输出
cs=[cs1;
cs2;
cs3;
cs4;
cs5]; %cs等是测试集。
%预测2003年和2004年的货运量——————————————
p2003=[p2(21);
p2(22);
p2(23);
p2(24);
p2(25)];
p2004=[p2(22);
p2(23);
p2(24);
p2(25)];
%数据划分结束,分为训练集和检验集,训练集是p,t.—————————————————————
%5个输入,样本为10个。
%输出为1个向量,样本为10个
%pause
clc
plot(t,'+');
title('Training Vectors');
xlabel('Input Vector P');
ylabel('Target Vector T');
%确定输入个数、隐含层神经元、输出层神经元数目————————————————————————
clc
r=5; %输入个数
s1=8; %第一层神经元数
s2=5; %第二层神经元数
s3=1; %第三层神经元数
%确定各个层的权重和阀值———————————————————————————————————
[w1,b1,w2,b2,w3,b3]=initff(p,s1,'tansig',s2,'tansig',t,'purelin');
echo off
%k=pickic;
k=2;
if k==2
w1=rands(s1,r);
b1=rands(s1,1);
w2=rands(s2,s1);
b2=rands(s2,1);
w3=rands(s3,s2);
b3=rands(s3,1);
end
echo on
clc
%确定显示频率、最大步数、学习率———————————————————————————————
df=10;
me=8000;
eg=0.001;
lr=0.4; %学习速率通常初始值在0.3~0.6之间。
tp=[df me eg lr];
%开始训练网络————————————————————————————————————————
[w1,b1,w2,b2,w3,b3,ep,tr]=trainlm(w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin',p,t,tp);
%pause
%实时绘制误差曲线——————————————————————————————————————
clc
plottr(tr,eg);
%pause
%根据已经训练好的网络来仿真输出———————————————————————————————
echo off
a=simuff(p,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
%比较目标输出和仿真输出图形————————————————
acs=simuff(cs,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
%仿真出测试集的输出
figure;
plot(a);
hold on
plot(t,'r');
title('货运量');
%比较目标输出和仿真输出间相对误差—————————————
%将归一化后的目标向量和仿真向量还原成原值,进行比较————————————————————
%使用式p2=0.7*(primary(:,2)-minium(2))./(maxium(2)-minium(2))+0.2;反计算出原始数据!——
a=(a-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
t=(t-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
rate=((a-t)./t).*100;
acs=(acs-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
tcs=(tcs-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
csrate=((acs-tcs)./tcs).*100;
%预测2003年和2004年的货运量——————————————
a2003=simuff(p2003,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
p2004=[p2(22);
p2(23);
p2(24);
p2(25);
a2003];
a2004=simuff(p2004,w1,b1,'tansig',w2,b2,'tansig',w3,b3,'purelin');
%换算回来
a2003=(a2003-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
a2004=(a2004-0.2).*((maxium(2)-minium(2))/0.7)+minium(2);
%将训练和测试集的结果按循序排列,并与目标比较,若测试集效果好,则网络理想——————————
for i=1:10
predict(2*i-1)=acs(i);
predict(2*i)=a(i);
target(2*i-1)=tcs(i);
target(2*i)=t(i);
relateerr(2*i-1)=csrate(i);
relateerr(2*i)=rate(i);
end
state=[' 这是货运量的神经网络模型']
explain=[' 预测值 目标值 相对误差']
compare=[predict' target' relateerr']
figure;
plot(target,'r-*');
hold on
l=length(predict);
predict(l+1)=a2003;
predict(l+2)=a2004;
plot(predict,'b-+');
a2003
a2004
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -