您的位置:首页 > 编程语言 > MATLAB

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

2017-04-06 15:31 330 查看
参考: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


在命令行输入与结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: