范文一:模式识别感知器算法matlab实现
给定样本如下:
ω=(x,x)={(1,0,1),(0,1,1)} 112
ω=(x,x)={(1,1,0),(0,1,0)} 234
使用matlab编制程序如下:
x1=[1,0,1];x2=[0,1,1];x3=[1,1,0];x4=[0,1,0];
%规格化
y1=[x1,1];y2=[x2,1];y3=[-x3,-1];y4=[-x4,-1];
%初始化给定一个广义权重矢量及步长 c=1;X=[1;1;1;1];i=1;j=0;
%循环迭代若连续四次计算均可判别则跳出 for(i=1:1000)
if(y1*X<=0)>=0)>
X=X+c*y1';
j=0;
else
j=j+1;
end
if(j==4)
break;
end
if(y2*X<=0)>=0)>
X=X+c*y2';
j=0;
else
j=j+1;
end
if(j==4)
break;
end
if(y3*X<>
X=X+c*y3';
j=0;
else
j=j+1;
end
if(j==4)
break;
end
if(y4*X<=0)>=0)>
X=X+c*y4';
j=0;
else
j=j+1;
end
if(j==4)
break;
end
end
%输出
Y=zeros(1,3);
Y(1)=X(1,1);Y(2)=X(2,1);Y(3)=X(3,1);
Y
X(4,1)
运行程序,结果如下:
Y = 0 -1 3
ans = 0
带回运算,知该判别函数可以分出两类。
实验三程序过于重复,改写程序体如下:
x1=[1,0,1];x2=[0,1,1];x3=[1,1,0];x4=[0,1,0];
y1=[x1,1];y2=[x2,1];y3=[-x3,-1];y4=[-x4,-1];
%将增光规范化的矩阵写成一个
y=[y1;y2;y3;y4];
c=1;X=[1;1;1;1];k=0;i=1;j=0;
%大循环控制运行迭代的步数
for(i=1:2000)
%内循环用于计算处理判断
for(j=1:4)
if(y(j,:)*X<=0)>=0)>
X=X+c*y(j,:)';
k=0;
else
k=k+1;
end
if(k==4)
break;
end
end
if(k==4)
break;
end
end
X'
运行程序,得出结果一致:
实验四:感知器算法在多类问题中的应用
给定的试验样本数据如下表所示:
表1:实验所用样本数据 使用matlab编制程序,程序体如下:
x1=[0.1;1.1;1];x2=[7.1;4.2;1];x3=[-3.0;-2.9;1];x4=[-2.0;-
8.4;1];
%规范化的增广矩阵
w=[0 0 0;0 0 0;0 0 0;0 0 0];
y=[x1,x2,x3,x4]; %正常数p,步数k
p=1;k=1;
%Wq存储中间矩阵
Wq=zeros(1,4);
%开始大循环,其中k作为标记
while k==1
k=0;%初始时置k为0
%此循环用于求取判别函数
for(i=1:4)
while Wq(i)<4>4>
if(w(i,:)*y(:,i)<=0)>=0)>
w(i,:)=w(i,:)+p*y(:,i)';
Wq(i)=0;
else
Wq(i)=Wq(i)+1;
continue;
end
end
end
%此循环用于判别调整增广权重矢量
for(i=1:4)
d=w(i,:)*y(:,i);
for(j=1:4)
if(i==j)
continue;
elseif(w(j,:)*y(:,i)
continue;
else
w(i,:)=w(i,:)+p*y(:,i)';
w(j,:)=w(j,:)-p*y(:,i)';
k=1;
end
end
end
%条件语句,判别是否有过增广权值矢量调整
if(k==1)
continue;
else
%若没有调整,则检验各判别函数对杨门能否正确分类
for(i=1:4)
if(w(i,:)*y(:,i)>0)
k=k+1;
else
k=1;
break;
end
end
end
end
%给出判别的样本增广矩阵以及求得的增广权值矢量矩阵
y
w
运行程序,输出为:
y =
0.1000 7.1000 -3.0000 -2.0000
1.1000 4.2000 -2.9000 -8.4000
1.0000 1.0000 1.0000 1.0000
w =
0.2000 2.2000 2.0000
7.0000 3.1000 0
-10.0000 -3.2000 3.0000
5.0000 -8.1000 -1.0000
编写验证程序,程序体如下:
x1=[0.1;1.1;1];x2=[7.1;4.2;1];x3=[-3.0;-2.9;1];x4=[
-2.0;-8.4;1];y=[x1,x2,x3,x4];
w=[0.2,2.2,2.0;7.0,3.1,0;-10.0,-3.2,3.0;5.0,-8.1,-1
.0];
%样本矩阵和求得的增广权值矢量矩阵
q=zeros(4,4);
%q矩阵用于存储各个权值矢量与样本的乘积
%循环存储
for(i=1:4)
for(j=1:4)
q(i,j)=w(j,:)*y(:,i);
end
end
%输出求得的乘积矩阵
q
运行结果如下:
q =
4.4400 4.1100 -1.5200 -9.4100
12.6600 62.7200 -81.4400 0.4800
-4.9800 -29.9900 42.2800 7.4900
-16.8800 -40.0400 49.8800 57.0400
根据感知器算法在多类问题算法的规则,样本与自身对应的增广权
矢量乘积大于样本与其他的增广权矢量的乘积:
即如果x?ω和d(x)> d(x) (任意j ? i),则: kiikjk
w(k+1)=w(k) (i=1,2,…c) ii
则q矩阵的对角线上的值应当为同行中的最大,观察q可见,满足条
件。
范文二:批处理感知器算法与固定增量感知器算法实现的MATLAB代码
function BatchPerceptron(w1, w2)
figure;
plot(w1(:,1),w1(:,2),'ro'); hold on;
grid on;
plot(w2(:,1),w2(:,2),'b+'); % 对所有训练样本求增广特征向量y
one = ones(10,1);
y1 = [one w1];
y2 = [one w2];
w12 = [y1; -y2]; % 增广样本规范化
y = zeros(size(w12,1),1); % 错分样本集y初始为零矩阵% 初始化参数 a = [0 0 0]; % [0 0 0]; Eta = 1;
time = 0; % 收敛步数while any(y<=0) fori="1:size(y,1)">=0)>
y(i) = a * w12(i,:)';
end;
a = a + sum(w12(find(y<=0),:));%修正向量a>=0),:));%修正向量a>
time = time + 1;%收敛步数
if (time >= 300)
break;
end
end;
if (time >= 300)
disp('目标函数在规定的最大迭代次数内无法收敛');
disp(['批处理感知器算法的解矢量a为: ',num2str(a)]); else
disp(['批处理感知器算法收敛时解矢量a为: ',num2str(a)]); disp(['批处理感知器算法收敛步数k为: ',num2str(time)]); end
%找到样本在坐标中的集中区域,以便于打印样本坐标图
xmin = min(min(w1(:,1)),min(w2(:,1))); xmax = max(max(w1(:,1)),max(w2(:,1))); xindex = xmin-1:(xmax-xmin)/100:xmax+1; yindex = -a(2)*xindex/a(3)-a(1)/a(3); plot(xindex,yindex);
title('批处理感知器算法实现两类数据的分类');
范文三:单输出感知器学习算法实现修改
今天看了一些文章,发现前面我对整个神经网络学习算法都存在误解.所以更正了一下.现在好了.这个实现方法应该是正确的了.
#include #include #include int ji(int x[10],int w[10],int k) { int i,net=0; for(i=0;i<> net=net+x[i]*w[i]; return net; } int F(int net) { if (net>12) return 1; else return 0; } void jia(int x[],int w[],int k) { int i=0; for (i=0;i<> w[i]=w[i]+x[i]; } void jian(int x[],int w[],int k) { int i=0; for(i=0;i<> w[i]=w[i]-x[i]; } int suiji() { float i,j; float s; i=(float)RAND_MAX; j=(float)rand(); s=j/i; if(s>0.5) return 1; else return 0; } void init(int w[],int k) { int i; srand((int)time(0)); for(i=0;i<> { w[i]=suiji(); } for(i=0;i<> printf("%d ",w[i]); printf("/n"); } void main() { int x[10]={1,0,0,0,0,1,1,0,1,0}; int temp=1; int w[10]; int o; init(w,10); o=F(ji(x,w,10)); while (o!=temp) { printf("%d/n",o); jia(x,w,10); o=F(ji(x,w,10)); } printf("%d/n",o); } 下一步实现BP算法,把这个任务完成以后,我的任务也差不多完成一半了. 感知器算法练习 产生两个具有 200个二维的数据集, 均值分别为 (5,1), (-5,1), 方差均为 I . 设 计使用感知器算法的线性分类器 , 使用 2个不同的初始化向量,步长参数设为 1. 解:初始化向量为 W 1=[1 1 1]’时 function Perceptron2 %UNTITLED Summary of this function goes here % Detailed explanation goes here X1=normrnd(5,1,[1 200]); Y1=normrnd(1,1,[1 200]); X2=normrnd(-5,1,[1 200]); Y2=normrnd(1,1,[1 200]); O=ones(1,200); X=[X1 -X2;Y1 -Y2;O -O]; W1=[1 1 1]'; t=0; s=1; while s>0 s=0; for i=1:400 if W1'*X(:,i)<> W1=W1+X(:,i); s=s+1; else W1=W1+0; s=s+0; end end t=t+1; end fprintf('μü′ú′?êy?a\n',t) fprintf('?a?òá??a\nW=') disp(W1) end >> Perceptron2 迭代次数为 解向量为 W= 4.3106 -1.4254 >> X1=normrnd(5,1,[1 200]); Y1=normrnd(1,1,[1 200]); X2=normrnd(-5,1,[1 200]); Y2=normrnd(1,1,[1 200]); >> x=X1;y=Y1; >> plot(x,y,'*') >> hold on x=X2;y=Y2; >> plot(x,y,'o') >> hold on >> ezplot('4.3106*x-1.4254*y') 初始化向量为 W1=[0 0 0]’时 >> Perceptron2 迭代次数为 解向量为 W= 5.9840 2.1754 1.0000 感知器算法 & BP算法实验 硕633 3106036072 赵杜娟 一. 实验目的 1. 理解线性分类器的分类原理。 2. 掌握感知器算法,利用它对输入的数据进行分类。 3. 理解BP 算法,使用BP 算法对输入数据进行分类。 二. 实验原理 1. 感知器算法 感知器算法是通过训练模式的迭代和学习算法,产生线性可分的模式判别函数。感知器算法就是通过对训练模式样本集的“学习”得出判别函数的系数解。在本次实验中, 我们主要是采用硬限幅函数进行分类。 感知器的训练算法如下: 设输入矢量X =?x x ...... x ? , 加权矢量W =?w w ...... w ?, 则神经元 ?1, 2, ??1, 2, ?N ?N ??? 的输出可通过下式来计算 (1) 这里对于训练结束我们判断的依据是实际输出值与理想预期值之间误差的均方值最小。定义ε(k )=d (k )-y (k ), 它的均方值记作E [ε 2 (k )], 令ξ(k )=E [ε2(k )], 则可以推出 ξ(k )=E ?d 2(k )?-WE ?X T X ?W T -2E [d (k )X ]W T (2) ???????? 可证存在最佳的加权矢量W *,使ξ(k )达到最小。解得 -1*T ?? W =E [d (k )X ]E X X ???? (3) 式(3)给出了求最佳加权矢量的方法,但是需要做大量的统计计算,并且需要解决高阶矩阵求逆的问题,这些都是非常困难的。于是我们给出一种递推求解的方法: 在给定初始权值后,以这种方法可以得到递推公式: W (k +1) =W (k ) +2αE ε(k )X (k ) (4) 用这种方法虽然可以保证求得严格的最佳解,且避开了矩阵求逆的困难,但学习过程中的每一步仍需完成大量的统计计算。 2.BP 算法 由于硬限幅函数是非可微函数, 不能实现多层神经网络的一种有效的LMS 学习算法。而BP 算法中所用到的是Sigmoid 型函数,它既具有完成分类所需的非线性特性,又具有实现LMS 算法所需的可微特性。采用S 型函数的神经元的输入和输出之间的关系为: [] f s (u ) = 1 1+e -u (5) 采用了S 型函数就可将用于单神经元的LMS 学习算法适当推广,得到一种适用于前向多层神经网络的有效学习算法。 我们现在研究一个采用S 型函数的前向三层神经网络来说明其原理。 对于训练样本p, 它的输入是N 维矢量X ,X=[x p 0, x p 1, x p , N -1],网络的第一,二,三层分别包括J ,K ,M 个神经元,它的总输出是一个M 维矢量,Y=[y p 0, y p 1, y p , M -1],第i 层到第i+1层之间的权重系数用w nj (i +1) 来表示。可设前向三层神经网络输出各个分量的理想 (3) 值是d pi ,i=0,1,??M-1,而这些分量的实际值是y pi =o pi , i=0,1,??M-1,理想值和实际值之间的误差是 εpi =(d pi -y pi ) 。各输出误差的平方和可以表示为: E p =∑εpi i =0 M -1 2 (6) 现在我们希望改变网络中的各个加权系数w ij ,使得E p 尽可能的减小。为此我们可以采取最陡下降算法的公式来调整权重系数?p w ij 。公式如下: ?p w (l ) ij (l ) (l ) =-a ? ?E p (l ) ?w ij , 式中的a 是学习的步幅,它应随学习过程而变化。 对于通用神经层,它的各个输出o pL 与各个输入o pL 之间的关系可以表示为: o (l ) pi (l ) (l -1) =f s (I ), I l pi (l ) pi (l ) (l -1) =∑w ij O pj -θi (l ) j =0 L -1 如果设o (l -1) pL =1, -θ (l ) i =w (l ) iL ,则 I (l ) pi (l ) (l -1) =∑w ij O pj j =0 L 式中的f []?表示s 型函数。我们不难看出上式即为给输入加一个恒等于1的部分,在神经网络中也应相应的加一个节点,而且这个节点的权系数就是这一层网络的阈值。经推倒可得权系数调整的递推公式如下: (l ) (l ) (l ) (7) w ij (k +1) =w ij (k ) +?p w ij (l ) l ) l ) l ) l ) 对输出层:?p w ij =α 2(d pi -o (pi ) o (pi (1-o (pi ) o (pj ?Q -1(l +1) (l +1) ?(l ) (l ) l -1) 对隐含层:?p w =α o (pj ?∑δpk w ki ?o pi (1-o pi ) k =0?? (l ) ij (l ) δpi 现对于三层神经网络有 (3) (3) 2) ?p w ij =α*δpi *o (pj l=3时(输出层) (2) (2) 1) ?p w ij =α*δpi *o (pj (3) 3) 3) 3) δpi =2*(d pi -o (pi ) *o (pi *(1-o (pi ) l=2时(隐含层) δ (2) pi ?M -1(3) (3) ?(2) 2) =?∑δpk w ki ?*o pi *(1-o (pi ) ?k =0? l=1时(第一层) ?w (3) (1) ij ?K -1(2) (2) ?(1) 1) 0) =α*?∑δpk w ki ?*o pi *(1-o (pi ) *o (pj ?k =0? 其中: o pi =y pi 0) o (pi =x pi 可见,这一算法的计算过程是先计算第三层(即输出层)的各项“误差分量”δpi ,然 后用δpi 计算第二层(隐含层)的“等效误差分量” δpi ,最后再用δpi 计算第一层(隐含层)的“等效误差分量” δpi 。只要算出这些误差分量,系数调整量即可立即求得。所 (1) (3) (2) (2) (3) 以,这是一种由输出层向输入层逐步反推的学习算法,故称之为“逆推”学习算法,或BP 算法。 三.实验内容 1. 感知器算法实验 本实验利用感知器算法的原理,随机抽取两类的部分数据,然后,用这两类的其他数据来验证分类是否正确。这里是利用感知器两两分类的原理。实验可得结果如下表。其中r1是输入x1所得的分类正确率,r2是输入x2所得的分类正确率,r3是输入x3所得的分类正确率。 运行程序进行实验,分别可得下图。 下面两个图是x1和x2在训练样本选取5和45时所得的分类效果。 下面两个图是x1和x3在训练样本选取5和45时所得的分类效果。 下面两个图是x2和x3在训练样本选取5和45时所得的分类效果。 由实验可以得到,x1和x2、x1和x3之间是线性可分的,其分类正确率基本上可以达到95%以上。而x2和x3之间则是无法分开的,分类效果不明显。而且迭代次数也是基本随着所选训练样本数的增加而增加,但无论怎样,对于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类。这里采用惯性系数调整算法。训练指数选为a =0.5。在本实验中,我们记录训练次数和做不同次实验的分类正确率。经过实验可以得到如下表格: 由实验可以看出,分别做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; 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 %得到随机的训练样本 T1(i,:)=k1(index(i),:); T2(i,:)=k2(index(i),:); T3(i,:)=k3(index(i),:); end W0=zeros(1,4); u=0.02; e=0.01; s=1; k=0; W=W0; while (s>=e) for i=1:1:m k=k+1; if rem(k,2)==1 err=1-W*T2(i,:)'; W=W+u*err*T2(i,:); else err=0-W*T3(i,:)'; W=W+u*err*T3(i,:); end pf(k)=err^2; s=pf(k); end end r1=0;r2=0; for i=1:1:50 y1(i)=W*k2(i,:)'; if y1(i)>0.5 r1=r1+1; end y2(i)=W*k3(i,:)'; if y2(i)<=0.5 r2="r2+1;" end="">=0.5> plot([1:50],y1,'r'); axis([0,50,-0.5,1.5]); title(['m=',num2str(m)]); hold on plot([1:50],y2); grid on r1=r1/50 r2=r2/50 2.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<25 a="0.5;" pf="">25> w1=rand(3,2); w2=rand(3,1); k=1; while pf>0.001 if mod(k,4)==1 g1=x1(1,:); d=0.1; end if mod(k,4)==2 g1=x2(1,:); d=0.9; end if mod(k,4)==3 g1=x1(2,:); d=0.1; end if mod(k,4)==0 g1=x2(2,:); d=0.9; end g2=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; end r1=0; for j=1:1:2 t1=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.5 r1="r1+1;" end="" end="" if="" r1="">0.5> r11=r11+1; end r2=0; for j=1:1:2 t2=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.5 r2=r2+1; end end if r2==2 r22=r22+1; end p=p+1 end lv=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),:); end p=0;r11=0;r22=0; while p<50 a="0.5;" pf="">50> w1=rand(4,5); w2=rand(6,1); k=1;tt=1; while pf>0.000001 if k>m k=1; end if mod(k,2)==1 g1=x2(k,:); d=0.1; end if mod(k,2)==0 g1=x3(k,:); d=0.9; end g2=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; %训练次数 end r1=0;r2=0; for j=1:1:50 t1=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.5 r1="r1+1;" end="">0.5> lv1=r1/50 if r1==50 r11=r11+1; end for j=1:1:50 t1=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.5 r2=r2+1; end end lv2=r2/50 if r2==50 r22=r22+1; end p=p+1 end r11/50 r22/50 plot([1:50],y2,'r'); axis([0,50,0,1]); title(['m=',num2str(m)]); hold on plot([1:50],y22); grid on lv=(r11+r22)/100 11 转载请注明出处范文大全网 » 模式识别感知器算法matla范文四:感知器算法练习
范文五:感知器算法实验