模式识别实验.docx
《模式识别实验.docx》由会员分享,可在线阅读,更多相关《模式识别实验.docx(20页珍藏版)》请在冰豆网上搜索。
![模式识别实验.docx](https://file1.bdocx.com/fileroot1/2022-10/20/abafc91b-05c4-4efc-8746-ec1027e50a88/abafc91b-05c4-4efc-8746-ec1027e50a881.gif)
模式识别实验
《模式识别》实验报告
班级:
电子信息科学与技术13级02班
姓名:
学号:
指导老师:
成绩:
通信与信息工程学院
二〇一六年
实验一最大最小距离算法
1、实验内容
1.熟悉最大最小距离算法,并能够用程序写出。
2.利用最大最小距离算法寻找到聚类中心,并将模式样本划分到各聚类中心对应的类别中。
2、实验原理
N个待分类的模式样本,分别分类到聚类中心对应的类别之中。
最大最小距离算法描述:
(1)任选一个模式样本作为第一聚类中心。
(2)选择离距离最远的模式样本作为第二聚类中心。
(3)逐个计算每个模式样本与已确定的所有聚类中心之间的距离,并选出其中的最小距离。
(4)在所有最小距离中选出一个最大的距离,如果该最大值达到了的一定分数比值以上,则将产生最大距离的那个模式样本定义为新增的聚类中心,并返回上一步。
否则,聚类中心的计算步骤结束。
这里的的一定分数比值就是阈值,即有:
(5)重复步骤(3)和步骤(4),直到没有新的聚类中心出现为止。
在这个过程中,当有k个聚类中心时,分别计算每个模式样本与所有聚类中心距离中的最小距离值,寻找到N个最小距离中的最大距离并进行判别,结果大于阈值是,存在,并取为产生最大值的相应模式向量;否则,停止寻找聚类中心。
(6)寻找聚类中心的运算结束后,将模式样本按最近距离划分到相应的聚类中心所代表的类别之中。
三、实验结果及分析
该实验的问题是书上课后习题2.1,以下利用的matlab中的元胞存储10个二维模式样本
X{1}=[0;0];X{2}=[1;1];X{3}=[2;2];X{4}=[3;7];X{5}=[3;6];
X{6}=[4;6];X{7}=[5;7];X{8}=[6;3];X{9}=[7;3];X{10}=[7;4];
利用最大最小距离算法,matlab运行可以求得
从matlab运行结果可以看出,聚类中心为,以为聚类中心的点有,以为聚类中心的点有,以为聚类中心的有。
同时,做出聚类分析后的分布图,如下:
图中用蓝色大圈标记了聚类中心,用星号标记了以为聚类中心的样本,用三角符号标记了以以为聚类中心的样本,用红色小圈标记了以为聚类中心的样本,该程序成功进行了分类
实验二感知器算法
一、实验内容
1.熟悉感知器算法,并能够用程序写出。
2.利用感知器算法进行判别分类,算出判别函数,画出判别界面。
2、实验原理
直接用来对模式进行分类的准则函数。
若分属于ω1,ω2的两类模式可用一方程来划分,那么称为判别函数,或称判决函数、决策函数。
如,一个二维的两类判别问题,模式分布如图示,这些分属于ω1,ω2两类的模式可用一直线方程来划分。
其中式中:
为坐标变量。
图2-1两类二维模式的分布
将某一未知模式代入:
若,则类;
若,则类;
若,则或拒绝。
两类线性可分的模式类,设其中,,应具有性质
对样本进行规范化处理,即ω2类样本全部乘以(-1),则有:
感知器算法通过对已知类别的训练样本集的学习,寻找一个满足上式的权向量。
感知器算法步骤:
(1)选择N个分属于ω1和ω2类的模式样本构成训练样本集构成增广向量形式,并进行规范化处理。
任取权向量初始值W
(1),开始迭代。
迭代次数k=1。
(2)用全部训练样本进行一轮迭代,计算的值,并修正权向量。
分两种情况,更新权向量的值:
1.分类器对第i个模式做了错误分类,权向量校正为:
c:
正的校正增量。
2.若分类正确,权向量不变:
统一写为:
(3)分析分类结果:
只要有一个错误分类,回到
(2),直至对所有样本正确分类。
感知器算法是一种赏罚过程:
分类正确时,对权向量“赏”——这里用“不罚”,即权向量不变;
分类错误时,对权向量“罚”——对其修改,向正确的方向转换。
3、实验结果与分析
已知两类训练样本为:
设,同样地,利用matlab元胞数组存储该两类训练样本
利用感知器算法,matlab运行得到如下结果:
因此,可以得到感知器算法算出的判别函数为:
利用matlab的画图函数画出判别界面以及样本点,得到如下的分布图:
由样本分布图可以看出,判别界面成功将两类训练样本分离。
实验三LMSE算法
1、实验内容
1.了解LMSE算法,并能够用程序写出。
2.利用LMSE算法进行判别分类,算出判别函数,并画出判别界面。
二、实验原理
LMSE算法为最小平方误差算法,其算法过程如下:
(1)将N个分属于类和类的n维模式样本写成增广形式,将属于的训练样本乘以(-1),写出规范化增广样本矩阵。
(2)求的伪逆矩阵。
(3)设置初值c和,c为正的校正增量,的各分量大于0,括号中数字代表迭代次数k=1,开始迭代。
(4)计算,进行可分性判别。
如果,模式线性可分,解为,算法结束。
如果,模式线性可分,有解。
继续迭代。
如果,停止迭代,检查是否大于0。
若大于0,有解,否则无解,算法结束。
(5)计算和
先计算,再计算,迭代次数k加1,返回第(4)步。
3、实验结果及分析
该实验用的训练样本与感知器算法使用的样本一致,为以下两类训练样本:
设定初始值,同样地利用matlab中的元胞数组存放训练样本点,通过编写matlab的LMSE程序可以得到以下结果:
所以,LMSE算法求得的该两类训练样本的判别函数为
利用matlab的画图函数画出判别界面以及样本点,得到如下的分布图:
由样本分布图可以看出,LMSE算法所得的判别界面也成功将两类训练样本分离。
实验四Parzen窗估计
1、实验内容
1.了解Parzen窗概率密度的估计方法,能用程序实现。
2.编写matlab程序,求解一个正态密度的Parzen窗估计。
2、实验原理
设区域是一个维的超立方体,并设是超立方体的棱长,则超立方体的体积为定义窗函数为
由于是以原点为中心的一个超立方体,所以当落入到以为中心,体积为的超立方体时,,否则,因此落入该超立方体内的样本数为
是的第N次估计,则有
所以联立上面两式得
这个式子就是Parzen窗法的基本公式。
3、实验结果与分析
待估计的的均值为零,方差为1的正态密度函数,利用matlab可以随机产生1个,16个,256个学习样本的样本集,选取正态窗函数
并设,分别取,利用matlab可以得到不同取值下的估计结果。
(1)当时得到的结果
从图中可以看出,估计概率密度函数是一个样本为中心的小丘,误差很大。
(2)当时得到的结果
从图中可以看出,在时,噪声误差非常大,产生了不连续性。
慢慢增大时,受到了平滑,但平均性误差也随之增大,分辨率降低。
(3)当时得到的结果
从下图可以看出,当增大到,估计量越来越好,在时,估计量很接近真实分布。
从整个实验来看,Parzen窗法只要样本足够多,总可以保证收敛于任何复杂的未知概率密度函数,但是也受到值的影响,当太小时,就会造成不连续性,噪声误差增大。
当太大时,分辨率就会下降,平均性误差就会增大。
附录一 最大最小距离算法程序
clear;
clc;
X{1}=[0;0];X{2}=[1;1];X{3}=[2;2];X{4}=[3;7];X{5}=[3;6];
X{6}=[4;6];X{7}=[5;7];X{8}=[6;3];X{9}=[7;3];X{10}=[7;4];
%取第一个点为一个聚类中心
z{1}=X{1};
position
(1)=1;
%计算其它点到z1的距离
fori=1:
10
d(i)=dist(X{i}',z{1});
end
%找到距离z1最远的点的位置
max_dist=max(d);
pos=find(d==max(d));
z{2}=X{pos};
position
(2)=pos;
rate=0.5;%分数比值设置为0.5
T=rate*dist(z{1}',z{2});%初始阈值
min_dist=d;
flag=2;
index=1;
while
(1)%循环求出其他距离并与事先设定的阈值作比较
fori=1:
10
d(flag,i)=dist(X{i}',z{flag});
ifmin_dist(i)>d(flag,i)
min_dist(index)=d(flag,i);
else
min_dist(index)=min_dist(i);
end
index=index+1;
end
index=1;
max_dist=max(max(min_dist));
[xy]=find(min_dist==max(min_dist));
if(max_dist>T)
flag=flag+1;
z{flag}=X{y};
position(flag)=y;
else
break;
end
end
fprintf('以下序号的样本为聚类中心:
\n');
fori=1:
flag
fprintf('%d\t',position(i));
end
fprintf('\n=======================');
%计算各样本到各聚类中心的距离
fori=1:
10
forj=1:
flag
distance(i,j)=dist(X{i}',z{j});
end
end
flag1=1;
flag2=1;
distance2=distance';
[mincolI]=min(distance2);
%对10个样本进行聚类
fori=1:
10
forj=1:
flag
if(I(i)==j)
array(j,flag1)=i;
flag1=flag1+1;
else
continue;
end
end
end
%对聚类结果进行输出
while(flag2<=flag)
fprintf('\n第%d类的聚类中心为:
%d\n',flag2,position(flag2));
fprintf('属于第%d类的有:
\n',flag2);
fori=1:
10
if(array(flag2,i)~=0)
fprintf('%d\t',array(flag2,i));
ifflag2==1
plot(X{array(flag2,i)}
(1),X{array(flag2,i)}
(2),'b*');
holdon;
end
ifflag2==2
plot(X{array(flag2,i)}
(1),X{array(flag2,i)}
(2),'black^');
holdon;
end
ifflag2==3
plot(X{array(flag2,i)}
(1),X{array(flag2,i)}
(2),'ro');
title('样本坐标聚类显示图');
holdon;
end
end
end
fprintf('\n');
flag2=flag2+1;
end
gridon;
axis([0809]);
holdon
plot(X{position
(1)}
(1),X{position
(1)}
(2),'o','Markersize',10);
holdon
plot(X{position
(2)}
(1),X{position
(2)}
(2),'o','Markersize',10);
holdon
plot(X{position(3)}
(1),X{p