matlab神经网络学习总结.docx
《matlab神经网络学习总结.docx》由会员分享,可在线阅读,更多相关《matlab神经网络学习总结.docx(24页珍藏版)》请在冰豆网上搜索。
matlab神经网络学习总结
1通过神经网络滤波和信号处理,传统的sigmoid函数具有全局逼近能力,而径向基rbf函数则具有更好的局部逼近能力,采用完全正交的rbf径向基函数作为激励函数,具有更大的优越性,这就是小波神经网络,对细节逼近能力更强。
BP网络的特点
①网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。
这使得它特别适合于求解内部机制复杂的问题。
我们无需建立模型,或了解其内部过程,只需输入,获得输出。
只要BPNN结构优秀,一般20个输入函数以下的问题都能在50000次的学习以内收敛到最低误差附近。
而且理论上,一个三层的神经网络,能够以任意精度逼近给定的函数,这是非常诱人的期望;
②网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力;
③网络具有一定的推广、概括能力。
bp主要应用
回归预测(可以进行拟合,数据处理分析,事物预测,控制等)、分类识别(进行类型划分,模式识别等),在后面的学习中,都将给出实例程序。
但无论那种网络,什么方法,解决问题的精确度都无法打到100%的,但并不影响其使用,因为现实中很多复杂的问题,精确的解释是毫无意义的,有意义的解析必定会损失精度。
BP注意问题
1、BP算法的学习速度很慢,其原因主要有:
a由于BP算法本质上为梯度下降法,而它所要优化的目标函数又非常复杂,因此,必然会出现“锯齿形现象”,这使得BP算法低效;
结论4:
由上表可以看出,后者的初始权值比较合适些,因此训练的时间变短,
误差收敛速度明显快些。
因此初始权值的选取对于一个网络的训练是很重要的。
1.4,用最基本的BP算法来训练BP神经网络时,学习率、均方
误差、权值、阈值的设置都对网络的训练均有影响。
综合选取合理的值,将有
利于网络的训练。
在最基本的BP算法中,学习率在整个训练过程是保持不变的,
学习率过大,算法可能振荡而不稳定;学习率过小,则收敛速度慢,训练时间
长。
而要在训练之前选择最佳的学习率是不现实的。
因此学习率可变的BP算法
(variablelearningratebackpropagation,VLBP)应运而生。
下一结介绍
用VLBP来训练该网络的情况。
b存在麻痹现象,由于优化的目标函数很复杂,它必然会在神经元输出接近0或1的情况下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程几乎停顿;
c为了使网络执行BP算法,不能用传统的一维搜索法求每次迭代的步长,而必须把步长的更新规则预先赋予网络,这种方法将引起算法低效。
2、网络训练失败的可能性较大,其原因有:
a从数学角度看,BP算法为一种局部搜索的优化方法,但它要解决的问题为求解复杂非线性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败;
b网络的逼近、推广能力同学习样本的典型性密切相关,而从问题中选取典型样本实例组成训练集是一个很困难的问题。
3、网络结构的选择:
尚无一种统一而完整的理论指导,一般只能由经验选定。
为此,有人称神经网络的结构选择为一种艺术。
而网络的结构直接影响网络的逼近能力及推广性质。
因此,应用中如何选择合适的网络结构是一个重要的问题。
4、新加入的样本要影响已学习成功的网络,而且刻画每个输入样本的特征的数目也必须相同。
5、采用s型激活函数,由于输出层各神经元的理想输出值只能接近于1或0,而不能打到1或0,因此设置各训练样本的期望输出分量Tkp时,不能设置为1或0,设置0.9或0.1较为适宜。
一认识bp:
第二节内容:
主要是阐述BP中几个容易混绕的概念和问题,包括什么是网络的泛化能力?
过拟合是什么,怎么处理?
学习速率有什么作用?
神经网络的权值和阈值分别是个什么概念?
用BP逼近非线性函数,如何提高训练精度?
本节主要学习BP中几个容易混绕的概念和问题:
什么是网络的泛化能力?
过拟合是什么,怎么处理?
学习速率有什么作用?
神经网络的权值和阈值分别是个什么概念?
用BP逼近非线性函数,如何提高训练精度?
什么是网络的泛化能力?
一个神经网路是否优良,与传统最小二乘之类的拟合评价不同(主要依据残差,拟合优度等),不是体现在其对已有的数据拟合能力上,而是对后来的预测能力,既泛化能力。
网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。
一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预测能力也提高。
但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反而下降,即出现所谓“过拟合”现象。
此时,网络学习了过多的样本细节,而不能反映样本内含的规律。
过拟合是什么,怎么处理?
神经网络计算不能一味地追求训练误差最小,这样很容易出现“过拟合”现象,只要能够实时检测误差率的变化就可以确定最佳的训练次数,比如15000次左右的学习次数,如果你不观察,设成500000次学习,不仅需要很长时间来跑,而且最后结果肯定令人大失所望。
避免过拟合的一种方法是:
在数据输入中,给训练的数据分类,分为正常训练用、变量数据、测试数据,在后面节将讲到如何进行这种分类。
其中变量数据,在网络训练中,起到的作用就是防止过拟合状态。
学习速率有什么作用?
学习速率这个参数可以控制能量函数的步幅,并且如果设为自动调整的话,可以在误差率经过快速下降后,将学习速率变慢,从而增加BPNN的稳定性。
此时训练方法采用
采用贝叶斯正则化算法提高BP网络的推广能力。
二主要函数
1prepca函数对归一化后的样本数据进行主元分析,从而消除样本数据中的冗余成份,起到数据降维的目的。
[ptrans,transMat]=prepca(pn,0.001);
2、数据归一化mapminmax(x,minx,maxx)minx为要取得的最小值,maxx为最大值一般归一化到0.1-0.9比较和
2或者使用mapstd
3反归一化y1=mapminmax(‘reverse’,y,ps)
4dividevec()函数输入训练数据的乱序排法,以及分类
[trainV,valV,testV]=dividevec(p,t,valPercent,testPercent)
p=rands(3,1000);t=[p(1,:
).*p(2,:
);p(2,:
).*p(3,:
)];
[trainV,valV,testV]=dividevec(p,t,0.20,0.20);
net=newff(minmax(p),[10size(t,1)]);
[trainV,valV,testV,trainInd,valInd,testInd]=divideblock(allV,trainRatio,valRatio,testRatio)
[训练数据,变量数据,测试数据,训练数据矩阵的标号,,变量数据标号,测试数据标号]=divideblock(所有数据,训练数据百分比,变量数据百分比,测试数据百分比)
其实dividevec和后面四个分类函数的区别在于,dividevec一般直接在Matlab代码中调用。
而后面四个函数是通过设置网络的divideFcn函数来实现,比如,net.divideFcn='divideblock',但不是说不可以在代码中像dividevec直接调用
正常数据,是用来正常训练用
变量数据,主要目的是防止训练中出现过拟合状态
测试数据,是用来看训练效果的
net=train(net,trainV.P,trainV.T,[],[],valV,testV);
sim(net,validateSamples.P,[],[],validateSamples.T)
2.任何生成相同的随机数方法:
试着产生和时间相关的随机数,种子与当前时间有关.
rand('state',sum(100*clock))
即:
rand('state',sum(100*clock));rand(10)
只要执行rand('state',sum(100*clock));的当前计算机时间不现,生成的随机值就不现.也就是如果时间相同,生成的随机数还是会相同.在你计算机速度足够快的情况下,试运行一下:
rand('state',sum(100*clock));A=rand(5,5);rand('state',sum(100*clock));B=rand(5,5)
5常用bp训练函数
Traingdm%动量梯度下降算法
Traingda变学习率梯度下降算法
Traingdx%变学习率动量梯度下降算法
TrainrpRPROP(弹性BP)算法,内存需求最小大型网络训练方法
%(共轭梯度算法)
traincgf';%Fletcher-Reeves修正算法
traincgp';%Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
traincgb';%Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大
%(大型网络的首选算法)
trainscg';%ScaledConjugateGradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
trainbfg';%Quasi-NewtonAlgorithms-BFGSAlgorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
trainoss';%OneStepSecantAlgorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
%(中型网络的首选算法)
'trainlm';%Levenberg-Marquardt算法,内存需求最大,收敛速度最快
'trainbr';%贝叶斯正则化算法
6trainb用于网络初始阀值和权值训练函数
[net,tr]=trainb(net,tr,trainV,valV,testV);不直接使用由train调用。
训练好的权值、阈值的输出方法是:
输入到隐层权值:
代码:
w1=net.iw{1,1}
隐层阈值:
代码:
theta1=net.b{1}
隐层到输出层权值代码:
w2=net.lw{2,1};
输出层阈值:
代码:
theta2=net.b{2}
net.IW是输入权值,net.LW是层权值,net.b是阈值。
直接用命令对这些值赋值就可以了。
还有不懂的可以参看帮助
训练好的BP神经网络保存:
因为每次初始化网络时都是随机的,而且训练终止时的误差也不完全相同,结果训练后的权植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同。
找到比较好的结果后,用命令savefilen_amenet_name保存网络,可使预测的结果不会变化,在需要的调用时用命令loadfilename载入。
关于如何找到比较好的结果,进行保存,可以设置误差,在循环中保存,具体使用可以参看bp交通预测优化后的例子
7最大学习速率
lr=0.99*maxlinlr(p,1);A=purelin(W*P,B);e=T-A;[dW,dB]=learnwh(P,e,lr);B=B+dB。
w为权值,b为阀值。
e为误差
神经网络例子。
例子1
本文实习带训练,验证,测试数据的BP函数识别。
x=1:
1:
100;y=2*sin(x*pi/10)+0.5*randn(1,100);plot(x,y);输入输出
[xg,ps]=mapminmax(x,.1,.9);[yg,pt]=mapminmax(y,.1,.9);归一化到0.1-0.9
[trainV,valV,testV]=dividevec(xg,yg,0.2,0.2);随机抽取训练,验证,测试数据
net=newff(minmax(xg),[15,1],{'tansig','purelin'},'trainscg');建立BP函数
net=train(net,trainV.P,trainV.T,[],[],valV,testV);训练
xtrain=sim(net,trainV.P,[],[],trainV.T);仿真
xvalidation=sim(net,valV.P,[],[],valV.T);仿真
xtest=sim(net,testV.P,[],[],testV.T);仿真
ytrainr=mapminmax('reverse',xtrain,pt);对仿真反归一化
yvalidationr=mapminmax('reverse',xvalidation,pt);对仿真反归一化
ytestr=mapminmax('reverse',xtest,pt);对仿真反归一化
trainr=mapminmax('reverse',trainV.T,pt);反归一化
validationr=mapminmax('reverse',valV.T,pt);反归一化
testr=mapminmax('reverse',testV.T,pt);反归一化
msetrain=mse(trainr-ytrainr);求误差
msevalidation=mse(yvalidationr-validationr);求误差
msetest=mse(testr-ytestr);求误差
例2采用贝叶斯正则化算法提高BP网络的推广能力。
☐在本例中,我们采用两种训练方法,即L-M优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练BP网络,使其能够拟合某一附加有白噪声的正弦样本数据。
其中,样本数据可以采用如下MATLAB语句生成:
输入矢量:
P=[-1:
0.05:
1];
目标矢量:
randn(’seed’,78341223);
T=sin(2*pi*P)+0.1*randn(size(P));
解:
本例的MATLAB程序如下:
closeall
clear
echoon
clc
%NEWFF——生成一个新的前向神经网络
%TRAIN——对BP神经网络进行训练
%SIM——对BP神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本矢量
%P为输入矢量
P=[-1:
0.05:
1];
%T为目标矢量
randn('seed',78341223);T=sin(2*pi*P)+0.1*randn(size(P));
% 绘制样本数据点
plot(P,T,'+');
echooff
holdon;
plot(P,sin(2*pi*P),':
');
% 绘制不含噪声的正弦曲线
echoon
clc
pause
clc
% 创建一个新的前向神经网络
net=newff(minmax(P),[20,1],{'tansig','purelin'});
pause
clc
echooff
clc
disp('1. L-M优化算法TRAINLM');disp('2. 贝叶斯正则化算法TRAINBR');
choice=input('请选择训练算法(1,2):
');
figure(gcf);
if(choice==1)
echoon
clc
% 采用L-M优化算法TRAINLM
net.trainFcn='trainlm';
pause
clc
% 设置训练参数
net.trainParam.epochs=500;
net.trainParam.goal=1e-6;
net=init(net);
% 重新初始化
pause
clc
elseif(choice==2)
echoon
clc
% 采用贝叶斯正则化算法TRAINBR
net.trainFcn='trainbr';
pause
clc
% 设置训练参数
net.trainParam.epochs=500;
randn('seed',192736547);
net=init(net);
% 重新初始化
pause
clc
end
% 调用相应算法训练BP网络
[net,tr]=train(net,P,T);
pause
clc
% 对BP网络进行仿真
A=sim(net,P);
% 计算仿真误差
E=T-A;
MSE=mse(E)
pause
clc
% 绘制匹配结果曲线
closeall;
plot(P,A,P,T,'+',P,sin(2*pi*P),':
');
pause;
clc
echooff
RBF网络与BP网络比较:
ØRBF网络的输出是隐单元输出的线性加权和,学习速度加快
ØBP网络使用sigmoid()函数作为激活函数,这样使得神经元有很大的输入可见区域
Ø径向基神经网络使用径向基函数(一般使用高斯函数)作为激活函数,神经元输入空间区域很小,因此需要更多的径向基神经元
二RBF径向基网络
[net,tr]=newrb(P,T,goal,spread,MN,DF)
Spread为分散系数,默认为1,spread分布密度是自己调节的..我建议你多试几次,Spread越大函数就越平滑但是对于目标的接近就越不稳定。
MN为最大神经元数目
HerewedesignaradialbasisnetworkgiveninputsP
andtargetsT.
P=[123];
T=[2.04.15.9];
net=newrb(P,T);
P=1.5;
Y=sim(net,P)
众所周知,BP网络用于函数逼近时,权值的调节采用的是负梯度下降法。
这个调节权值的方法有局限性,即收敛慢和局部极小等。
径向基函数网络(RBF)在逼近能力、分类能力和学习速度等方面均优于BP网络。
Matlab中提供了四个径向基函数相关的函数,它们都是创建两层的神经网络,第一层都是径向基层,第二层是线性层或者竞争层。
主要的区别是它们权值、阀值就算函数不同或者是否有阀值。
注意:
径向基函数网络不需要训练,在创建的时候就自动训练好了。
=newrbe(P,T,spread)
newrbe()函数可以快速设计一个径向基函数网络,且是的设计误差为0。
第一层(径向基层)神经元数目等于输入向量的个数,加权输入函数为dist,网络输入函数为netprod;第二层(线性层)神经元数模有输出向量T确定,加权输入函数为dotprod,网络输入函数为netsum。
两层都有阀值。
第一层的权值初值为p',阀值初值为0.8326/spread,目的是使加权输入为±spread时径向基层输出为0.5,阀值的设置决定了每一个径向基神经元对输入向量产生响应的区域。
2.[net,tr]=newrb(P,T,goal,spread,MN,DF)
该函数和newrbe一样,只是可以自动增加网络的隐层神经元数模直到均方差满足精度或者神经元数模达到最大为止。
例子1
P=-1:
0.1:
1;
T=sin(P);
spread=1;
mse=0.02;
net=newrb(P,T,mse,spread);
t=sim(net,P);
plot(P,T,'r*',P,t)
例子2
P=-1:
0.1:
1;
T=[-0.9602-0.5770-0.07290.37710.64050.66000.46090.1336-0.2013-0.4344-0.5000-0.3930-0.16470.09880.30720.39600.34490.1816-0.0312-0.2189-0.3201];
%应用newb()函数可以快速构建一个径向基神经网络,并且网络自动根据输入向量和期望值%进行调整,从而进行函数逼近,预先设定均方差精度为eg以及散布常数sc。
eg=0.02;
sc=1;
net=newrb(P,T,eg,sc);
figure;
plot(P,T,'+');
xlabel('输入');
X=-1:
0.1:
1;
Y=sim(net,X);
holdon;
plot(X,Y);
holdoff;
legend('目标','输出')
=newgrnn(P,T,spread)泛回归网络(generalizedregressionneuralnetwork)
广义回归网络主要用于函数逼近。
它的结构完全与newbre的相同,但是有以下几点区别(没有说明的表示相同):
(1)第二网络的权值初值为T
(2)第二层没有阀值
(3)第二层的权值输入函数为normpod,网络输入函数为netsum
>>P=0:
1:
20;
>>T=exp(P).*sin(P);
>>net=newgrnn(P,T,0.7);
>>p=0:
0.1:
20;
>>t=sim(net,p);
>>plot(P,T,'*r',p,t)
=newpnn(P,T,spread)概率神经网络(probabilisticneuralnetwork)(主要用于分类问题)
该网络与前面三个最大的区别在于,第二层不再是线性层而是竞争层,并且竞争层没有阀值,其它同newbre,故PNN网络主要用于解决分类问题。
PNN是按下面的方式进行分类的:
为网络提供一输入向量后,首先,径向基层计算该输入向量同样本输入向量之间的距离||dist||,该层的输出为一个距离向量;竞争层接受距离向量为输入,计算每个模式出现的概率,通过竞争传递函数为概率最大的元素对应输出1,否则为0。
注意:
由于第二层是竞争层,故输入/输出向量必须使用ind2vec/vec2ind函数进行转换,也就是将索引转换为向量或者向量转换为索引。
转换后行数等于数据索引个数,列数等于数据索引中最大的值
>>P=[12;22;11]'
P=
121
221
>>Tc=[123];应该为分类索引
>>T=ind2vec(