读书使人充实,讨论使人机智,笔记使人准确…。凡有所学,皆成性格。
———— (英国)培根
使用MATLAB建立前馈神经网络主要会使用到下面3个函数:
newff:前馈神经网络创建函数;
train:训练一个神经网络;
sim:使用神经网络进行仿真。
下面简要介绍这3个函数的用法。
newff函数newff函数语法
语法:net=newff(P,T,[S1 S2…S(N-l)],{TF1 TF2…TFN},BTF,BLF,PF,IPF,OPF,DDF)
P:输入矩阵向量;
T:目标矩阵向量;
[S1 S2…S(N-l)]:神经网络前N-1层每层神经元数;
{TF1 TF2…TFN}:神经网络激活函数,默认为‘tansig’;
BTF:学习规则采用的训练算法,默认为‘trainlm’;
BLF:BP权值/偏差学习函数,默认为‘learngdm’;
PF:性能函数,默认为‘mse’;
IPF:输入处理函数;
OPF:输出处理函数;
DDF:验证数据划分函数。一般在使用过程中设置前7个参数,后3个参数采用系统默认参数即可
常用的激活函数
常用的激活函数有 | |
---|---|
线性函数 f ( x ) = x f(x)=x f(x)=x | 该函数的字符串为‘purelin’ |
对数S形转移函数 f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1 ( 0 < f ( x ) < 1 ) (0 < f(x) < 1) (0<f(x)<1) | 该函数的字符串为‘logsig’ |
双曲正切S形函数 f ( x ) = 2 1 + e − x − 1 f(x)=\frac{2}{1+e^{-x}}-1 f(x)=1+e−x2−1 ( − 1 < f ( x ) < 1 ) (-1 < f(x) < 1) (−1<f(x)<1) | 该函数的字符串为‘tansig’ |
只有当希望对网络的输出进行限制(如限制在0和1之间)时在输出层才应当包含S形激活函数。在一般情况下,均是在隐含层采用双极S形激活函数,而输出层采用线性激活函数。
常用的训练函数有: | |
---|---|
trainbfg | BFGS拟牛顿BP算法训练函数 |
trainbr | 贝叶斯正则化算法的BP算法训练函数 |
traingd | 梯度下降的BP算法训练函数 |
traingda | 梯度下降自适应lr的BP算法训练函数 |
traingdm | 梯度下降动量的BP算法训练函数 |
traingdx | 梯度下降动量和自适应lr的BP算法训练函数 |
trainlm | Levenberg-Marquardt的BP算法训练函数 |
trainrp | 具有弹性的BP算法训练函数 |
trains | 顺序递增BP训练函数 |
trainscg | 量化连接梯度BP训练函数 |
常用的学习函数 | |
---|---|
learngd | BP学习规则 |
learngdm | 带动量项的BP学习规则 |
常用的性能函数 | |
---|---|
mse | 均方误差函数 |
msereg | 均方误差规范化函数 |
配置参数 | 一些重要的网络配置参数如下 |
---|---|
net.trainparam.goal | 神经网络训练的目标误差 |
net.trainparam.show | 显示中间结果的周期 |
net.trainparam.epochs | 最大迭代次数 |
net.trainParam.lr | 学习率 |
train函数,train函数即神经网络训练学习函数。
语法:[net,tr,Y1,E]=train(net,X,Y)
X:网络输入矩阵;Y:网络输出矩阵;tr:训练跟踪信息;Y1:网络实际输出;E:误差矩阵。
sim函数,sim函数即神经网络仿真计算函数。
语法:Y=sim(net,X)
net:训练好的神经网络;X:网络输入矩阵;Y:网络输出矩阵。
MATLAB仿真实例
采用贝叶斯正则化算法提高BP网络的推广能力。用来训练BP网络,使其能够拟合某一附加有白噪声的正弦样本数据。
解:仿真过程如下:
(1)构建一个3层BP神经网络:输入层结点数为1个,隐含层结点数为3个,隐含层的激活函数为‘tansig’;输出层结点数为1个,输出层的激活函数为‘logsig’。
(2)采用贝叶斯正则化算法‘trainbr’训练BP网络,目标误差goal=1×10-3,学习率lr=0.05,最大迭代次数epochs=500,拟合附加有白噪声的正弦样本数据,拟合数据均方根误差为0.0054,拟合后的图形如图所示。
MATLAB源程序如下:
%%%%%%%%%%%%%运用BP网络拟合白噪声的正弦样本数据%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
%%%%%%%%%%%%%%%%%%%%%定义训练样本矢量%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%P 为输入矢量%%%%%%%%%%%%%%%%%%%%%%%%%%%%
P = [-1:0.05:1];
%%%%%%%%%%%%%%%%%%%%%%T 为目标矢量%%%%%%%%%%%%%%%%%%%%%%%%%%%%
T = sin(2*pi*P)+0.1*randn(size(P));
%%%%%%%%%%%%%%%%%%%%%%绘制样本数据点%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(P,T,'+');
hold on;
plot(P,sin(2*pi*P),':');
%%%%%%%%%%%%%%%%%%%%%绘制不含噪声的正弦曲线%%%%%%%%%%%%%%%%%%%
net=newff(P,T,20,{'tansig','purelin'});
%%%%%%%%%%%%%%%%%%%采用贝叶斯正则化算法 TRAINBR%%%%%%%%%%%%%%%
net.trainFcn='trainbr';
%%%%%%%%%%%%%%%%%%%%%%设置训练参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net.trainParam.show = 50; %显示中间结果的周期
net.trainParam.lr = 0.05; %学习率
net.trainParam.epochs = 500; %最大迭代次数
net.trainParam.goal = 1e-3; %目标误差
net.divideFcn = ''; %清除样本数据分为训练集、验证集和测试集命令
%%%%%%%%%%%%%%%%%%%%用相应算法训练 BP 网络%%%%%%%%%%%%%%%%%%%%
[net,tr]=train(net,P,T);
%%%%%%%%%%%%%%%%%%%%%对 BP 网络进行仿真%%%%%%%%%%%%%%%%%%%%%%%
A = sim(net,P);
%%%%%%%%%%%%%%%%%%%%%%计算仿真误差%%%%%%%%%%%%%%%%%%%%%%%%%%%%
E = T - A;
MSE=mse(E);
%%%%%%%%%%%%%%%%%%%%%%绘制匹配结果曲线%%%%%%%%%%%%%%%%%%%%%%%%
plot(P,A,P,T,'+',P,sin(2*pi*P),':');
legend('样本点','标准正弦曲线','拟合正弦曲线');
表中所示为某药品的月度销售情况,利用BP神经网络对药品的销售进行预测,预测方法采用滚动预测方式,即用前3个月的销售量来预测第4个月的销售量。如用1、2、3月的销售量为输入,预测第4个月的销售量;用2、3、4月的销售量为输入,预测第5个月的销售量。反复迭代,直至满足预测精度要求为止。
月份 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
销量 | 2056 | 2395 | 2600 | 2298 | 1634 | 1600 |
月份 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|
销量 | 1873 | 1478 | 1900 | 1500 | 2046 | 1556 |
解:仿真过程如下:
(1)构建一个3层BP神经网络对药品的销售进行预测:输入层结点数为3个,隐含层结点数为5,隐含层的激活函数为‘tansig’;输出层结点数为1个,输出层的激活函数为‘logsig’。
(2)采用梯度下降动量和自适应lr算法‘traingdx’训练BP网络,目标误差goal= 1 × 1 0 − 3 1×10^{-3} 1×10−3,学习率lr=0.05,最大迭代次数epochs=1000,其销售实际值和预测值对比曲线如图所示。
药品销售实际值和预测值对比曲线
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%%%%%%运用BP网络预测数据%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
%%%%%%%%%%%%%%%%%%%%%%%%%%%%原始数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p=[2056 2395 2600 2298 1634 1600 1873 1478 1900
2395 2600 2298 1634 1600 1873 1478 1900 1500
2600 2298 1634 1600 1873 1478 1900 1500 2046];
t=[2298 1634 1600 1873 1478 1900 1500 2046 1556];
%%%%%%%%%%%%%%%%%%%%%%%%%%原始数据归一化%%%%%%%%%%%%%%%%%%%%%%%%%
pmax=max(max(p));·
pmin=min(min(p));
P=(p-pmin)./(pmax-pmin); %输入数据矩阵
tmax=max(t);
tmin=min(t);
T=(t-tmin)./(tmax-tmin); %目标数据向量
%%%%%%%%%%%%%%%%%%%创建一个新的前向神经网络%%%%%%%%%%%%%%%%%%%%%%%
net=newff(P,T,5,{'tansig','purelin'},'traingdx');
%%%%%%%%%%%%%%%%%%%%%%%设置训练参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net.trainParam.show = 50; %显示中间结果的周期
net.trainParam.lr = 0.01; %学习率
net.trainParam.epochs = 1000; %最大迭代次数
net.trainParam.goal = 1e-3; %目标误差
net.divideFcn = ''; %清除样本数据分为训练集、验证集和测试集命令
%%%%%%%%%%%%%%%%%调用 TRAINGDM 算法训练 BP 网络%%%%%%%%%%%%%%%%%%
[net,tr]=train(net,P,T);
%%%%%%%%%%%%%%%%%%%%%对 BP 网络进行仿真%%%%%%%%%%%%%%%%%%%%%%%%%%
A = sim(net,P);
%%%%%%%%%%%%%%%%%%%%%%计算预测数据原始值%%%%%%%%%%%%%%%%%%%%%%%%%
a = A.*(tmax-tmin)+tmin;
%%%%%%%%%%%%%%%%%%%%%绘制实际值和预测值曲线%%%%%%%%%%%%%%%%%%%%%%
x=4:12;
figure
plot(x,t,'+');
hold on;
plot(x,a,'or');
hold off
xlabel('月份')
ylabel('销量')
legend('实际销量 ','预测销量');
表中所示为某地区公路运力的历史统计数据表,请建立相应的BP神经网络预测模型,并根据给出的2010年和2011年的数据,预测相应的公路客运量和货运量。
解:仿真过程如下:
(1)构建一个3层BP神经网络对该地区公路运力进行预测:输入层结点数为3个,隐含层结点数为8,隐含层的激活函数为‘tansig’;输出层结点数为2个,输出层的激活函数为‘purelin’。
(2)采用梯度下降动量和自适应lr算法‘traingdx’训练BP网络,目标误差goal=1×10-3,学习率lr=0.035,最大迭代次数epochs=2000。拟合的历年公路客运量曲线和历年公路货运量曲线分别如图9.6和图9.7所示。预测结果为:2010年公路客运量为4.5277亿人,公路货运量为2.2290亿吨;2011年公路客运量为4.5308亿人,公路货运量为2.2296亿吨。
历年公路客运量拟合曲线
历年公路货运量拟合曲线
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%%%%%%运用BP网络预测数据%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
%%%%%%%%%%%%%%%%%%%%%%%%%%%%原始数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%人数(单位:万人)%%%%%%%%%%%%%%%%%%%%%%%%%
sqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09...
39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
%%%%%%%%%%%%%%%%%%%%%%机动车数(单位:万辆)%%%%%%%%%%%%%%%%%%%%%%%%
sqjdcs=[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2...
2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1];
%%%%%%%%%%%%%%%%%%%%公路面积(单位:万平方公里)%%%%%%%%%%%%%%%%%%%%
sqglmj=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36...
0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79];
%%%%%%%%%%%%%%%%%%%%%公路客运量(单位:万人)%%%%%%%%%%%%%%%%%%%%%%%
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 ...
21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];
%%%%%%%%%%%%%%%%%%%%%公路货运量(单位:万吨)%%%%%%%%%%%%%%%%%%%%%%%
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 ...
11203 10524 11115 13320 16762 18673 20724 20803 21804];
%%%%%%%%%%%%%%%%%%%%%%%%%%输入数据矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%
p=[sqrs;sqjdcs;sqglmj];
%%%%%%%%%%%%%%%%%%%%%%%%%%目标数据矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=[glkyl;glhyl];
%%%%%%%%%%%%%%%%%%%%%%%%%原始样本归一化%%%%%%%%%%%%%%%%%%%%%%%%%%
[P,PSp] = mapminmax(p);
[T,PSt] = mapminmax(t);
%%%%%%%%%%%%%%%%%%%创建一个新的前向神经网络%%%%%%%%%%%%%%%%%%%%%%%
net=newff(P,T,8,{'tansig','purelin'},'traingdx');
%%%%%%%%%%%%%%%%%%%%%%%设置训练参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net.trainParam.show = 50; %显示中间结果的周期
net.trainParam.lr = 0.035; %学习率
net.trainParam.epochs = 1000; %最大迭代次数
net.trainParam.goal = 1e-3; %目标误差
net.divideFcn = ''; %清除样本数据分为训练集、验证集和测试集命令
%%%%%%%%%%%%%%%%%调用 TRAINGDM 算法训练 BP 网络%%%%%%%%%%%%%%%%%%
[net,tr]=train(net,P,T);
%%%%%%%%%%%%%%%%%%%%%对 BP 网络进行仿真%%%%%%%%%%%%%%%%%%%%%%%%%%
A = sim(net,P);
a=mapminmax('reverse',A,PSt);
%%%%%%%%%%%%%%%%%%%%优化后输入层权值和阈值%%%%%%%%%%%%%%%%%%%%%%%
inputWeights=net.IW{1,1};
inputbias=net.b{1};
%%%%%%%%%%%%%%%%%%%%优化后网络层权值和阈值%%%%%%%%%%%%%%%%%%%%%%%
layerWeights=net.LW{2,1};
layerbias=net.b{2};
%%%%%%%%%%%%%%%%%%%%%%%%%时间轴刻度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x=1990:2009;
%%%%%%%%%%%%%%%%%%%%%%%网络输出客运量%%%%%%%%%%%%%%%%%%%%%%%%%%%%
newk=a(1,:);
%%%%%%%%%%%%%%%%%%%%%%%网络输出货运量%%%%%%%%%%%%%%%%%%%%%%%%%%%%
newh=a(2,:);
%%%%%%%%%%%%%%%%%%%%绘值公路客运量对比图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(x,newk,'r-o',x,glkyl,'b--+')
legend('网络输出客运量','实际客运量');
xlabel('年份');ylabel('客运量/万人');
%%%%%%%%%%%%%%%%%%%%%%绘制公路货运量对比图%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(x,newh,'r-o',x,glhyl,'b--+')
legend('网络输出货运量','实际货运量');
xlabel('年份');ylabel('货运量/万吨');
%%%%%%%%%%%%%%%%%%%%%利用训练好的网络进行预测%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%2010年和2011年的相关数据%%%%%%%%%%%%%%%%%%%%%
pnew=[73.39 75.55;3.9 4.1;0.98 1.02];
SamNum=size(pnew,2);
%%%%%%%%%%%利用原始输入数据的归一化参数对新数据进行归一化%%%%%%%%%%%
pnewn=mapminmax('apply',pnew,PSp);
%%%%%%%%%%%%%%%%%%%%%%%隐含层输出预测结果%%%%%%%%%%%%%%%%%%%%%%%%%
HiddenOut=tansig(inputWeights*pnewn+repmat(inputbias,1,SamNum));
%%%%%%%%%%%%%%%%%%%%%%%输出层输出预测结果%%%%%%%%%%%%%%%%%%%%%%%%%
anewn=purelin(layerWeights*HiddenOut+repmat(layerbias,1,SamNum));
%%%%%%%%%%%%%%把网络预测得到的数据还原为原始的数量级%%%%%%%%%%%%%%%
anew=mapminmax('reverse',anewn,PSt);