天天看点

数学建模智能优化算法之神经网络案例附Matlab代码

读书使人充实,讨论使人机智,笔记使人准确…。凡有所学,皆成性格。

———— (英国)培根

使用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,拟合后的图形如图所示。

BP网络拟合附加白噪声的正弦曲线

数学建模智能优化算法之神经网络案例附Matlab代码

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代码

药品销售实际值和预测值对比曲线

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年的数据,预测相应的公路客运量和货运量。

数学建模智能优化算法之神经网络案例附Matlab代码

解:仿真过程如下:

(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代码

历年公路货运量拟合曲线

数学建模智能优化算法之神经网络案例附Matlab代码

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);
           

继续阅读