BP网络解决XOR分类问题 下载本文

总结:

多层前向BP网络的优点:

①网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题; ②网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力;

③网络具有一定的推广、概括能力。 多层前向BP网络的问题:

①BP算法的学习速度很慢,其原因主要有:

a、由于BP算法本质上为梯度下降法,而它所要优化的目标函数又非常复杂,因此,必然会出现“锯齿形现象”,这使得BP算法低效;

b、存在麻痹现象,由于优化的目标函数很复杂,它必然会在神经元输出接近0或1的情况下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程几乎停顿;

c、为了使网络执行BP算法,不能用传统的一维搜索法求每次迭代的步长,而必须把步长的更新规则预先赋予网络,这种方法将引起算法低效。 ②网络训练失败的可能性较大,其原因有:

a、从数学角度看,BP算法为一种局部搜索的优化方法,但它要解决的问题为求解复杂非线性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败; b、网络的逼近、推广能力同学习样本的典型性密切相关,而从问题中选取典型

8

样本实例组成训练集是一个很困难的问题。

③难以解决应用问题的实例规模和网络规模间的矛盾。这涉及到网络容量的可能性与可行性的关系问题,即学习复杂性问题;

④网络结构的选择尚无一种统一而完整的理论指导,一般只能由经验选定。为此,有人称神经网络的结构选择为一种艺术。而网络的结构直接影响网络的逼近能力及推广性质。因此,应用中如何选择合适的网络结构是一个重要的问题; ⑤新加入的样本要影响已学习成功的网络,而且刻画每个输入样本的特征的数目也必须相同;

⑥网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反而下降,即出现所谓“过拟合”现象。此时,网络学习了过多的样本细节,而不能反映样本内含的规律。

bp网络最大的缺点就是收敛慢,训练时间长,而且常常陷入局部极小点,经常算一个程序要算很久,而且还算不出结果,cpu被完全占用了,又不能做其他的事,简直就是一种折磨!神经网络现在就是拟合非常好,但预测却很差。这主要是因为神经网络是对局部的优化,因此其推广性受到制约,同时又对训练样本极为依赖。而支撑向量机由于其采用的是对多维空间的超平面的寻找,而使她的推广性非常优越。

我觉得bp没有有些人说的那么糟糕,先将数据处理好,再对网络的不足做一些改进,结果还是不错的.我现在用bp做工业预测,我觉得效果还不错,不过个人认为数据的筛选与样本处理是很重要的.适合用的时候才能得到较好的预测结果,神经网络就是寻找规律性(尽管我们不知道是什么样的规律性),如果样本根本就没有规律可以,那么预测效果肯定很差。在工程应用领域中,应用BP网络的好坏最关键的仍然是输入特征选择和训练样本集的准备,若样本集代表性差、矛盾样本多、数据归一化存在问题,那么,使用多复杂的综合算法、多精致的网络结构,建立起来的模型预测效果不会多好。若想取得实际有价值的应用效果,从最基础的数据整理工作做起吧,会少走弯路的。

9

参考文献:

《MATLAB 神经网络应用设计》 闻新 周露 王丹力 熊晓英 编著 《人工智能及其应用》 蔡自兴 徐光佑

附录:

% NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 clear; clc; while 1

disp(' BP网络解决XOR分类问题')

x=input('请选择以下操作:\\n1.设置网络参数:\\n2.输入训练样本\\n3.数据测试\\n'); if x==1

N=input('请输入隐含层和输出层神经元的个数(N*1矩阵):'); S=input('请输入隐含层和输出层的传输函数:'); epochs=input('请输入网络训练时间:'); net.trainParam.show=50; net.trainParam.lr=0.05;

%设置网络训练时间

net.trainParam.epochs=epochs;

goal=input('请输入网络训练精度:');

%设置网络训练精度

net.trainParam.goal=goal; elseif x==2

P=input('请输入网络输入矢量P:'); T=input('请输入网络目标矢量T:');

%利用minmax函数求输入样本范围 PR=minmax(P);

% 创建一个新的前向神经网络 net1=newff(PR,N,S,'trainrp');

%进行网络训练

10

[net1,tr]=train(net1,P,T);

%设置隐层权值 net1.iw{1,1};

%隐层阈值 net1.b{1};

%输出层权值 net1.lw{2,1};

%输出层阈值 net1.b{2};

% 对 BP 网络进行仿真 sim1=sim(net1,P); disp(sim1)

% 计算仿真误差 E1=T-sim1; disp(E1)

% MSE=mse(E1); elseif x==3

Q=input('请输入要测试的输入矢量(2*1矩阵):'); for i=1:4

if Q==P(:,i); A=i; end end

TT=input('请输入要测试的输出矢量(2*1矩阵):'); E=TT-sim1(A);

disp('测试误差E:'); disp(E) else

error('输入有误,请重新运行程序') end end

11