当前位置:文档之家› 数学建模培训--人工神经网络(2)

数学建模培训--人工神经网络(2)

常用的人工神经网络案例1 感知器网络MatLab上机实验例1.1用newp函数设计一个单输入和一个神经元的感知器神经网络,输入的最小0,2。

值和最大值为[]>> net=newp([0 2],1);可以用下面语句来观察生成了一个什么样的神经网络。

>> inputweights = net.inputWeights{1,1}inputweights =delays: 0initFcn: 'initzero'learn: 1learnFcn: 'learnp'learnParam: []size: [1 1]userdata: [1x1 struct]weightFcn: 'dotprod'weightParam: [1x1 struct]从中可以看到,缺省的学习函数为learnp,网络输入给hardlim传递函数的量为数量积dotprod,即输入量和权值矩阵的乘积,然后再加上阈值。

缺省的初始化函数为initzero,即权值的初始值置为0。

同样地,>> biases = net.biases{1,1}biases =initFcn: 'initzero'learn: 1learnFcn: 'learnp'learnParam: []size: 1userdata: [1x1 struct]设计一个输入为二维向量的感知器网络,其边界值已定。

>> net = newp([-2 2;-2 2],1);和上面的例子一样,权值和阈值的初始值为0。

如果不想预置为0,则必须单独生成。

例如,两个权值和阈值分别为[-1 1]和1,应用如下语句:>> net.IW{1,1}=[-1 1];>> net.b{1,1}=[1];应用下面语句验证一下:>> net.IW{1,1}ans =-1 1>> net.b{1,1}ans =1下面来看这个感知器网络对两个输入信号的输出如何,两个信号分别位于感知器两个边界。

第一个输入信号:>> P1=[1;1];>> a1=sim(net,P1)a1 =1第二个输入信号:>> P2=[1;-1];>> a2=sim(net,P2)a2 =由此看出,输出是正确的,感知器为输入信号进行了正确的分类。

若将两个输入信号组成一个数列,则输出量也为一个数列。

>> P3={[1;1],[1;-1]};>> a3=sim(net,P3)a3 =[1] [0]首先有newp函数生成一个神经网络。

>> net = newp([-2 2;-2 2],1);其权值为:>> wts = net.IW{1,1}wts =0 0其阈值为:>> bias = net.b{1,1}bias =改变权值和阈值:>> net.IW{1,1}=[3,4];>> net.b{1,1}=[5];检查权值和阈值,确实已经改变了:>> wts=net.IW{1,1}wts =3 4>> bias=net.b{1,1}bias =5然后应用init来复原权值和阈值。

>> net=init(net);>> wts = net.IW{1,1}wts =0 0>> bias=net.b{1,1}bias =由此可见,应用init可以复原感知器初始值。

例1.4应用init改变网络输入的权值和阈值为随机数。

>> net.inputweights{1,1}.initFcn='rands';>> net.biases{1,1}.initFcn='rands';>> net=init(net);下面验证一下权值和阈值:>> wts = net.IW{1,1}wts =0.8116 -0.7460>> bias=net.b{1,1}bias =0.6294例1.5假设一个二维向量输入的感知器神经网络,其输入和期望值样本为:112,02p t ⎡⎤==⎢⎥⎣⎦、221,12p t ⎡⎤==⎢⎥-⎣⎦、332,02p t -⎡⎤==⎢⎥⎣⎦、441,11p t -⎡⎤==⎢⎥⎣⎦首先,生成一个感知器网络,然后利用train 函数进行训练>> net = newp([-2 2;-2 2],1);>> net.trainParam.epochs=1; %设置最大迭代次数>> p=[2 1 -2 -1;2 -2 2 1]; %样本>> t=[0 1 0 1]; %导师信号>> net = train(net,p,t);>> w=net.IW{1,1}w =-3 -1>> b=net.b{1,1}b =对输入向量进行仿真验证>> sim(net,p)ans =0 0 1 1可见,网络仿真结果没有达到期望值,通过调整训练最大次数可以看其结果。

>> net.trainParam.epochs=20;>> net = train(net,p,t);>> sim(net,p)ans =0 1 0 1因此训练是成功的,训练规则具有一定的收敛性,并且能够达到精度。

例1.6设计一个二输入感知器神经网络,将五个输入向量分为两类。

P=[-0.5 -0.5 0.5 -0.1;-0.5 0.5 -0.5 1.0]T=[1 1 0 0]首先,应用newp构造一个神经元感知器神经网络,然后利用plotpv画出输入向量图,与期望值1对应的输入向量用“+”表示,与期望值0对应的输入向量用“o”表示。

>> P=[-0.5 -0.5 0.5 -0.1;-0.5 0.5 -0.5 1.0];>> T=[1 1 0 0];>> net = newp([-1 1;-1 1],1);>> plotpv(P,T);>> p=[0.7;1.2];>>net=train(net,P,T);>> a=sim(net,p)a =>> plotpv(p,a);>> hold on>> plotpv(P,T);>> plotpc(net.IW{1,1},net.b{1,1})>> hold off由此可见,感知器网络能够做到对输入向量进行正确分类,同时验证了网络的可行性。

例1.7含有奇异样本的输入向量和期望输出如下:P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1 50]T=[1 1 0 0 1]首先,应用newp构造一个神经元感知器神经网络,然后利用plotpv画出输入向量图。

>> net=newp([-40 -0.5;-0.5 50],1);>> plotpv(P,T);>> net=train(net,P,T);>> hold on>> plotpc(net.IW{1,1},net.b{1,1}) >> hold off为了使图形清晰,我们修改坐标值放大部分图形。

>> axis([-2 2 -2 2]);由此可见,网络对于输入向量可以做到正确分类,缺点就是样本存在奇异性的情况下训练时间大大增加了。

>> P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1 50];>> T=[1 1 0 0 1];>> net=newp([-40 -0.5;-0.5 50],1);>> net.inputWeights{1,1}.learnFcn='learnpn';>> net.biases{1,1}.learnFcn='learnpn';>> net=train(net,P,T);>> plotpv(P,T);>> hold on;>> plotpc(net.IW{1,1},net.b{1,1});>> hold off>> axis([-2 2 -2 2])例1.8单层感知器的一个致命弱点就是输入向量必须是线性可分的。

如果输入向量线性可分,感知器可以给出正确的分类结果。

而对于线性不可分的输入向量,感知器就不能对输入向量进行正确分类。

构造五组输入样本P,T是期望输出。

>> P=[-0.5 -0.5 0.3 -0.1 -0.8;-0.5 0.5 -0.5 1.0 0.0];>> T=[1 1 0 0 0];>> plotpv(P,T);>> net = newp(minmax(P),1); >> net = train(net,P,T);>> hold on;>> plotpc(net.IW{1,1},net.b{1,1}); >> hold off不能对其分类,此结果恰恰证明了前面所述的结论。

2 线性神经网络MatLab上机实验例2.1假设输入和期望输出为:>> P=[1 2 3]>> T=[2.0 4.2 5.9]设计网络:>> net = newlind(P,T);通过对输入量进行仿真:>> O=sim(net,P)O =2.0833 4.0333 5.9833可见,网络的输出已经非常接近期望的输出值。

例2.2假设输入和期望输出为:>> P=[2 1 -2 -1;2 -2 2 1];>> T=[0 1 0 1];设计网络:>> net = newlin(minmax(P),1); 训练网络:>> net.trainParam.goal=0.1;>> net = train(net,P,T);>> net.IW{1,1}ans =-0.0615 -0.2194>> net.b{1,1}ans =0.5899网路仿真:>> O=sim(net,P)O =0.0282 0.9672 0.2741 0.4320>> err=T-Oerr =-0.0282 0.0328 -0.2741 0.5680>> mse(err)ans =0.0999例2.3为了测定刀具的磨损速度,做这样的实验:经过一定时间(如每隔一小时),测量一次试根据上面的实验数据建立一个大体合适的神经网络。

相关主题