感知器的权向量递增公式为 a(K+1) = a(k) + sum {yj被错误分类} y(j)
假设我们的线性分割线为穿过原点的45度直线,直线上方的为一类(正), 下方的为另一类
则可以取正样本为 y1= (1, 1.5) , y2 = (2, 2.5), y3 = (-1, -0.5)
对于负样本, 取反的话就可以转变为正样本
初始化解向量为 a=(0,0)
计算a' yi =0, i=1..3, 故所有的模式都错误分类了,
所以 第一次迭代之后, a=y1+y2+y3 = ...
然后开始第二次迭代...
写了一个简单的matlab程序模拟这个过程
y1=[1,1.5]';
y2=[2,2.5]';
y3=[-1,-0.5]';
% y is 2*n matrix
n=3;
y=[y1 y2 y3];
a=[0,0]';
decision = a'*y ; %用当前解向量对所有模式分类
j=1;
while sum(decision<=0)>0 %如果有错误分类
decision = a'*y ;
rej=[];
for i=1:n %这个循环计算a(K+1) = a(k) + sum {yj被错误分类} y(j)
if decision(i)<=0
a = a + y(:,i);
rej = [rej i];
end
end
fprintf('after iter %d, a = %g, %g\n', j, a);
rej
j = j + 1;
end
程序输出结果为
>> perceptron
after iter 1, a = 2, 3.5
rej =
1 2 3
after iter 2, a = 1, 3
rej =
3
after iter 3, a = 0, 2.5
rej =
3
after iter 4, a = -1, 2
rej =
3
after iter 5, a = -2, 1.5
rej =
3
after iter 6, a = 0, 4
rej =
2
after iter 7, a = -1, 3.5
rej =
3
after iter 8, a = -2, 3
rej =
3
after iter 9, a = -2, 3
rej =
[]
>>
最后的解向量为 (-2, 3),表示直线 L(x,y) = -2x+3y
满足L(x,y)>0的为正类, <0的为负类
参考:
模式分类第二版中文版 第188页