运用Matlab创建BP神经网络(R2010b)
1、以下为创建BP神经网络的方法及参数意义
net=newff(P,T,S)或者net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)
参数说明:
(1)P:输入参数矩阵。(RxQ1)
(2)T:目标参数矩阵。(SNxQ2)
(3)S:N-1个隐含层的数目(S(i)到S(N-1)),输出层的单元数目取决于T,默认为空矩阵。
(4)TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。
传递函数:
隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点转移函数选用 tansig函数或logsig函数,输出层节点转移函数选用tansig函数或purelin函数。
(5)BTF:BP神经网络学习训练函数,默认值为trainlm函数。
学习训练函数:
神经网络的学习分为有导师学习和无导师学习。
newff函数中训练函数 | ||
最速下降BP算法 | traingd | 基本梯度下降法,收敛速度比较慢。 |
动量BP算法 | traingdm | 带有动量项的梯度下降法, 通常要比traingd 速度快。 |
学习率可变的BP算法 | trainda(学习率可变的最速下降BP算法) | 自适应学习率的梯度下降法 |
traindx(学习率可变的动量BP算法) | 带有动量项的自适应学习算法, 速度要比traingdm 快。 | |
弹性算法 | trainrp | 弹性BP 算法, 具有收敛速度快和占用内存小的优点。 |
变梯度算法 | traincgf(Fletcher-Reeves修正算法) | Fletcher-Reeves 共轭梯度法,为共轭梯度法中存储量要求最小的算法。 |
traincgp(Polak_Ribiere修正算法) | Polak-Ribiers共轭梯度算法, 存储量比traincgf稍大,但对某些问题收敛更快。 | |
traincgb(Powell-Beale复位算法) | Powell-Beale共轭梯度算法,存储量比traincgp稍大,但一般收敛更快,以上三种共轭梯度法,都需要进行线性搜索。 | |
trainbfg(BFGS 拟牛顿算法) | BFGS- 拟牛顿法, 其需要的存储空间比共轭梯度法要大,每次迭代的时间也要多,但通常在其收敛时所需的迭代次数要比共轭梯度法少,比较适合小型网络。 | |
trainoss(OSS算法) | 一步分割法,为共轭梯度法和拟牛顿法的一种折衷方法。 | |
trainlm(LM算法) | Levenberg-Marquardt算法,对中等规模的网络来说, 是速度最快的一种训练算法, 其缺点是占用内存较大。对于大型网络, 可以通过置参数mem-reduc 为1, 2, 3,⋯,将Jacobian 矩阵分为几个子矩阵。但这样也有弊端, 系统开销将与计算Jacobian的各子矩阵有很大关系。 | |
trainscg | 归一化共轭梯度法,是唯一一种不需要线性搜索的共轭梯度法。 | |
trainbr | 贝叶斯规则法,对Levenberg-Marquardt算法进行修改, 以使网络的泛化能力更好。同时降低了确定最优网络结构的难 |
参数说明:
神经网络主要训练参数:
net.trainParam.goal=0.1 % 训练目标最小误差,这里设置为0.1
net.trainParam.epochs=300; % 训练次数,这里设置为300次
net.trainParam.show=20; % 显示频率,这里设置为没训练20次显示一次
net.trainParam.mc=0.95; % 附加动量因子
net.trainParam.lr=0.05; % 学习速率,这里设置为0.05
net.trainParam.min_grad=1e-6; %最小性能梯度
net.trainParam.min_fail=5; % 最大确认失败次数
(6)BLF:权重学习函数,默认值为learngdm。
(7)PF:性能函数,默认值为mse。
IPF,OPF,DDF均为默认值即可。
2、BP神经网络预测函数
SimOut = sim('model', Parameters) & y=sim(net,x)
函数功能:用训练好的BP神经网络预测函数输出
net:训练好的网络
x:输入数据
y:网络预测数据
3、训练函数
[net,tr] = train(Net,P,T,Pi,Ai)
其中,
Net 待训练的网络
P 输入数据矩阵
T 输出数据矩阵 (default = zeros)
Pi 初始化输入层条件 (default = zeros)
Ai 初始化输出层条件 (default = zeros)
net 训练好的网络
tr 训练过程记录
注意:P Ni-by-TS cell array Each element P{i,j,ts} is an Ni-by-Q matrix.
T Nl-by-TS cell array Each element T{i,ts} is a Ui-by-Q matrix.
BP网络的常用函数表
函数类型 | 函数名称 | 函数用途 |
前向网络创建函数 | newcf | 创建级联前向网络 |
Newff | 创建前向BP网络 | |
传递函数 | logsig | S型的对数函数 |
tansig | S型的正切函数 | |
purelin | 纯线性函数 | |
学习函数 | learngd | 基于梯度下降法的学习函数 |
learngdm | 梯度下降动量学习函数 | |
性能函数 | mse | 均方误差函数 |
msereg | 均方误差规范化函数 | |
显示函数 | plotperf | 绘制网络的性能 |
plotes | 绘制一个单独神经元的误差曲面 | |
plotep | 绘制权值和阈值在误差曲面上的位置 | |
errsurf | 计算单个神经元的误差曲 |
二、matlab代码
function [result]=myBP(option,data)
hiddenumber=data.hiddenumber;
inputnumber=data.inputnumber;
outputnumber=data.outputnumber;
S=data.S;
indexM=data.indexM;
N=data.N;
input_train=data.train_x0;
output_train=data.train_y0;
input_test=data.test_x0;
%新建bp神经网络
net0=newff(input_train',output_train',hiddenumber);
%net0.trainFcn='traingd';
net0.trainParam.epochs=50;%训练次数
net0.trainParam.lr=0.2;%学习率
net0.trainParam.goal=0.01;%训练目标最小误差,这里设置为0.01
net0.trainParam.showWindow = false; % 不显示训练窗口
net0.trainParam.showCommandLine = false;% 命令行不显示结果
%训练
[net0,tr]=train(net0,input_train',output_train');
%仿真
ygabptest=sim(net0,input_test');
ygabptest=mapminmax('reverse',ygabptest,option.ps_y);%预测数据反归一化
T2=mapminmax('reverse',data.test_y0',option.ps_y);%预测数据反归一化
fit=sum(sum((abs(ygabptest-T2)./T2).^2));
result.net=net0;
result.ygabptest=ygabptest;
result.T2=T2;
ygabptrain=sim(net0,input_train');
ygabptrain=mapminmax('reverse',ygabptrain,option.ps_y);%预测数据反归一化
T1=mapminmax('reverse',data.train_y0',option.ps_y);%预测数据反归一化
result.ygabptrain=ygabptrain;
result.T1=T1;
fit=sum(sum((abs(ygabptest-T2)./T2).^2))+sum(sum((abs(ygabptrain-T1)./T1).^2));
result.fit=fit;
end
参考:
神经网络理论 超全超详细 通熟易懂
Matlab mapminmax函数使用及原理