参考:http://blog.youkuaiyun.com/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
在命令行输入与结果: