神经网络在数学建模竞赛中的应用 下载本文

隐层I任一节点之间权值的修正量为

?wmi(n)???iI(n)xkm(n) (2-21) 其中

??f'(u(n))IiIiIiIiJ??j(n)?wij(n) (2-22) j?1J?viI(n)式中?可由式(3-17)求出,f'(u(n))?I?viI(n)(1?viI(n)).wij(n)为隐层I与隐

?ui(n)层J之间任一节点之间的权值,已由式(2-20)求得.

则下一次迭代时,输入层M上任一节点与隐层I上任一节点之间的权值为 wmi(n?1)?wmi(n)??wmi(n) (2-23)

2.3.3 BP网络的MATLAB仿真程序设计的基本方法

BP网络设计主要包括输入层、隐层、输出层及各层之间的传输函数几个方面.

1. 网络层数

大多数通用的神经网络都预先确定了网络的层数,而BP网络可以包括不同的隐层.但理论上已经证明,在不限隐层节点数的情况下,两层(只有一个隐层)的BP网络可以实现任意非线性映射.在模式样本相对较少的情况下,较少的隐层节点,可以实现模式样本空间的超平面划分,此时,选择两层BP网络就可以了;当模式样本数很多时,减少网络规模,增加一个隐层是必要的,但BP网络隐层数一般不超过两层.

2. 输入层的节点数

输入层起缓冲存储器的作用,它接收外部的输入数据,因此其节点数取决于输入矢量的维数.比如,当把32?32大小的图像作为输入数据时,输入节点数将为1024个.

3. 输出层的节点数

输出层的节点数取决于两个方面,输出数据类型和表示该类型所需要的数据大小.当BP网络用于模式分类时,以二进制形式来表示不同模式的输出结果,则输出层的节点数可根据待分类模式数来确定.若设待分类模式的总数为m,则有两种方法确定输出层的节点数:

(1) 节点数即为待分类模式总数m,此时对应第j个待分类模式的输出为

[00?010?00]Oj?

j即第j个节点输出为1,其余为0.而以输出全为0表示拒识,即所输入的模式不属于待分类模式中的任一种模式. (2) 节点数为logm2个.这种输出方式是m种输出模式的二进制编码. 4. 隐层的节点数

一个具有无限隐层节点的两层BP网络可以实现任意从输入到输出的非线性映射.但对于有限个输入模式到输出模式的映射,并不需要无限个隐层节点,这就涉及到如何选择隐层节点数的问题,而这一问题的复杂性,即到至今为止,尚未找到一个很好的解析式,隐层节点数往往根据前人设计所得的经验和自己进行试验来确定.一般认为,隐层节点数与求解问题的要求、输出单元多少都有直接的联系.另外,隐层节点数太多会导致学习时间过长;而节点数太少,容差性差,识别未经学习的样本能力低,所以必须综合多方面因素进行时设计.

21

5. 传输函数通常采用S(sigmoid)型函数:

1f(x)?

1?e?x在某些特定情况下,还可能采用纯线性函数.如果BP网络最后一层是S(sigmoid)函数,那么整个函数的输出就限制在一个较小的范围内(0~1之间的任意连续量);如果BP网络的最后一层是纯线性函数,那么整个网络的输出可以是任意值. 创建和训练BP的MATLAB程序如下:

clear all

%定义输入向量和目标向量 p=[1 2;-1 1;-2 1;4 0]'; t=[0.2 0.8 0.8 0.2];

%创建BP网络和定义训练函数及参数

net=newff([-1 1;-1 1],[5 1],{'logsig' 'logsig'},'taingd'); net.trainParam.goal=0.001; net.trainParam.epochs=5000;

%训练神经网络 [net,tr]=train(net,p,t);

%输出训练后的权值和阀值 iw1=net.IW{1} b1=net.b{1} lw2=net.LW{2} b2=net.b{2}

第三章 神经网络在数学建模中的应用

3.1 神经网络算法在非线性方程与微分方程方面的应用

3.1.1 非线性函数的逼近

使用神经网络逼近非线性函数f(x)?2x6?3x5?3x3?2x2,绘制非线性函数,并产生网络训练数据点. 解:

非线性神经网络的输出函数为非线性传递函数purelin,其输出可以为任意数值,因此非线性神经网络应用范围非常广泛,可以应用于非线性系统拟合、函数逼近、系统识别等方面.

%matlab程序 x=-2:.01:1;

y=2*x.^6+3*x.^5+3*x.^3-2*x.^2; p=x(1:15:end); t=y(1:15:end); plot(x,y,p,t,'ko')

legend('逼近函数','网络训练点' )

22

其中,x,y数据作为线性神经网络的训练数据点集,程序运行结果如图3-1所示.

使用newlind函数训练线性神经网络: q=length(y); r=zeros(6,q);

r(1,2:q)=y(1,1:(q-1)); r(2,3:q)=y(1,1:(q-2)); r(3,4:q)=y(1,1:(q-3)); r(4,5:q)=y(1,1:(q-4)); r(5,6:q)=y(1,1:(q-5));

r(6,7:q)=y(1,1:(q-6)); net=newlind(r,y); a=sim(net,r); figure

plot(x,y,x,a,'k-o')

legend('给定输入信号','网络输出信号') 运行结果如图3-1所示.

10逼近函数网络训练点50-5-10-15-20-2-1.5-1-0.500.51

图3-1 非线性逼近函数和网络训练

23

10给定输入信号网络输出信号50-5-10-15-20-2-1.5-1-0.500.51

图3-2 线性神经网络非线性曲线逼近结果

3.1.2 线性神经网络逼近函数

使用newlin函数构建线性神经网络逼近函数:

?cos(?t)0?t?2?y??cos(3?t)2?t?4

?cos(5?t)4?t?6?(1) 首先,产生输入训练样本和训练目标样本. %matlab程序 time1=0:.01:2; time2=2:.01:4; time3=4:.01:6;

time=[time1 time2 time3];

t=[cos(time1*pi) cos(time2*3*pi) cos(time3*5*pi)]; t=con2seq(t); %将向量转化为序列cell向量

p=t; %输出向量等于给定输出向量

(2) 使用newlin函数构建线性神经网络,并使用adapt函数训练网络. lr=0.1;

delays=[1 2 3 4 5 6];

net=newlin(minmax(cat(2,p{:})),1,delays,lr); [net,a,e]=adapt(net,p,t);

(3) 绘制网格输出信号和给定信号以及残差信号曲线. plot(time,cat(2,p{:}),time,cat(2,a{:}),'k-o') legend('给定输入信号','网格输出信号') figure

plot(time,cat(2,e{:})) title('误差曲线')

结果如图3-3和图3-4所示.

24