模式识别1-线性分类器(感知机)

来源:互联网 发布:jsoup实例源码 编辑:程序博客网 时间:2024/05/29 02:15

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和-1y1 = 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

阅读全文
0 0
原创粉丝点击