%BP源程序
clc
clear all;
warning off;
SamNum=20; %输入样本数量20
TestSamNum=20; %测试样本数量20
ForcastSamNum=2; %预测样本数量2
HiddenUnitNum=8; %隐藏节点8
InDim=3; %网络输入维度3
OutDim=2; %网络输出维度2
A=xlsread(‘公路运输.xlsx’,‘A1:F20’);
sqrs=A(:,2)’; %人数
sqjdcs=A(:,3)’; %机动车数
sqglmj=A(:,4)’; %公路面积
glkyl=A(:,5)’; %公路客运量
glhyl=A(:,6)’; %公路货运量
p=A(:,2:4)’; %输入数据矩阵
t=A(:,5:6)’; %输入目标矩阵
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对输入和输出归一化 SamIn把矩阵p归一化[-1,1],
% minp 取p矩阵每行的最小值 maxp取p矩阵每行的最大值
% disp(SamIn) SamIn 3乘20 矩阵
% disp(minp) minp 3乘1 矩阵
% disp(maxp) maxp 3乘1矩阵
rand(‘state’,sum(100clock)) %依据系统时钟种子取随机数
NoiseVar=0.01; %噪声强度为0.01,目的是防止网络过拟合
Noise=NoiseVarrand(2,SamNum) %生成噪声
SamOut=tn+Noise; %将噪声添加到输出样本上
TestSamIn=SamIn; %输入样本与测试样本相同 SamIn 3乘20
MaxEpochs=50000; %最多训练次数
lr=0.035; %学习速率
E0=0.6510^(-3); %目标误差为0.6510^(-3)
W1=0.5rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值 8乘3
B1=0.5rand(HiddenUnitNum,1)-0.1; %初始化隐含层的阈值 8乘1
W2=0.5rand(OutDim,HiddenUnitNum)-0.1; %初始化隐含层和输出层之间的权值 2乘8
B2=0.5rand(OutDim,1)-0.1; %初始化 输出层的阈值 2乘1
ErrHistory=[]; %给中间变量预先占据内存
for i=1:MaxEpochs %MaxEpochs 最大循环次数
HiddenOut=logsig(W1SamIn+repmat(B1,1,SamNum)); %隐层网络输出 repmat(B1,1,SamNum) 把B1矩阵为一个基本单元复制成1行SamNum(20)列
%W1 8乘3 SamIn 3乘20
NetworkOut=W2HiddenOut+repmat(B2,1,SamNum); %输出层网络输出 加入动量因子
Error=SamOut- NetworkOut %实际输出与网络输出之差
SSE=sumsqr(Error) %能量函数 (误差平方和)
ErrHistory=[ErrHistory SSE];
if SSE<E0
break
end
% 核心程序:权值依据能量函数负梯度下降原理所做的每一步动态调整量
Delta2=Error; %Error 实际输出与网络输出之差
dW2=Delta2HiddenOut’;
dB2=Delta2ones(SamNum,1);
Delta1=W2’* Delta2.HiddenOut.(1-HiddenOut);
dW1= Delta1SamIn’;
dB1=Delta1ones(SamNum,1);
% 对输出层和隐含层之间的权值和阈值进行修正
W2=W2+lrdW2; %lr 学习率
B2=B2+lrdB2;
%对输入层和隐含层之间的权值和阈值进行修正
W1=W1+lrdW1; %lr 学习率
B1=B1+lrdB1;
end
HiddenOut=logsig(W1SamIn+repmat(B1,1,SamNum)); %隐含层最终输出结果
NetworkOut=W2HiddenOut+repmat(B2,1,SamNum); %输出层网络最终输出结果
a=postmnmx(NetworkOut,mint,maxt) % 还原网络输出层的结果
x=1990:2009;
newk=a(1,:); %网络输出客运量 矩阵的每一行作为一个维度
newh=a(2,:); %网络输出货运量
figure;
subplot(2,1,1);
plot(x,newk,‘r-o’,x,glkyl,‘b–+’); %绘制公路客运量对比图
legend(‘网络输出客运量’,‘实际客运量’);
xlabel(‘年份’);
ylabel(‘客运量/万人’);
title(‘源程序神经网络客运量学习和测试对比图’);
subplot(2,1,2);
plot(x,newh,‘r-o’,x,glhyl,‘b–+’); %绘制公路客运量对比图
legend(‘网络输出货运量’,‘实际货运量’);
xlabel(‘年份’);
ylabel(‘货运量/万吨’);
title(‘源程序神经网络货运量学习和测试对比图’);
% 利用训练好的网络预测
%当对新数据进行预测时,也应做归一化处理
pnew=[73.39 75.55;
3.9635 4.0975;
0.9880 1.0268 ];
pnewn=tramnmx(pnew,minp,maxp);%利用原始数据的归一化参数对新数据归一化
HiddenOut1=logsig(W1pnewn+repmat(B1,1,ForcastSamNum)); %隐含层输出预测结果
anewn=W2HiddenOut1+repmat(B2,1,ForcastSamNum); %输出层网络输出预测结果
anew=postmnmx(anewn,mint,maxt) % 把预测结果还原为原始数量级