当前位置:文档之家› 感知器算法实验 -1

感知器算法实验 -1

1. 理解线性分类器的分类原理。

2. 掌握感知器算法,利用它对输入的数据进行分类。

3. 理解BP 算法,使用BP 算法对输入数据进行分类。

二. 实验原理 1.感知器算法感知器算法是通过训练模式的迭代和学习算法,产生线性可分的模式判别函数。

感知器算法就是通过对训练模式样本集的“学习”得出判别函数的系数解。

在本次实验中,我们主要是采用硬限幅函数进行分类。

感知器的训练算法如下:设输入矢量{x 1,x 2,…,x n }其中每一个模式类别已知,它们分别属于ω1类和ω2类。

(1)置步数k=1,令增量ρ为某正的常数,分别赋给初始增广权矢量w(1)的各分量较小的任意值。

(2)输入训练模式x k ,计算判别函数值w T (k) x k 。

(3)调整增广权矢量,规则是:a.如果x k ∈ω1和w T (k) x k ≤0,则w(k+1)=w(k)+ ρx k ;b.如果x k ∈ω2和w T (k) x k ≥0,则w(k+1)=w(k)-ρx k ;c.如果x k ∈ω1和w T (k) x k >0,或x k ∈ω2和w T (k) x k <0,则w(k+1)=w(k)(4)如果k <N ,令k=k+1,返回至(2)。

如果k=N ,检验判别函数w T (k) x k 对x 1,x 2,…,x n 是否正确分类。

如果是,结束;如果不是,令k=1,返回至(2)。

如果训练模式已经符号规范化,即x k ∈ω2已经乘以-1(包括增广分量1),则校正权矢量的规则可统一为()(1)()k w k w k w k x ρ⎧+=⎨+⎩如果w T (k) x k >0分类正确,则为第一个表达式,如果w T (k) x k ≤0错误分类则为第二个表达式。

在全部模式训练完一轮之后只要还有模式分类错误,则需要进行第二轮迭代,再用全部训练模式训练一次,建立新的权矢量。

如果对训练模式还有错分,则进行第三轮迭代依此类推,直至对所有驯良模式均能正确分类为止,此时的w 即为所求的权矢量。

BP (Back Propagation)神经网络是一种神经网络学习算法。

其由输入层、隐层、输出层组成的阶层型神经网络,隐层可扩展为多层。

相邻层之间各神经元进行全连接,而每层各神经元之间无连接,网络按有教师示教的方式进行学习,当一对学习模式提供给网络后,各神经元获得网络的输入响应产生连接权值(Weight )。

然后按减小希望输出与实际输出误差的方向,从输出层经各中间层逐层修正各连接权,回到输入层。

此过程反复交替进行,直至网络的全局误差趋向给定的极小值,即完成学习的过程。

算法描述: 输入层:单元i 的输入:ix ;单元数量:d ; 单元i 的输出:ix ;单元i 的激活函数:线性函数; 隐层: 单元j 的输入:netj ; 单元数量:nH ;01j dt j ji i j i net x xωωω==+=∑ 010(,,....,),1t d x x x x x ==01(,,....,)t j j j jd ωωωω=单元j 的输出:()j j y f net =;单元j 的激活函数:非线性函数; 输出层:单元k 的输入:k net ;单元数量:c ;01Hn t k kj j k k j net y yωωω==+=∑010(,,....,),1H t n y y y y y ==01(,,....,)Ht k k k kn ωωωω=单元k 的输出:()kk zf net =单元k 的激活函数:非线性函数两层神经网络图如下:分析:(1)给定隐层单元及输出层单元的激活函数,一个神经网络就可以实现一个对输入特征向量x 的非线性映射。

因此,神经网络本质上是一个非线性函数。

(2)给定隐层单元及输出层单元的激活函数,该非线性函数所对应的映射关系完全由权系数决定。

不同的权系数对应不同的非线性映射。

(3)神经网络学习的目的,就是根据已知的训练样本,确定神经网络的权系数。

这一过程称为训练过程。

在训练过程结束后,对于新样本x ,根据神经网络的输出进行判决。

(4)对于C 类分类问题,神经网络的输出为(),1,...,kzx k c =。

神经网络的判决规则为:如果()(),1,...,,k lz x z x l c l k ≥=≠,则判x 属于wk 。

(5)令()(),1,...,k k g x z x k c ==,可以看出神经网络实际上实现了C 个非线性的鉴别函数,并根据鉴别函数的取值进行分类。

(6)神经网络的训练目标:调整权系数w ,即所有的wkj 及wij ,使得对于训练集中的每一个训练样本(x,t),网络的输出尽可能满足:11()()......()c c z x t z x tz x t ⎛⎫⎛⎫ ⎪ ⎪=== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭(7)优化准则:对于样本集D ,使下述误差函数取得最小值: ()()x x DJ J ωω∈=∑()211()()2c x k k k J t z x ω==-∑权系数的调整:kj kj kjJ ωωηω∂←-∂()'()k j k k k k kjJy t z f net δδω∂==--∂,1()cji ji j i j j k kjk ji ji J Jx f net ωωηδδδωωω=∂∂'←-==∂∂∑,, BP 算法描述:对于给定的样本集D={(x,t)},初始化网络结构d*nH*c 。

初始化权系数w ,学习效率η、阈值θ。

随机从D 中取出一个样本(x,t),根据该样本更新权系数w :kj kj kjJ ωωηω∂←-∂ji ji jiJ ωωηω∂←-∂计算()()pre J J J ωω∆=-,如果J θ∆<结束训练,并认为此时的w 为最优。

否则转第2步继续进行循环。

三.实验内容 1. 感知器算法实验本实验利用感知器算法的原理,随机抽取两类的部分数据,然后,用这两类的其他数据来验证分类是否正确。

这里是利用感知器两两分类的原理。

实验可得结果如下表。

其中r1是输入x1所得的分类正确率,r2是输入x2所得的分类正确率,r3是输入x3所得的分类正确率。

当训练样本数m 取20时,x1和x2数据分类正确率都是100%,x1和x3数据分类正确率是100%,而x2和x3的分类正确率分别为86% 和93%。

当训练样本数m 取30时,x1和x2数据分类正确率都是100%,x1和x3数据分类正确率是100%,而x2和x3的分类正确率分别为92% 和88%。

由实验结果可以看出,x1和x2、x1和x3之间是线性可分的,而x2和x3则达到了与预设的迭代次数的上限,且分类效果不明显。

说明感知器算法对于现行可分的数据有比较好的性能与速度,但对于线性不可分的数据则效果较差。

2.BP 算法实验(1)异或问题实验利用前向两层神经网络来完成异或分类,输入的样本为x1=[0 1 -1],x2=[1 0 -1],x3=[0 0 -1],x4=[1 1 -1]将这四个样本分成两类。

其中,x1和x2是属于w1类,x3和x4属于w2类。

第一层(输入层)采用三个神经元,两个输入神经元和一个恒等于1的神经元,第二层(输出层)设置一个神经元,第二层输出的值若小于0.5就表示为w1类,大于0.5就表示w2类。

这里采用负梯度法调整参数。

在本实验中,我们记录训练次数和做不同次实验的分类正确率。

取实验次数为1,训练次数为3686,分类正确率为100%;取实验次数为25,最后一次训练次数为2970,分类正确率100%;取实验次数为50,最后一次训练次数2942,分类正确率100%。

由实验可以看出,分别做1次、25次和50次实验,所得到的分类正确率都是100%,所以说利用前向两层神经网络来完成异或分类问题可以得到很好的分类效果。

(2)BP算法实验采用前向两层神经网络来实现x1、x2和x3两两之间的分类。

分别选取不同个数(m)的样本进行训练,得到相应的权系数,然后再将全部数据代入进行分类,记录训练次数和分类正确率。

可得如下结果:x1和x2之间分别选取训练样本数为5和45时的分类效果:x1和x3之间分别选取训练样本数为5和45时的分类效果:x2和x3之间分别选取训练样本数为5和45时的分类效果:下面是分别进行不同多次实验所得的正确率的统计结果:分析实验结果可以得出:无论从一次实验所得结果还是从做多次实验所得的统计结果上来看,利用前向二层神经网络实现x1、x2和x3两两之间的分类,对于x1和x2之间、x1和x3之间的分类效果是比较明显的,可以很好的将两类分开。

而对于x2和x3之间却很难用此种办法达到很好的分类效果。

四. 实验小结本次实验主要是进行线性可分类问题的实验,实验中分别运用感知器算法和BP算法进行x1、x2和x3两两之间的分类,结果得出,只有x1和x2之间及x1和x3之间是线性可分的,而x2和x3之间是无法用这两种办法分开的。

本次实验中,在运用BP算法进行x1、x2和x3之间的分类之前,还进行了异或问题的实验,实验中采用两层前向神经网络达到了很好的分类效果,为进行后面的实验打好了基础。

通过本次实验,使我对感知器算法和BP算法有了更加深入的认识,以前在神经网络这门课程中所学的理论问题,在本次实验中通过具体动手进行编程,使得对当时所学知识有了更加深入的认识。

在实验中也遇到了各种各样的问题,通过思考解决后,对我以后的学习很有帮助。

五. 代码1.感知器算法clear all;close all;clc;k=load('iris.txt'); k1=zeros(50,4); k2=zeros(50,4); k3=zeros(50,4); for i=1:1:50k1(i,:)=k(i,:);k2(i,:)=k(i+50,:);k3(i,:)=k(i+100,:); endm=input('训练样本数m='); T1=zeros(m,4);T2=zeros(m,4);T3=zeros(m,4);index=randperm(50);for i=1:1:mT1(i,:)=k1(index(i),:);T2(i,:)=k2(index(i),:);T3(i,:)=k3(index(i),:);endW=[0.1,0.1,0.1,0.1];count=0;k=0.02;cc=0;while(count<m&&cc<100)i=1;count=0;while(i<=m)if(W*T1(i,:)'<0)W=W+k*T1(i,:);count=0;endif(W*T2(i,:)'>0)W=W-k*T2(i,:);count=0;endif((W*T1(i,:)'>0)&&(W*T2(i,:)'<0))count=count+1;endi=i+1;endcc=cc+1;endcck=[k1;k2];for i=1:1:100if(W*k(i,:)'>0)if(0<i&&i<51) fprintf('第%d个数据被分为第一类,分类正确\n',i);else fprintf('第%d个数据被分为第一类,分类错误\n',i);endendif(W*k(i,:)'<0)if(50<i&&i<101) fprintf('第%d个数据被分为第二类,分类正确\n',i);else fprintf('第%d个数据被分为第二类,分类错误\n',i);endendend2.BP算法解决异或问题clear all;close all;clc;p=0;x1=[0 0 -1;1 1 -1];x2=[0 1 -1;1 0 -1];r11=0;r22=0;while p<25a=0.5;pf=1;w1=rand(3,2);w2=rand(3,1);k=1;while pf>0.001if mod(k,4)==1g1=x1(1,:);d=0.1;endif mod(k,4)==2g1=x2(1,:);d=0.9;endif mod(k,4)==3g1=x1(2,:);d=0.1;endif mod(k,4)==0g1=x2(2,:);d=0.9;endg2=g1*w1;o1=1./(1+exp(-g2));o1_y=[o1 -1];g3=o1_y*w2;o2=1./(1+exp(-g3));% 输出层的权系数调整det2=a*2*(d-o2)*o2*(1-o2)*o1_y; w2=w2+det2';s=2*(d-o2)*o2*(1-o2);%第一层的权系数调整w22=w2';det1=a*g1'*(s*w22(:,1:2).*o1.*(1-o1));w1=w1+det1;err=d-o2;pf=err^2;k=k+1;endr1=0;for j=1:1:2t1=x1(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y2(j)=1./(1+exp(-I2));if y2(j)<0.5r1=r1+1;endendif r1==2r11=r11+1;endr2=0;for j=1:1:2t2=x2(j,:)*w1;y11=1./(1+exp(-t2));y11_y=[y11 -1];I21=y11_y*w2;y21(j)=1./(1+exp(-I21));if y21(j)>0.5r2=r2+1;endendif r2==2r22=r22+1;endp=p+1endlv=p/25;3.BP算法实现x1、x2和x3两两之间分类clear all;close all;clc; load('data.mat');m=input('训练样本数m='); %输入训练样本数T1=zeros(m,4);T2=zeros(m,4);T3=zeros(m,4);%随机抽取m个训练样本index=randperm(50);for i=1:1:m %得到随机的训练样本x1(i,:)=k1(index(i),:);x2(i,:)=k2(index(i),:);x3(i,:)=k3(index(i),:);endp=0;r11=0;r22=0;while p<50a=0.5;pf=1;w1=rand(4,5);w2=rand(6,1);k=1;tt=1;while pf>0.000001if k>mk=1;endif mod(k,2)==1g1=x2(k,:);d=0.1;endif mod(k,2)==0g1=x3(k,:);d=0.9;endg2=g1*w1;o1=1./(1+exp(-g2));o1_y=[o1 -1];g3=o1_y*w2;o2=1./(1+exp(-g3));% 输出层的权系数调整det2=a*2*(d-o2)*o2*(1-o2)*o1_y;w2=w2+det2';s=2*(d-o2)*o2*(1-o2);%第一层的权系数调整w22=w2';det1=a*g1'*(s*w22(:,1:5).*o1.*(1-o1)); w1=w1+det1;err=d-o2;pf=err^2;k=k+1;tt=tt+1; %训练次数endr1=0;r2=0;for j=1:1:50t1=k2(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y2(j)=1./(1+exp(-I2));if y2(j)<0.5r1=r1+1;endendlv1=r1/50if r1==50r11=r11+1;endfor j=1:1:50t1=k3(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y22(j)=1./(1+exp(-I2));if y22(j)>0.5r2=r2+1;endendlv2=r2/50if r2==50r22=r22+1;endp=p+1endr11/50r22/50plot([1:50],y2,'r');axis([0,50,0,1]);title(['m=',num2str(m)]);hold on plot([1:50],y22); grid onlv=(r11+r22)/100。

相关主题