单层感知器的学习与练习


参考文章:

http://blog.csdn.net/xiaowei_cqu/article/details/9004101

http://www.hcii-lab.net/lianwen/Course/Machine%20Learning/main/notes/Lecture%208%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%EF%BC%88Part%202%EF%BC%89.pdf


1、简要说明

单层感知器可以用来区分线性可分的数据,并且一定可以在有限的迭代次数中收敛。数学证明参考参考的第二篇文章。

从使用过程来看,单层的感知器其实看起来是相当简单的:对假设函数进行训练,直到对所有的样本都满足经过假设函数计算出来的结果与预期结果一致,就结束了。


单层的感知函数,是一个非0即1的两类的判断函数:计算出来的值大于一定的门限,就认为是等于1,否则就是0,下面的图来自参考的第二篇文章:




2、计算练习

有两个算法可以用来迭代得到合适的权重值:感知器算法,以及delta算法。

这里只第一个感知器算法进行验证:

%


clear all; close all; clc


function z=signvalue(v)
	if v>0
	   z=1;
        else
	   z=-1;
	end
end

x=[1,1,1;1,1,-1;1,0,-1;1,-1,-1;1,-1,1;1,0,1]
y=[1;1;1;-1;-1;-1]

m=length(y)
%x = [ones(m, 1) x]; % Add a column of ones to x

w=zeros(size(x(1,:)))'

nita=0.5;

iter=0;
wt=w;
for k=1:200
   iter++;
   disp("iter--------------------begin");
   
   change=0;
   for i=1:m
       x(i,:);
       tmpout=signvalue(x(i,:)*wt) ;
       disp(sprintf('y(i) is %.2f,tmpout is %.2f', y(i),tmpout)) % c语言风格
       wt=wt+(nita*(y(i)-tmpout)*x(i,:))' 
       if y(i)!=tmpout
	  change=1
       end
   end
   if change==0
      disp("break loop");
      break;
   end

end

iter
wt

可以看到输出:


iter =  3
wt =

   1
   2
  -1



三次迭代就可以了。



上面的三维的不是很直观,我换一个二维的,以y=x这条线为界,上边的为1类,下边的为另一类:

输入改为:

x=[1,1.1;1.2,1.3;0.5,0.6;-0.3,-0.2;-0.1,1;1,0.9;1.2,1.1;0.4,0.3;-1,-1.1;-0.5,-0.6];
y=[1;1;1;1;1;-1;-1;-1;-1;-1]


程序不变,输出为:

iter =  9
wt =
  -1.1000
   1.1000

分的很好。



============================后记===============================

参考wiki:

https://en.wikipedia.org/wiki/Perceptron

有很详尽的介绍。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值