1.1:感知机算法原理
首先明确,感知机的输入和输出,输入就是一组向量,每个向量都有n个特征值,输出为每个向量的所属类别,对于二分类而言,就是+1和-1.
这个可以用sign函数来模拟:
输入空间到输出空间的函数为:f(x) = sign(w*x +b);
函数理解:w,b为感知机模型参数,w是一个权重向量,b是偏置,w*x是内积,sign是符号函数,当w*x+b>0时候,函数输出为+1,当w*x+b<0时候,函数输出为-1.
然后,感知机是一个线性分类模型,属于一种判别模型。
感知机有一个分类面:w*x +b =0 ,这是对应特征空间的一个超平面S,w为这个超平面的法向量,b是这个超平面的截距,这个超平面将特征空间分为两半,每一边代表一类。
在感知机算法编程中,首先要初始化w和b,然后使用误分点来驱动超平面,进行参数跟新。
当一个x(i)被错误分类的时候,通过下面公式来修正:
w=w+L*y(i)*x(i)
b = b+L*y(i)(L是学习的步长)
进行w和b的更新。
matlab代码实现:
clear all;
close all;
N1=440;
for i=1:N1
x(1,i)=-1.7+1.1*randn(1); % 440 Samples normal distribution
x(2,i)= 1.6+0.9*randn(1);
x(3,i)= 1;
end;
N2=400;
for i=1:N2
y(1,i)= 1.3+1.0*randn(1); % 400 Samples normal distriburion
y(2,i)=-1.5+0.8*randn(1);
y(3,i)= 1;
end;
%
%
% plot(x1(1,:),x1(2,:),'*',x2(1,:),x2(2,:),'o');%paint these point int 2-D
% grid on;
% axis equal;
% axis([-5 5 -5 5 ]);
x1 =x;
x2 =y;
plot(x1(1,:),x1(2,:),'r*',x2(1,:),x2(2,:),'b*');
hold on;
%样本的分类值1和-1
y1 = ones(1,440);
y2 = -ones(1,400);
% x = [x1 x2];
% y = [y1 y2];
%最后一个w的元素是为了增广矩阵的维度
w =[rand(1),rand(1),rand(1)];
b=0;
step =0.001;
count=0;
count1 =0;
count2 =0;
tic;
for j =1:100
for i=1:size(x1,2)%循环X1,迭代更新修正w的权重值
x = x1(:,i);
if(w*x <0)
w =w +step * x;
count = count + 1;
end;
end;
for i = 1:size(x2,2)%循环X2,迭代更新,修正w的权重值
x = x2(:,i);
if(w*x >0)
w =w -step * x;
count = count +1;
end;
end;
end;
Y = min(x1(1,:)):max(x2(1,:));
X = (-w(1)*t1-w(3))/w(2);
plot(x1(1,:),x1(2,:),'r*',x2(1,:),x2(2,:),'bo',Y,X,'g');%画出y——x的决策平面
time = toc
注意:代码中使用的是增广矩阵的运算方法。直接吧y=wx+b,变为了y = wx;
下面的代码是分别跟新w和b,可以分别理解一下。本人也是理解了一下,不过还需要时间消化。
% tic;
% for j = 1:100
% for i=1:size(x,2)
%
% panbie = y(i)*(w*x(:,i) + b);
% if (sign(panbie) >=1)
% count =count+1;
% else
%
% w = w+step*y(i)*x(:,i)';
%
% b =b+ step*y(i);
% count1 = count1+1;
%
%
% end
%
% end
%
% if (count >= size(x,2))
% break;
% end
% count =0;
% count2 = count2 + 1;
%
% end
%
% u1 =min(x(1,:)):max(x(1,:));
% u2 = -( (w(1)/w(2))*u1 +b/w(2) );
%
% w
% b
%
% count1
% count2
% time1 = toc
% plot(u1,u2,'g');
% hold off
%
参考链接:http://blog.csdn.net/shihz_fy/article/details/40684451