人工神经网络及其应用实例—-毕业论文设计 下载本文

[Pn, minp, maxp, Tn, mint, maxt] = premnmx(P, T);

tramnmx:在训练网络是如果所用的是经过归一化的样本数据, 那么以后使用网络时所用的新数据也应该和样本数据接收相同的预

处理,tramnmx 用于完成此项处理,语法格式为:

Pn_new = tramnmx(P_new,minp,maxp); Tn_new = tramnmx(T_new,mint,maxt);

postmnmx:网络输出结果需要反归一化还原为原始数据,常用

的函数即是 postmnmx,其语法格式为:

Y = postmnmx(Yn,mint,maxt);

newff:训练前馈网络的第一步是建立网络对象。函数 newff 建

立一个可训练的前馈网络。这需要 4 个输入参数:

第一个参数是一个 Rx2 的矩阵以定义 R 个输入向量的最小值和最

大值;第二个参数是一个设定每层神经元个数的数组;第三个参数是

包含每层用到的传递函数名称的细胞数组;最后一个参数是用到的训

练函数的名称。

例如可以这样建立一个网络对象:

net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2}, 'trainlm'); 或者可以在建立网络对象时并不设定训练函数,而是之后进行指 定,如:

net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2}); net.trainFcn = 'trainlm';

两者是等效的。

train:BP 神经网络的训练函数,其语法格式为:

net = train(net,Pn,Tn);

sim:对于给定的输入量,模拟神经网络的输出,其语法格式为:

Yn = sim(net,Pn);

Page 21 of 25

例如使用神经网络工具箱对一个正弦函数进行拟合,源程序如下:

clc clear close all

%--------------------------------------------------- % 产生训练样本与测试样本

P1 = 1:2:200; % 训练样本,每一列为一个样本 T1 = sin(P1*0.1); % 训练目标

P2 = 2:2:200; % 测试样本,每一列为一个样本 T2 = sin(P2*0.1); % 测试目标

%---------------------------------------------------

% 归一化

[PN1,minp,maxp,TN1,mint,maxt] = premnmx(P1,T1); PN2 = tramnmx(P2,minp,maxp); TN2 = tramnmx(T2,mint,maxt);

%--------------------------------------------------- % 设置网络参数

NodeNum = 20; % 隐层节点数 TypeNum = 1; % 输出维数

TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值) %TF1 = 'tansig';TF2 = 'logsig'; %TF1 = 'logsig';TF2 = 'purelin'; %TF1 = 'tansig';TF2 = 'tansig'; %TF1 = 'logsig';TF2 = 'logsig'; %TF1 = 'purelin';TF2 = 'purelin';

net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2}); %--------------------------------------------------- % 指定训练参数

% net.trainFcn = 'traingd'; % 梯度下降算法

% net.trainFcn = 'traingdm'; % 动量梯度下降算法 %

% net.trainFcn = 'traingda'; % 变学习率梯度下降算法

Page 22 of 25

% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法 %

% (大型网络的首选算法)

% net.trainFcn = 'trainrp'; % RPROP(弹性 BP)算法,内存需求最小 %

% 共轭梯度算法

% net.trainFcn = 'traincgf'; % Fletcher-Reeves 修正算法

% net.trainFcn = 'traincgp'; % Polak-Ribiere 修正算法,内存需求比 Fletcher-Reeves 修正算法略大

% net.trainFcn = 'traincgb'; % Powell-Beal 复位算法,内存需求比 Polak-Ribiere 修正算法略大

% (大型网络的首选算法)

%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient 算法,内存需求与 Fletcher-Reeves 修正算法相同,计算量比上面三种算法都小很多 %

% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm, 计算量和内存需求均比共轭梯度算法大,但收敛比较快

% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需 求均比 BFGS 算法小,比共轭梯度算法略大 %

% (中型网络的首选算法)

% net.trainFcn = 'trainlm'; % Levenberg-Marquardt 算法,内存需求最大,收敛速 度最快 %

% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法 %

% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm'

%---------------------% net.trainFcn = 'trainlm';

net.trainParam.show = 20; % 训练显示间隔

net.trainParam.lr = 0.3; % 学习步长 - traingd,traingdm net.trainParam.mc = 0.95; % 动量项系数 - traingdm,traingdx net.trainParam.mem_reduc = 1; % 分块计算 Hessian 矩阵(仅对 Levenberg-Marquardt 算法有效)

net.trainParam.epochs = 1000; % 最大训练次数 net.trainParam.goal = 1e-8; % 最小均方误差 net.trainParam.min_grad = 1e-20; % 最小梯度 net.trainParam.time = inf; % 最大训练时间

%--------------------------------------------------- % 训练

Page 23 of 25

net = train(net,PN1,TN1); % 训练

%---------------------------------------------------

% 测试

YN1 = sim(net,PN1); % 训练样本实际输出 YN2 = sim(net,PN2); % 测试样本实际输出 MSE1 = mean((TN1-YN1).^2) % 训练均方误差 MSE2 = mean((TN2-YN2).^2) % 测试均方误差

%---------------------------------------------------

% 反归一化

Y2 = postmnmx(YN2,mint,maxt);

%--------------------------------------------------- % 结果作图

plot(1:length(T2),T2,'r+:',1:length(Y2),Y2,'bo:') title('+为真实值,o 为预测值')

Page 24 of 25