感知机是最简单的分类器,采用MATLAB实现感知器,采用comet动态画图,比较直观,对初学者有借鉴价值
clear;clc;close all
% define three points
x1 = [3, 3]';
x2 = [4, 3]';
x3 = [1, 1]';
x = [x1, x2, x3];
% x1 and x2 is positive example, x3 is negative example
y1 = 1;
y2 = 1;
y3 = -1;
y = [y1; y2; y3];
% we will get w and b
% variable stand for if classify is right
is_right_class = false;
% number of points
n = length(y);
t = 1;
w(:, t) = zeros(size(x,1), 1);
b(t) = 0;
% study rate
eta = 1;
%
figure
gscatter(x(1,:)', x(2,:)', (y == -1) + 1, 'br', 'xo', 15, 'off');
axis([-1 5 -1 5]);
pause(2);
hold on
p1 = 0;
p2 = 5;
q1 = - (w(1,t) * p1 + b(t))/(w(2,t) + eps);
q2 = - (w(1,t) * p2 + b(t))/(w(2,t) + eps);
comet([p1,p2], [q1, q2]);
while ~is_right_class
is_right_class = true;
for i = 1 : n
yi = sign(dot([x(:,i);1],[w(:, t);b(t)]));
if yi * y(i) <= 0
w(:, t + 1) = w(:, t) + eta * y(i) * x(:, i);
b(t + 1) = b(t) + eta * y(i);
t = t + 1;
pause(2);
q1 = - (w(1,t) * p1 + b(t))/(w(2,t) + eps);
q2 = - (w(1,t) * p2 + b(t))/(w(2,t) + eps);
comet([p1,p2], [q1, q2]);
is_right_class = false;
end
end
end