感知器准则算法实验

文章介绍了在模式识别课程中的一个感知器准则算法实验,重点在于对算法进行改进,以缩短收敛步数。实验使用MATLABR2022b编写代码,涉及数据预处理、训练样本规范化和权向量更新策略。最终展示了改进后的代码及绘制的样本分类图。
摘要由CSDN通过智能技术生成

感知器准则算法实验

模式识别课上的感知器准则算法实验,改进之后,收敛步数缩短。转载请注明出处。

实验内容

在这里插入图片描述
感知器准则算法实验

注意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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值