BP神经网络及其应用神经网络四

Posted 张叔zhangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BP神经网络及其应用神经网络四相关的知识,希望对你有一定的参考价值。

BP神经网络典型案例分析

【例5-1】针对采集到的60组汽油样品,利用傅里叶近红外变换光谱仪对其进行扫描,扫描范围为900~1700nm,扫描间隔为2nm,每个样品的光谱曲线共含401个波长点。同时,利用传统实验室检测方法测定其辛烷值含量。现要求利用BP神经网络及RBF神经网络分别建立汽油样品近红外光谱及其辛烷值之间的数学模型,并对模型的性能进行评价。
其实现的MATLAB代码如下:

>> clear all;
%%训练集/测试集的产生
load spectra_data.mat
%随机产生训练集和测试集
temp = randperm(size(NIR,1));
%训练集的50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
%测试集的10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

BP神经网络概述

线性神经网络只能解决线性可分的问题,这与其单层网络的结构有关。BP神经网络包含多个隐含层,具备处理线性不可分问题的能力。在历史上,由于以前一直没有找到合适的多层神经网络的学习算法,因此神经网络的研究一度陷入低迷。BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播这两个过程组成。正向传播时,输入样本从输入层传入,经各隐含层逐层处理之后,传向输出层。如果输出层的实际输出与期望输出(教师信号)不符,则转入误差的反射传播阶段。误差反传是将输出误差以某种形式通过隐含层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即可作为修正各单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程是周而复始地进行的。权值不断调整的过程,也就是网络的学习训练过程。此过程一直进行到网络输出的误差减小到可接受的程度,或者进行到预先设定的学习次数为止。

BP神经网络算法

【例5-2】采用附加动量法实现BP神经网络训练。
程序实现代码如下:

>> clear all;
%初始化
P=[-6.0 -6.1 -4.1 -4.0 5.0 -5.1 6.0 6.1];
T=[0 0 0.97 0.99 0.01 0.03 1.0 1.0];
[R,Q]=size(P);
[S,Q]=size(T);
disp('The bias B is fixed at 300 and will not learn')
Z1=menu('Initalize Weight with:',...          	%作菜单
    'W0=[-0.9];B0=3;',...                  	%按给定的初始值
    'Pick Values with Mouse/Arrow Keys',...  	%用鼠标在图上单击任意点作为初始值
    'Random Inital Condition[Defaut];');       	%随机初始值(默认情况)
disp('')
B0=3;
if Z1==1

【例5-3】应用自适应学习率的梯度下降法训练BP神经网络。
程序实现代码如下:

>> clear all;
P=[-1 -1 2 2;0 5 0 5];
T=[-1 -1 1 1];        %期望输出
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingda');
net.trainParam.show=50;
net.trainParam.lr=0.05;
net.trainParam.lr_inc=1.05;
net.trainParam.epochs=300;
net.trainParam.goal=1e-5;
[net,tr]=train(net,P,T);
%对网络进行仿真
a=sim(net,P)

【例5-4】用弹性梯度下降法训练BP神经网络。
程序实现代码如下:

>> clear all;
P=[-1 -1 2 2;0 5 0 5];
T=[-1 -1 1 1];
net=newff(minmax(P),[3,1],{'tansig','purelin'},'trainrp');
net.trainParam.show=10;
net.trainParam.epochs=300;
net.trainParam.goal=1e-5;
[net,tr]=train(net,P,T);
%对网络进行仿真
a=sim(net,P)

BP神经网络的设计

【例5-5】请以正弦函数拟合为例,说明BP神经网络的设计。
程序实现代码如下:

>> clear all;
%构造确认样本集val 
P=[-1:0.05:1];                         		%训练样本的输入向量
t0=sin(3*pi*P);                             	%待拟合的正弦函数
t=sin(3*pi*P)+0.15*randn(size(P));            	%训练样本的目标向量
val.P=[-0.975:0.05:0.975];              		%确认样本的输入向量
val.T=sin(3*pi*val.P)+0.15*randn(size(val.P));  	%确认样本的目标向量
%构造网络
net=newff([-1 1],[20 1],{'tansig','purelin'},'traingdx');
net.trainParam.show=25;
net.trainParam.epochs=300;
net=init(net);                      			%网络初始化
%网络训练
[net,tr]=train(net,P,t,[],[],val);
save net2 net;   							                                                                                                       %保存网络

BP神经网络工具箱函数

【例5-6】使用newcf函数对给定的数据创建BP神经网络并进行仿真。
程序实现代码如下:

>> clear all;
X=[2 3;-1 2;2 3];        	%输入训练集
T=[3 4;2 1];          	%目标集
net=newcf(X,T,5);        	%建立BP神经网络
net=train(net,X,T);      	%网络训练
X1=X; 
disp('输出网络仿真数据:')
y=sim(net,X1)

运行程序,得到的训练记录图如图5-20所示。


【例5-8】利用cascadeforwardnet函数建立了一个级联BP神经网络,并对其进行简单拟合。
程序实现代码如下:

>> clear all;
[x,t] = simplefit_dataset;
net = cascadeforwardnet(10);
net = train(net,x,t);
view(net)
y = net(x);
perf = perform(net,y,t)
运行程序,输出结果如下:
perf =
   2.0202e-05

【例5-10】sigmoid函数将偏离原点的数据区间压缩,而靠近原点的数据则被放大。给定一份线性数据,用sigmoid函数处理之后,绝对值较大的数据变得更加接近,而绝对值较小的数据则由于区间被放大显得更稀疏。
程序实现代码如下:

>> clear all;
x=-3:.2:3;
subplot(2,1,1);plot(x,x,'+');
hold on;
plot([0,0],x([8,24]),'^m','LineWidth',3.5)		%将原始数据投射到Y轴
plot(zeros(1,length(x)),x,'+');
grid on;
title('原始数据')
y=logsig(x);							%计算y的值
subplot(2,1,2);plot(x,y,'+')				%显示y
hold on;
plot(zeros(1,length(y)),y,'+')
plot([0,0],y([8,24]),'^m','LineWidth',3.5)
grid on
title('sigmoid函数处理之后')



【例5-13】根据给定的梯度、学习率及动量计算其权值及阈值的变化率。
程序实现代码如下:

>> clear all;
gW = rand(3,2);
lp.lr = 0.45;
lp.mc = 0.8;
ls = [];
[dW,ls] = learngdm([],[],[],[],[],[],[],gW,[],[],lp,ls)
运行程序,输出结果如下:
dW =
    0.3043    0.3128
    0.1301    0.0306
    0.3023    0.1147
ls = 
  struct with fields:
    dw: [3×2 double]

【例5-15】利用traingd函数对给定的输入数据及目标数据进行训练。
程序实现代码如下:

>> clear all;
p = [-1 -1 2 2; 0 5 0 5];
t = [-1 -1 1 1];
%利用feedforwardnet函数创建BP神经网络
net = feedforwardnet(3,'traingd');
%在例子中,关闭稍后介绍的功能
net.divideFcn = '';
%修改一些默认的训练参数
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.epochs = 300;
net.trainParam.goal = 1e-5;
%进行网络训练
[net,tr] = train(net,p,t);
%进行仿真
a = net(p)

traingdm为负梯度下降动量BP算法函数,函数的调用格式如下:
net.trainFcn = ‘traingdm’
[net,tr] = train(net,…)
其参数的含义与trainbfg函数参数的含义相同。
【例5-16】利用feedforwardnet函数创建BP神经网络,并利用traingdm函数对网络进行训练。
程序实现代码如下:

>> clear all;
p = [-1 -1 2 2; 0 5 0 5];
t = [-1 -1 1 1];
net = feedforwardnet(3,'traingdm');
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net = train(net,p,t);
y = net(p)

【例5-17】创建一个BP神经网络,然后利用msereg函数评估其性能。
程序实现代码如下:

>> clear all;
%创建一个BP神经网络
net=newff([-6,6],[4,2],{'tansig','purelin'},'trainlm','learngdm','msereg');
p=[-6 -3 0 3 6];
t=[0 1 1 1 0];
y=net(p)
e=t-y   						%误差向量
net.performParam.ratio=20/(20+1);  	%设置性能参数
perf=msereg(e,net)

3)plotes函数
plotes函数用于绘制一个单独神经元的误差曲面,函数的调用格式如下:
plotes(WV,BV,ES,V)
其中,WV为N维的权值行向量;BV为M维的阈值行向量;ES为误差向量组成的M×N维的矩阵;V为视角,默认值为[-37.5,30]。
plotes函数绘制的误差曲线图是由权值和阈值确定的,由errsurf函数计算得到。
【例5-19】根据输入样本及目标数据,绘制其误差曲面及轮廓线。
程序实现代码如下:

>> clear all;
p = [3 2 4];  				%输入样本
t = [0.4 0.8 1];  				%目标数据
wv = -4:0.4:4;  				%权值
bv = wv;  					%阈值
ES = errsurf(p,t,wv,bv,'logsig');  	%计算误差曲面
plotes(wv,bv,ES,[60 30]);  		%绘制误差曲面


4)plotep函数
plotep函数用于绘制权值和阈值在误差曲面上的位置,函数的调用格式如下:
H = plotep(W,B,E)
其中,W为当前权值;B为当前阈值;E为当前输入神经元的误差。
H = plotep(W,B,E,H)
其中,H为当前权值和阈值位置的信息向量。
【例5-20】根据输入样本及目标数据,计算权值和阈值在误差曲面上的位置。
程序实现代码如下:

>> clear all;
x=[4.5 4.5 4.5 ];  			%输入样本
t=[0.4 0.45 0.5];  			%目标数据
wv=-4:0.4:4;  				%权值
bv=wv;  					%阈值
ES=errsurf(x,t,wv,bv,'logsig');  	%计算误差曲面
plotes(wv,bv,ES,[60,50]);  		%绘制误差曲面
wv=-4;bv=0;
net=newlind(x,t);  			%创建线性神经网络
y=net(x);
e=t-y;
E=sumsqr(e);
plotep(wv,bv,E);  			%计算权值和阈值在误差曲面上的位置

BP神经网络的应用

【例5-21】用BP神经网络可以实现两类模式的分类,如图5-34所示。
根据如图5-34所示的两类模式确定的训练样本如下:
P=[1 3;-1 2;-2 1;-3 0];T=[0.3 0.7 0.8 0.2]
分析以上问题,因为处理的问题简单,所以采用最速下降BP算法来训练该网络。其实现的MATLAB代码如下:

>> clear all;
%定义输入向量及目标向量
P=[1 3;-1 2;-2 1;-3 0]';
T=[0.3 0.7 0.8 0.2];
%创建BP神经网络,并定义训练函数及参数
net=newff([-1 1;-1 1],[5 1],{'logsig','logsig'},'traingd');
net.trainParam.goal=0.001;
net.trainParam.epochs=5000;
[net,tr]=train(net,P,T);       	%网络训练

【例5-24】演示BP神经网络在模式识别中的应用。
设计一个网络并训练它来识别字母表中的26个字母,数字成像系统对每个字母进行分析,然后将其变成数字信号。图5-58所示显示的就是字母A的网格图。
实现的MATLAB代码如下:

>>clear all;
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
S1=10;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);`在这里插入代码片`
P=alphabet;
net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'traingdx');  %构建BP神经网络
net.LW{2,1}=net.LW{2,1}*0.01;
net.b{2}=net.b{2}+0.01;

BP神经网络在估计方面的应用

【例5-25】拟设计一台仪器,通过对血液样本进行光谱分析来测试血清中胆固醇的含量。共采集了364位病人的血液样本,对其进行光谱分析共发现21种光谱波长,对这些病人通过血清分离,同样可以测量hdl、ldl、vldl胆固醇的含量。
其实现的MATLAB代码如下:

>>  clear all;
load choles_all;         								% choles_all自带的数据
[pn,meanp,stdp,tn,meant,stdt]=prestd(p,t);
%删除一些数据,只保留了所占99.9%的主要成分数据
[ptrans,transMat]=prepca(pn,0.001);
[R,Q]=size(ptrans)            							%检查转换后数据矩阵的大小

以上是关于BP神经网络及其应用神经网络四的主要内容,如果未能解决你的问题,请参考以下文章

Matlab的BP神经网络工具箱及其在函数逼近中的应用

基于蝙蝠算法优化BP神经网络的数据分类算法及其MATLAB实现-附代码

BP神经网络的数学原理及其算法实现

神经网络——BP学习算法推导

神经网络——BP学习算法推导

神经网络——BP学习算法:反向传播算法推导