利用MATLAB实现感知器算法
% 感知器算法
clc;clear;close all;
[Number,X11,X12,X21,X22]=textread('data2.txt','%f%f%f%f%f');
%% 数据预处理
One_mat=ones(10,1);
Aug_W1=[X11 X12 One_mat];
Aug_W2=-1.*[X21 X22 One_mat];
%Aug_W1=[Aug_W1;10,20,1];% 样本修改
Aug_Mat=[Aug_W1;Aug_W2];
%% 迭代分类
W1=[10;8;2];
c=1;
num=1;
times=0;
while(num>0)
times=times+1;
num=0;
for i=1:size(Aug_Mat,1)
Temp=W1'*Aug_Mat(i,:)';
if Temp<=0
W1=W1+c*Aug_Mat(i,:)';
num=num+1;
end
end
disp(['迭代出现W*K<=0的次数= ',num2str(num)])
% 迭代长时间不收敛则退出
if times>100
break;
end
end
disp(['迭代次数= ',num2str(times)])
Final_W=W1;
disp(['判别函数为d(x)=',num2str(Final_W(1,1)),'x1',num2str(Final_W(2,1)),'x2+',num2str(Final_W(3,1))]);
% 画图
%'unit','normalized',unit测量单位,这些单位依据父容器进行归一化。
% 容器的左下角映射到 (0,0),右上角映射到 (1,1)。
figure('color','w','unit','normalized','Position',[0.1,0.1,0.8,0.8])
x01=linspace(-6,10,200);
y01=-Final_W(1,1)./Final_W(2,1)*x01-Final_W(3,1)./Final_W(2,1);
p1=plot(X11,X12,'r*','linewidth',2);hold on
p2=plot(X21,X22,'g*','linewidth',2);hold on
% p4=plot(10,20,'k*','linewidth',2);hold on
p3=plot(x01,y01,'b','linewidth',2);hold on
title('感知器算法分类结果')
legend([p1 p2 p3],'第一类','第二类','判别面','Location','southeast');
xlabel('X1');
ylabel('X2');
% 判断类别
mx1=[2;8];
mx2=[-0.6;7];
my1=Final_W(1:2,1)'*mx1+Final_W(3,1);
my2=Final_W(1:2,1)'*mx2+Final_W(3,1);
if my1>0
disp(['(',num2str(mx1(1)),',',num2str(mx1(2)),')','属于第二类'])
else
disp(['(',num2str(mx1(1)),',',num2str(mx1(2)),')','属于第一类'])
end
if my2>0
disp(['(',num2str(mx2(1)),',',num2str(mx2(2)),')','属于第二类'])
else
disp(['(',num2str(mx2(1)),',',num2str(mx2(2)),')','属于第一类'])
end
原始样本 C=1迭代次数= 6 判别函数为d(x)=9.1x1-7x2+12
原始样本 C=0.1 迭代次数= 17 判别函数为d(x)=4.76x1-3.67x2+4.1
增加样本(10,20) C=0.1 迭代次数>100 训练失败 判别函数为d(x)=4.72x1-2.41x2+2.9