Matlab感知器算法实现(代码、结果)

目的

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时停止。

所以感知器算法结果不唯一,但算法收敛。

当有离群点时,会影响感知器算法的好坏。如下图中加入离群点后出现决策失误的超平面。

关于核感知器的一些参考:

https://www.cnblogs.com/xingshansi/p/6718503.html

  • 4
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值