模式识别实验报告
- 格式:docx
- 大小:155.44 KB
- 文档页数:15
模式识别实验报告
实验一、线性分类器的设计与实现
1. 实验目的:
掌握模式识别的基本概念,理解线性分类器的算法原理。
2. 实验要求:
(1)学习和掌握线性分类器的算法原理;
(2)在MATLAB 环境下编程实现三种线性分类器并能对提供的数据进行分类;
(3)对实现的线性分类器性能进行简单的评估(例如算法适用条件,算法效率及复杂度等)。注:三种线性分类器为,单样本感知器算法、批处理感知器算法、最小均方差算法
批处理感知器算法
算法原理:
感知器准则函数为J p a=(−a t y)
y∈Y,这里的Y(a)是被a错分的样本集,如果没有样本被分错,Y就是空的,这时我们定义J p a为0.因为当a t y≤0时,J p a是非负的,只有当a是解向量时才为0,也即a在判决边界上。从几何上可知,J p a是与错分样本到判决边界距离
之和成正比的。由于J p梯度上的第j个分量为∂J p/ða j,也即∇J p=(−y)
y∈Y。梯度下降的迭
代公式为a k+1=a k+η(k)y
y∈Y k,这里Y k为被a k错分的样本集。
算法伪代码如下:
begin initialize a,η(∙),准则θ,k=0
do k=k+1
a=a+η(k)y
y∈Y k
|<θ
until | ηk y
y∈Y k
return a
end
因此寻找解向量的批处理感知器算法可以简单地叙述为:下一个权向量等于被前一个权向量错分的样本的和乘以一个系数。每次修正权值向量时都需要计算成批的样本。
算法源代码:
unction [solution iter] = BatchPerceptron(Y,tau)
%
% solution = BatchPerceptron(Y,tau) 固定增量批处理感知器算法实现
%
% 输入:规范化样本矩阵Y,裕量tau
% 输出:解向量solution,迭代次数iter
[y_k d] = size(Y);
a = zeros(1,d);
k_max = 10000; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% k=0;
y_temp=zeros(d,1);
while k c=0; for i=1:1:y_k if Y(i,:)*a'<=tau y_temp=y_temp+Y(i,:)'; c=c+1; end end if c==0 break; end a=a+y_temp'; k=k+1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %k = k_max; solution = a; iter = k-1; 运行结果及分析: 数据1的分类结果如下 由以上运行结果可以知道,迭代17次之后,算法得到收敛,解出的权向量序列将样本很好的划分。 数据2的分类结果如下: 由以上运行结果可以知道,迭代67次之后,算法得到收敛,解出的权向量序列将样本很好的划分。 自定义的数据分类的结果如下图: 由以上运行结果可以知道,迭代26次之后,算法得到收敛,解出的权向量序列将样本很好的划分。以上两个结果可以证明算法代码实现的正确性。 单样本感知器算法 算法原理 当样本被看成序列输入时,其中一些会被错分,我们只是遇到分类错误的时候才改变权向量所以真正要关注的只是被错分的样本。考虑循环样本,将被错分的样本记为y k,迭代公式为 a k+1=a k+y k,其中对于任何k都有a t y k≤0.设n为所有模式的数目,算法伪代码如下: begin initialize a,k=0 do k=k+1 mod n if y k被a错分a=a+y k until所有模式被正确分类 return a end 在几何上,由于a k错分了y k,a k就不在由a t y k=0.所确定的y k超平面的正侧。将y k加到a k上就是将权向量直接向超平面移动并有可能穿过这个超平面。不管是否穿过这个超平 面,新的内积a t k+1y k都比旧的内积a t k y k大 y k2,校正因此将权向量朝好的方向移动。 算法源代码: function [solution iter] = SinglePerceptron(Y,tau) % % solution = SinglePerceptron(Y,tau) 固定增量单样本感知器算法实现 % % 输入:规范化样本矩阵Y,裕量tau % 输出:解向量solution,迭代次数iter [y_k d] = size(Y); a = zeros(1,d); k_max = 10000; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% i=1; k=0; while(k if(Y(i,:)*a'<=tau) a=a+Y(i,:); end i=mod(k+1,20); if(i==0) i=y_k; end k=k+1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %k = k_max; solution = a; iter = k-1; 运行结果及分析: 数据1的分类结果如下 数据2的分类结果如下