参考文章:
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
有很详尽的介绍。