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

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

你可能感兴趣的:(matlab,机器学习)