clear
%产生第一类和第二类原始数据,分别赋值给w1和w2变量
w1=[0.1 6.8 -3.5 2.0 4.1 3.1 -0.8 0.9 5.0 3.9;
1.1 7.1 -4.1 2.7 2.8 5.0 -1.3 1.2 6.4 4.0];
w2=[-3.0 0.5 2.9 -0.1 -4.0 -1.3 -3.4 -4.1 -5.1 1.9;
-2.9 8.7 8 5.2 2.2 3.7 6.2 3.4 1.6 5.1];
%分别产生第一类和第二类增广样本向量集ww1、ww2
ww1=[ones(1,size(w1,2));w1];
ww2=[ones(1,size(w2,2));w2];
%产生第一类和第二类样本向量的规范化增广样本向量集w12
w12=[ww1,-ww2];
y=zeros(1,size(w12,2)); % 产生1x20的行向量,赋给y,初值全为0
a=[1;1;1]; %给权向量a赋初值
k=0; %k为迭代次数,a(0)=[1;1;1]
while any(y<=0)
for i=1:size(y,2)
y(i)=a'*w12(:,i);
end
a=a+(sum((w12(:,find(y<=0)))'))';
k=k+1;
end
a %显示最终求得的权向量a的值
k %迭代次数值
figure(1)
plot(w1(1,:),w1(2,:),'r+')
hold on
plot(w2(1,:),w2(2,:),'*')
xmin=min(min(w1(1,:)),min(w2(1,:)));
xmax=max(max(w1(1,:)),max(w2(1,:)));
ymin=min(min(w1(2,:)),min(w2(2,:)));
ymax=max(max(w1(2,:)),max(w2(2,:)));
xindex=xmin-1:(xmax-xmin)/100:xmax+1;
yindex=-a(2)*xindex/a(3)-a(1)/a(3);
plot(xindex,yindex)
我自己模仿写的:
%%测试函数点
clc
clear all
x1=-1:0.1:1;
y1=x1+2;
w1=[x1;y1];
x2=-1.5:0.1:0.5
y2=x2;
w2=[x2;y2];
figure(1)
plot(x1,y1,'r+')
hold on
plot(x2,y2,'g*')
ww1=[ones(1,size(w1,2));w1];
ww2=[ones(1,size(w2,2));w2];
w12=[ww1,-ww2];
a=[1;1;1];
y=zeros(1,size(w12,2));
k=1;
while any(y<=0)
for i=1:size(w12,2)
y(i)=a'*w12(:,i);
end
temp=sum((w12(:,find(y<=0)))')';
a=a+temp;
k=k+1;
end
a
k
xmin=min(min(x1),min(x2));
xmax=max(max(x1),max(x2));
ymin=min(min(y1),min(y2));
ymax=max(max(y2),max(y2));
xindex=xmin-1:(xmax-xmin)/100:xmax+1;
yindex=-a(2)/a(3)*xindex-a(1)/a(3);
hold on
plot(xindex,yindex)
心得体会:感知器准则函数只能用来线性分类,而且最有找到判决边界一般在边界面上,具体原理还是比较好理解的。
三类情况:
clear
%original data
%产生第一类、第二类和第三类原始数据,分别赋给w1、w2 和w3 变量
w1=[0.1 0.8 -3.5 2.0 4.1 3.1 -0.8 2 5.0 3.9; 1.1 7.1 -4.1 2.7 2.8 5.0 -1.3 1.2 6.4 4.0];
w2=[7.1 -1.4 4.5 6.3 4.2 1.4 2.4 2.5 8.4 4.1;4.2 -4.3 0.0 1.6 1.9 -3.2 -4.0 -6.1 3.7 -2.2];
w3=[-3.0 5 2.9 -0.1 -4.0 -1.3 -3.4 -4.1 -5.1 1.9;-2.9 8.7 2.1 5.2 2.2 3.7 6.2 3.4 1.6 5.1];
figure(1)
plot(w1(1,:),w1(2,:),'r.')
hold on
plot(w2(1,:),w2(2,:),'*')
%normalized
%分别产生第一类、第二类和第三类增广样本向量集ww1、ww2 和ww3
ww1=[ones(1,size(w1,2)); w1];
ww2=[ones(1,size(w2,2)); w2];
ww3=[ones(1,size(w3,2)); w3];
%产生第一类和第二类样本向量的规范化增广样本向量集w12
w12=[ww1,-ww2];
%%w13=[ww1,-ww3];
%%w23=[ww2,-ww3];
y=zeros(1,size(w12,2)); %产生1x20 的行向量,赋给y,初值全为0
v=[1;1;1]; %给权向量v 赋初值
k=0; %k 为迭代次数,v(0)= [1;1;1]
while any(y<=0)
for i=1:size(y,2)
y(i)=v'*w12(:,i);
end
v=v+(sum((w12(:,find(y<=0)))'))';
k=k+1;
end
v %显示最终求得的权向量v 的值
k %迭代次数值
figure(1)
plot(w1(1,:),w1(2,:),'r.')
hold on
plot(w2(1,:),w2(2,:),'*')
xmin=min(min(w1(1,:)),min(w2(1,:)));
xmax=max(max(w1(1,:)),max(w2(1,:)));
ymin=min(min(w1(2,:)),min(w2(2,:)));
ymax=max(max(w1(2,:)),max(w2(2,:)));
xindex=xmin-1:(xmax-xmin)/100:xmax+1;
yindex=-v(2)*xindex/v(3)-v(1)/v(3);
plot(xindex,yindex)
%写出实现批处理感知器算法的程序,从v=0 开始,将程序应用在ω2 和ω3 类上,同样记下收敛的步数。
w23=[ww2,-ww3];
yy=zeros(1,size(w23,2)); %产生1x20 的行向量,赋给y,初值全为0
vv=[1;1;1]; %给权向量v 赋初值
kk=0; %k 为迭代次数,v(0)= [1;1;1]
while any(yy<=0)
for i=1:size(yy,2)
yy(i)=vv'*w23(:,i);
end
vv=vv+(sum((w23(:,find(yy<=0)))'))';
kk=kk+1;
end
vv %显示最终求得的权向量v 的值
kk %迭代次数值
figure(2)
plot(w2(1,:),w2(2,:),'r.')
hold on
plot(w3(1,:),w3(2,:),'*')
xxmin=min(min(w2(1,:)),min(w3(1,:)));
xxmax=max(max(w2(1,:)),max(w3(1,:)));
yymin=min(min(w2(2,:)),min(w3(2,:)));
yymax=max(max(w2(2,:)),max(w3(2,:)));
xxindex=xmin-1:(xxmax-xxmin)/100:xxmax+1;
yyindex=-vv(2)*xxindex/vv(3)-vv(1)/vv(3);
plot(xxindex,yyindex)