感知机(perceptron)算法与MATLAB实现

参考:http://blog.csdn.net/xmu_jupiter/article/details/21884501

感知机策略:
选取w和b,使得误分类点到分类超平面S的总距离最小,即min L(w,b)=-∑yi*(wi+b) (误分类点的和)

感知机算法:
采取随机梯度下降法(stochastic gradient descent):一次随机选取一个误分类点来更改w和b的值
(1)选取初值w=0,b=0(本例中是这么设置的,注意w和b可能是向量)
(2)在训练集中选取数据(xi,yi)
(3)如果yi*(wi+b)≤0,则该点是一个误分类点,需要更新w和b的值:
w←w+λ*yi*xi,b←b+λ*yi,λ是学习率(也需要设置一个值)
(4)重复(2)和(3)直至没有误分类点
先建一个脚本

function [ w,b ] = original_style( training_set,study_rate )  
%training_set是一个m*n维矩阵,其中第一行是y_i,剩下的行的x_i  
%选取初始值w_0,b_0  
w=0;  
b=0;  
count=0;            %每一次正确分类点个数  
iteration_count=0;  %迭代次数  
fprintf('迭代次数\t误分类点\t\t权值w\t\t偏置b\t\n');%输出结果标题  
while count ~= size(training_set,2)    %training_set列数,即样本数
    %当没有误分类点时,不执行if语句,count每次都加1,不满足while条件,跳出while循环,结束
    count=0;    
    %在训练集中选取数据(x_i,y_i)  
    for i=1:size(training_set,2)  
      count = count+1;  
      %如果某个样本y_i(w*x_i+b)<=0,则被误分类,对w和b进行相应的更新  
      if training_set(1,i)*(w'*training_set(2:size(training_set,1),i)+b)<=0  
            w = w + study_rate*training_set(1,i)*training_set(2:size(training_set,1),i);  
            b = b + study_rate*training_set(1,i);  
            iteration_count=iteration_count+1;  %迭代次数+1
            count=count-1;%不是正确分类点,减一  
            fprintf('\t%u\t',iteration_count);%输出迭代次数  
            fprintf('\t\t%u\t',i);%输出误分类点  
            fprintf('\t(%2.1g,%2.1g)''\t',w);%输出w  
            fprintf('\t%4.1g\n',b);%输出b          
      end
    end
end  
end  

在命令行输入与结果:
感知机(perceptron)算法与MATLAB实现_第1张图片

你可能感兴趣的:(Matlab)