感知器的权向量递增公式为 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页