感知器准则算法实验
模式识别课上的感知器准则算法实验,改进之后,收敛步数缩短。转载请注明出处。
实验内容
注意W1、W3不能线性分类
实验的源代码
clear;
% get data
T = [ 0.100 6.800 -3.500 2.000 4.100 3.100 -0.800 0.900 5.000 3.900 ;
1.100 7.100 -4.100 2.700 2.800 5.000 -1.300 1.200 6.400 4.000 ;
7.100 -1.400 4.500 6.300 4.200 1.400 2.400 2.500 8.400 4.100 ;
4.200 -4.300 0.000 1.600 1.900 -3.200 -4.000 -6.100 3.700 -2.200 ;
-3.000 0.500 2.900 -0.100 -4.000 -1.300 -3.400 -4.100 -5.100 1.900 ;
-2.900 8.700 2.100 5.200 2.200 3.700 6.200 3.400 1.600 5.100 ];
W1 = T(1:2,:);
W2 = T(3:4,:);
W3 = T(5:6,:);
% 训练样本规范化增广,添加第一行全为1
%size函数 1:取行数 2:取列数
ww1 = [ones(1,size(W1,2));W1]; % 3X10
ww2 = [ones(1,size(W2,2));W2];
ww3 = [ones(1,size(W3,2));W3];
% 训练W1、W2
w12 = [ww1,-ww2]; % 3X20
a = [0;0;0]; % 3X1
y = zeros(1,size(w12,2)); % 1X20
k=0;
while any(y<=0)
for i=1:size(y,2)
y(i) = a'*w12(:,i);
end
a = a + (sum((w12(:,find(y<=0)))'))'; % 修正a
k = k + 1;
if k>10000
break;
end
end
disp('权向量 a = ');
disp(a);
disp('收敛步数 k = ');
disp(k);
% 绘图
subplot(1,2,1);
plot(W1(1,:),W1(2,:),'r.');
hold on;
plot(W2(1,:),W2(2,:),'b*');
% 找到样本的集中区域,以便于打印坐标图
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);
我改进之后的代码(MATLAB R2022b)
clear;
% get data
T = [ 0.100 6.800 -3.500 2.000 4.100 3.100 -0.800 0.900 5.000 3.900 ;
1.100 7.100 -4.100 2.700 2.800 5.000 -1.300 1.200 6.400 4.000 ;
7.100 -1.400 4.500 6.300 4.200 1.400 2.400 2.500 8.400 4.100 ;
4.200 -4.300 0.000 1.600 1.900 -3.200 -4.000 -6.100 3.700 -2.200 ;
-3.000 0.500 2.900 -0.100 -4.000 -1.300 -3.400 -4.100 -5.100 1.900 ;
-2.900 8.700 2.100 5.200 2.200 3.700 6.200 3.400 1.600 5.100 ];
W1 = T(1:2,:);
W2 = T(3:4,:);
W3 = T(5:6,:);
% 训练样本规范化增广,添加第一行全为1
%size函数 1:取行数 2:取列数
ww1 = [ones(1,size(W1,2));W1]; % 3X10
ww2 = [ones(1,size(W2,2));W2];
ww3 = [ones(1,size(W3,2));W3];
% 训练W1、W2
w12 = [ww1,-ww2]; % 3X20
a = [0;0;0]; % 3X1
y = zeros(1,size(w12,2)); % 1X20
% 校正量
p = 1;
% 循环轮数
k=0;
e = zeros(1,size(w12,2)); % 1X20
while sum(e) ~= 20 % y中20个元素都是>0的时候,结束循环
for i = 1:size(y,2)
y(i) = (a')*w12(:,i);
if y(i)<=0
a = a + p*w12(:,i);
end
end
k = k+1;
if k>10000
break;
end
e = y>0; % e表示y中有哪几个元素是>0的
end
disp('权向量 a = ');
disp(a);
disp('收敛步数 k = ');
disp(k);
% 绘图
subplot(1,2,1);
plot(W1(1,:),W1(2,:),'r.');
hold on;
plot(W2(1,:),W2(2,:),'b*');
% 找到样本的集中区域,以便于打印坐标图
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(1)*xindex/a(2)-a(3)/a(2);
if a(3) == 0
xline(-a(1)/a(2)); % 垂直于x轴
elseif a(2) == 0
yline(-a(1)/a(3)); % 垂直于y轴
else
yindex = -a(2)*xindex/a(3)-a(1)/a(3);
plot(xindex,yindex);
end