感知机 MATLAB实现(数据+代码)
1.数据如图片所示:(命名为data.xlsx)
2.代码如下:
clear;clc;
%% 载入数据
data = xlsread('data.xlsx');
%% 绘制数据点
sample = data(:,1:2); % 每一行代表一个数据点
label = data(:,end);
draw(sample, label)
hold on
%% 初始化w,b,alpha
w = [-1,-2];
b = 2;
alpha = 1; % learning rate
%% 更新 w,b
while 1
[idx_misclass, counter] = class(sample, label, w, b);
if (counter~=0)
R = unidrnd(counter);
w = w + alpha * sample(idx_misclass(R),:) * label(idx_misclass(R));
b = b + alpha * label(idx_misclass(R));
else
break
end
end
%% 绘制线性分类器
x1 = 1:0.01:10;
x2 = (-b-w(1).*x1)./w(2);
plot(x1, x2)
function [idx_misclass, counter] = class(sample, label, w, b)
counter = 0;
idx_misclass = [];
for i=1:length(label)
if (label(i)*(w*sample(i,:)'+b)<=0)
idx_misclass = [idx_misclass i];
counter = counter + 1;
end
end
end
function draw(sample, label)
idx_pos = find(label==1);
idx_neg = find(label~=1);
plot(sample(idx_pos, 1), sample(idx_pos, 2),'ro')
hold on
plot(sample(idx_neg, 1), sample(idx_neg, 2),'b*')
axis([0 10 0 10])
grid on
end
3. 结果如下: