模式识别实习报告.docx
- 文档编号:8630278
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:19.33KB
模式识别实习报告.docx
《模式识别实习报告.docx》由会员分享,可在线阅读,更多相关《模式识别实习报告.docx(14页珍藏版)》请在冰豆网上搜索。
模式识别实习报告
模式识别
ISODATA算法
实
习
报
告
姓名:
学号:
班级:
实习目的
1.利用ISODATA算法实现理想分类。
基本原理
Isodata,迭代自组织分析,通过设定初始参数而引入人机对话环节,并使用归并与分裂的机制,当某两类聚类中心距离小于某一阈值时,将它们合并为一类,当某类标准差大于某一阈值或其样本数目超过某一阈值时,将其分为两类。
在某类样本数目少于某阈值时,需将其取消。
如此,根据初始聚类中心和设定的类别数目等参数迭代,最终得到一个比较理想的分类结果。
算法设计
第一步:
将个模式样本{,i=1,2,3,…,}读入,确定C个初始聚类中心和6个初始参数(K,θN,θc,θs,L,I)。
第二步:
将N个模式样本分给最近的聚类,假如Dj=min(‖x-zj‖,i=1,2,…,), 即‖x-zj‖的距离最小,则x∈Sj。
第三步:
如果Sj中的样本数Nj<Θn,取消样本子集。
第四步:
修正聚类中心值
j=1,2,…,
第五步:
计算各聚类域Sj中诸聚类中心间的平均距离:
第六步:
计算全部模式样本对其相应聚类中心的总平均距离:
第七步:
判别分裂、合并及迭代运算等步骤:
①如迭代运算次数已达I次,即最后一次迭代,置θc=0,跳到第十一步,运算结束。
②如≤K/2,即聚类中心的数目等于或不到规定值的一半,则进入第八步,将已有的聚类分裂。
③如迭代运算的次数是偶次,或≥2K,不进行分裂处理,跳到第十一步;如不符合以上两个条件(即既
不是偶次迭代,也不是≥2K),则进入第八步,进行分裂处理。
分裂处理:
第八步:
计算聚类样本距离的标准差向量:
第九步:
求每一标准差向量{,σj=1,2,…,}中的最大分量,以{σj=1,2,…,}代表。
第十步:
在任一最大分量集{σj=1,2,…,}中,如有>θS(该值给定),同时又满足以下二条件中之一:
(a),即Sj中样本总数超过规定值一倍以上,
(b)Nc≤K/2,
则将Zj分裂为两个新的聚类中心,且类别数加1。
中相当于的分量,可加上k*σjmax,其中k=0.5;中相当于的分量,可减去k*σjmax。
如果本步完成了分裂运算,则跳回第二步;否则,继续。
第十一步:
计算全部聚类中心的距离:
i=1,2,…,-1
j=i+1,…,
第十二步:
比较与θc值,将<θc的值按最小距离次序递增排列,即
{,,…,}
式中,<<…<。
第十三步:
如将距离为Di1j1的两个聚类中心zi1和zj1合并,得新中心为
l=1,2,…,L
式中,被合并的两个聚类中心向量,分别以其聚类域内的样本数加权,使为真正的平均向量。
第十四步:
如果是最后一次迭代运算(即第I次),算法结束。
否则GOTO第一步——如果需由操作者改变输入参数;或GOTO第二步——如果输入参数不变。
实习程序
#include"stdafx.h"
#include"ISODATA.h"
#include"Sort.h"
usingnamespacestd;
//classISODATA
externintN;
externintdim;
ISODATA:
:
ISODATA()
{
c=2;//预期的类数;
Nc=1;//初始聚类中心个数(可以不等于c);
theta_n=2;//每一类中允许的最少模式数目(若少于此数,就不能单独成为一类);
theta_s=1;//类内各分量分布的标准差上限(大于此数就分裂);
theta_D=4;//两类中心间的最小距离下限(若小于此数,这两类应合并);
L=1;//在每次迭代中可以合并的类的最多对数;
I=4;//允许的最多迭代次数;
_d=100;//总体平均距离
Ip=0;//迭代次数
doubleD[MAXNUM][MAXNUM];//各类对中心间的距离
for(inti=0;i for(intj=0;j D[i][j]=MAXDOUBLE; } ISODATA: : ~ISODATA() { } //设置参数 intISODATA: : SetupPattern(Pattern*pattern) { for(inti=0;i x[i]=pattern[i]; returnN; } //算法实现步骤 intISODATA: : Process() { boolchanged=true; //1.预置 //2)将待分类的模式特征矢量x1,x2,...,xn读入; //SetupPattern(); //3)选定初始聚类中心,可从待分类的模式特征矢量集{xi}中任选Nc个模式特征矢量作为初始聚类中心zj(j=1,2,...,Nc). InitCenter(); step1: //1)设定聚类分析控制参数: SetupParameter(); step2: //2.按最小距离原则将模式集(xi)中每个模式分到某一类中 changed=false; Clustering(); if(Ip==0) cout< else cout< PrintSort(); step3: //3.依据theta_n判断合并。 如果类wj中样本数nj if(CombinBytheta_n()) gotostep2; step4: //计算分类后的参数: 各类中心、类内平均距离及总体平均距离。 CalParameter(); step5: //依据Ip,Nc判断停止\分裂或合并。 if(Ip==I) { theta_D=0; gotostep9; } elseif(Nc<=c/2) gotostep6; elseif(Nc>=2*c) gotostep9; elseif(Ip%2==1)//Nc>c/2&&Nc<2*c gotostep6; else gotostep9; step6: //计算各类类内距离的标准差矢量 CalSigma(); step7: //求出每一聚类类内距离标准差矢量sigma中的最大分量sigma_max //CalMaxSigma();//由于在Sort类中已进行计算,这里不做任何处理 step8: //判断分裂 if(Split()) { changed=true; Ip++; gotostep2; } step9: //计算各类对中心间的距离 CalCenterDis(); step10: //依据theta_D判断合并 if(CombinBytheta_D()) changed=true; step11: //判断循环还是退出 if(Ip>=I) { cout< gotoover; } elseif(changed==false) { Ip++; cout< gotoover; } else { Ip++; charch; cout<<"本次迭代完成,是否需要改变参数(Y/N)? : "; cin>>ch; if(ch=='y'||ch=='Y') gotostep1; else gotostep2; } over: PrintSort(); returnIp; } //3)选定初始聚类中心 voidISODATA: : InitCenter() { srand((unsigned)time(NULL)); intnum=N; intno[MAXNUM]; for(inti=0;i no[i]=i; for(intj=0;j { intk=rand()%num; w[j].z=x[no[k]]; w[j].z.n=0; for(intl=k;l no[l]=no[l+1]; num--; } } //step1: 设定聚类分析控制参数 voidISODATA: : SetupParameter() { cout<<"设定聚类分析控制参数: "< cout<<"预期的类数c: "; cin>>c; cout<<"初始聚类中心个数(可以不等于c)Nc: "; cin>>Nc; cout<<"每一类中允许的最少模式数目(若少于此数,就不能单独成为一类)theta_n: "; cin>>theta_n; cout<<"类内各分量分布的标准差上限(大于此数就分裂)theta_s: "; cin>>theta_s; cout<<"两类中心间的最小距离下限(若小于此数,这两类应合并)theta_D: "; cin>>theta_D; cout<<"在每次迭代中可以合并的类的最多对数L: "; cin>>L; cout<<"允许的最多迭代次数I: "; cin>>I; } //step2: 按最小距离原则将模式集(xi)中每个模式分到某一类中 voidISODATA: : Clustering() { doubletemp=0.0,min=MAXDOUBLE; intl=0; for(intj=0;j { w[j].n=0; w[j].z.n=0; } for(inti=0;i { min=MAXDOUBLE; l=0; for(intj=0;j { temp=Pattern: : Distance(x[i],w[j].z); if(min>temp) { min=temp; l=j; } } w[l].Insert(x[i]); } } //step3: 依据theta_n判断合并。 如果类wj中样本数nj boolISODATA: : CombinBytheta_n() { intj=0; do { if(w[j].n { for(intk=j;k //w[k]=w[k+1]; w[k].z=w[k+1].z; Nc--; //循环中跳出! ? returntrue; } j++; }while(j returnfalse; } //step4: 计算分类后的参数: 各类中心、类内平均距离及总体平均距离。 voidISODATA: : CalParameter() { _d=0.0; for(intj=0;j { w[j].CalCenter(); _d+=w[j].n*w[j].Cal_D(); } _d/=N; } //step6: 计算各类类内距离的标准差矢量 voidISODATA: : CalSigma() { for(intj=0;j w[j].CalSigma(); } //step7: 求出每一聚类类内距离标准差矢量sigma中的最大分量sigma_max voidISODATA: : CalMaxSigma() { //由于在Sort类中已进行计算,这里不做任何处理 } //step8: 判断分裂 boolISODATA: : Split() { for(intj=0;j { if(((w[j]._d>_d)&&(w[j].n>2*(theta_n+1)))||(Nc<=c/2)) { inti=w[j].max; doublesigma=w[j].sigma_max; for(intl=Nc;l>j;l--) w[l].z=w[l-1].z; w[j].z.x[i]-=K*sigma; w[j+1].z.x[i]+=K*sigma; Nc++; returntrue; } } returnfalse; } //step9: 计算各类对中心间的距离 voidISODATA: : CalCenterDis() { for(inti=0;i for(intj=i+1;j D[i][j]=Pattern: : Distance(w[i].z,w[j].z); } //step10: 依据theta_D判断合并 boolISODATA: : CombinBytheta_D() { inti,j,k,l;//循环变量 intnum=0; boolb=false; //较小的类对中心 struct { doubled; inti; intj; }Dmin[MAXNUM]; for(i=0;i { Dmin[i].d=0.0; Dmin[i].i=-1; Dmin[i].j=-1; } //将D[i][j]与theta_D比较,并将小于theta_D的那些D[i][j]按递增次序排列,取前L个,Dmin[0] for(i=0;i for(j=i+1;j if(D[i][j] for(k=0;k if(D[i][j] { for(l=L-1;l>k;l--) Dmin[l]=Dmin[l-1]; Dmin[k].d=D[i][j]; Dmin[k].i=i; Dmin[k].j=j; break; } //从最小的Dmin开始,将相应的两类合并。 for(i=0;i if(Dmin[i].i>-1&&Dmin[i].j>-1) //合并两类 if(w[Dmin[i].i].Combin(w[Dmin[i].j])) b=true; //去掉已取消的类心 for(j=0;j if(w[j].z.n==-2) { for(k=j;k w[k].z=w[k+1].z; Nc--; } returnb; } //step11: 判断循环还是退出 //输出当前模式分类情况 voidISODATA: : PrintSort() { cout<<"共分为分为"< "< for(inti=0;i { cout< \t("; for(intj=0;j cout< cout< cout<<"包含的模式为: "< for(intk=0;k { //Xi(12,12,12); cout<<"\tX"< for(intj=0;j cout< cout< } cout< } } 实习体会 经过这次实习,我感到自己还是学到了很多的东西,对于模式识别而言也有了更进一步的了解和加深。 知道自己该通过哪些步骤来达到自己的目的。 另外,通过实习我们也实习我们也熟悉了对VC软件的使用,为以后的工作打下了坚实的基础。 同时也通过编程,加深了对ISODATA算法的理解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模式识别 实习 报告