目的
1. 用感知器实现2分类
2. 并画出决策面
3. 画出不同weight初始值下的决策面、打乱样本顺序的决策面
结构
- train.m 主文件
- grad.m计算梯度并更新w、b
train.m
clear;
%load data
data = load('toydata.mat');
X = data.X';
y = data.label';
m = length(y);
lr = 1;
%打乱样本顺序
rowrank = randperm(size(X, 1));
X=X(rowrank',:);
y=y(rowrank',:);
%权重初始化
theta=rand(3,1);
%w = [0;0];
%b = 0;
w = theta(1:2);
b = theta(3);
h = Perceptron(X, w, b, m);
%train
for k = 1:m
[w,b]= grad(X, y, lr, w, b);
h = Perceptron(X, w, b, m);
end
%plot data
pos = find(y==1); neg = find(y ==-1);
hold on;
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);
%plot decision boundary
plot_x = [min(X(:,1))-1 , max(X(:,1))+1];
plot_y = (-1./w(2)).*(w(1).*plot_x+b);
plot(plot_x, plot_y);
legend('y==1', 'y==-1');
grad.m
%grad_update
function [w,b] =grad(X, y, lr, w, b)
m = length(y);
for k = 1:m
temp = (X(k,:)*w+b)*y(k);
while temp<=0
w = w + lr*(X(k,:)*y(k) )';
b = b + lr*y(k);
temp = (X(k,:)*w+b)*y(k);
end
end
end
结果
(1)w,b初始值为0:
(2)W,b的值为随机初始化的10个:
(3)打乱样本顺序10次:
(4)以不同w和b的10次结果为基础计算:
w平均值为:-1.9352 -2.7876
b平均值为:16.0083
(5)以样本打乱基础计算
w的平均值-3.2140 -2.5044
b的 20.3000
总结
关于感知器算法,是一个很依赖训练样本的算法。具体实现方式为,设 f =wx+b ,label为y,当每一个样本 f(i)*y(i)<=0时,就更新w和b,更新值为 w = w + lr*x(i)*y(i) ; b = b + lr*y(i);直到所有样本都满足 f(i)*y(i)>0时停止。
所以感知器算法结果不唯一,但算法收敛。
当有离群点时,会影响感知器算法的好坏。如下图中加入离群点后出现决策失误的超平面。
关于核感知器的一些参考: