BP神经网络源程序

%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=NoiseVar
rand(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.5
rand(HiddenUnitNum,1)-0.1; %初始化隐含层的阈值 8乘1
W2=0.5rand(OutDim,HiddenUnitNum)-0.1; %初始化隐含层和输出层之间的权值 2乘8
B2=0.5
rand(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=W2
HiddenOut+repmat(B2,1,SamNum); %输出层网络输出 加入动量因子
Error=SamOut- NetworkOut %实际输出与网络输出之差
SSE=sumsqr(Error) %能量函数 (误差平方和)
ErrHistory=[ErrHistory SSE];
if SSE<E0
break
end

% 核心程序:权值依据能量函数负梯度下降原理所做的每一步动态调整量
Delta2=Error; %Error 实际输出与网络输出之差
dW2=Delta2HiddenOut’;
dB2=Delta2
ones(SamNum,1);

Delta1=W2’* Delta2.HiddenOut.(1-HiddenOut);
dW1= Delta1SamIn’;
dB1=Delta1
ones(SamNum,1);

% 对输出层和隐含层之间的权值和阈值进行修正
W2=W2+lrdW2; %lr 学习率
B2=B2+lr
dB2;

%对输入层和隐含层之间的权值和阈值进行修正
W1=W1+lrdW1; %lr 学习率
B1=B1+lr
dB1;
end

HiddenOut=logsig(W1SamIn+repmat(B1,1,SamNum)); %隐含层最终输出结果
NetworkOut=W2
HiddenOut+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=W2
HiddenOut1+repmat(B2,1,ForcastSamNum); %输出层网络输出预测结果
anew=postmnmx(anewn,mint,maxt) % 把预测结果还原为原始数量级

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值