运用Matlab创建BP神经网络

运用Matlab创建BP神经网络(R2010b)
 

一、BP神经网络属于前向网络

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函数。

传递函数:

  • purelin 线性传递函数
  • tansig 正切 S 型传递函数
  • logsig 对数 S 型传递函数

        隐含层和输出层函数的选择对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函数使用及原理

你可能感兴趣的:(智能算法)