matlab实现感知机算法

%首先一定要线性可分

%迭代只要分得开。迭代谁都可以,但最后的结果是迭代标签才分得开

%code如下

clear all

data=[3 3 1;

4 3 1;

1.5 0 1;

0.5 0.9 1;

2 1 1;

0.5 0.5 -1;

0 0 -1;

-2 -2 -1;

-3 0 -1;

1 3 1];

X=data(:,[1,2])

% X =

%

% 3.0000 3.0000

% 4.0000 3.0000

% 1.5000 0

% 0.5000 0.9000

% 2.0000 1.0000

% 0.5000 0.5000

% 0 0

% -2.0000 -2.0000

% -3.0000 0

% 1.0000 3.0000

y=data(:,3)

% y =

%

% 1

% 1

% 1

% 1

% 1

% -1

% -1

% -1

% -1

% 1

m=size(X,1); % m=样本点个数 10个

plotData2(X,y);%先在图上将样本画出来

axis([-4 4 -4 4]);

hold on

x1=-4:0.2:4 %x1坐标轴

W=[0;0]; b=0;

alph=0.5; %学习率

error=1;

%Y=[data(:,2),data(:,2)]

while error>0

error=0;

for i=1:m

if (((W'*X(i,:)'+b)*y(i))<=0)

error=error+1;

W=W+alph*y(i)*X(i,:)'

b=b+alph*y(i)

y1=-(W(1)*x1+b) %只是用来绘图的

%W(1)

%W(2)

%b

plot(x1,y1,'-b');

pause(0.5);

end

end

end

plot(x1,y1,'r','Linewidth',3);

function plotData2(X,y)

figure;hold on;

pos=find(y==1);

neg=find(y==-1);

plot(X(pos,1),X(pos,2),'+','Linewidth',2,'MarkerSize',9);

plot(X(neg,1),X(neg,2),'o','MarkerFaceColor','r','Linewidth',2,'MarkerSize',7);

hold off;

end