模式识别c语言ISODATA算法.doc
下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
2.下载的文档,不会出现我们的网址水印。
3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
文档包含非法信息?点此举报后获取现金奖励!
下载文档到电脑,查找使用更方便
18
积分
还剩页未读,继续阅读
关 键 词:模式识别
语言
ISODATA
算法
资源描述:
c语言编写的ISODATA程序
#include#include#include#include#include#include#define MAXNUM 100 //最大模式个数
#define MAXDIM 10 //最大模式维数
#define K 0.5 //分裂时使用的比值
#define MAXDOUBLE 1.0e20 //最大双精度值
#define N 10 //实际模式个数
#define DIM 2 //实际模式维数
struct Pattern //模式结构体
{
int n; //模式序号
float s[MAXDIM]; //模式数据
};
struct Cluster //类结构体
{
struct Pattern z; //类中心
int n; //类中包含的模式数目
float avg_d; //模式到类心的平均距离
struct Pattern y[MAXNUM]; //模式
float sigma[MAXDIM]; //分量的标准差
int max; //用于记录类内距离标准差矢量最大的分量下标
float sigma_max; //类内分量距离标准差最大值
};
struct Pattern InitPattern(int i,float a,float b) //对样本模式进行初始化
{
struct Pattern temp;
temp.n=i;
temp.s[0]=a;
temp.s[1]=b;
return temp;
}
//以下为各参数声明
int c=3; //预期的类数
int Nc=1; //初始聚类中心个数
int ON=1; //每一类中允许的最少模式数(小于此数不可单独成类)
float OS=1; //类内分量分布的标准差上限(大于此数就分裂)
float OC=4; //两类中心间的最小距离下限(小于此数两类合并)
int L=1; //在每次迭代中可以合并的类的最大对数
int I=8; //最多迭代次数
struct Pattern x[N]; //全部模式
struct Cluster w[N]; //全部类
float D[MAXNUM][MAXNUM]; //各类对中心间的距离
float dis; //总体平均距离
int iter=1; //记录迭代次数
int i,j; //循环变量
//以下为程序用到的调用函数
void Init();
void ISODATA();
void InitCenter();
void Clustering();
float Distance(struct Pattern x1,struct Pattern x2);
struct Cluster Insert(struct Pattern a,struct Cluster b);
int CheckAndUnion();
void CalParameter();
struct Pattern CalCenter(struct Cluster a);
float Cal_D(int i);
void CalSigma();
int divide();
void CalCenterDis();
int UnionByOC();
void Union(int a,int b);
void PrintCluster();
void main()
{
Init();
printf("\n****************** ISODATA 算法程序 **************************\n");
printf("本实验使用样本集如下:\n");
x[0]=InitPattern(0,0,0);
x[1]=InitPattern(1,3,8);
x[2]=InitPattern(2,2,2);
x[3]=InitPattern(3,1,1);
x[4]=InitPattern(4,5,3);
x[5]=InitPattern(5,4,8);
x[6]=InitPattern(6,6,3);
x[7]=InitPattern(7,5,4);
x[8]=InitPattern(8,6,4);
x[9]=InitPattern(9,7,5);
for(i=0;itemp)
{
min=temp;
l=j;
}
}
w[l]=Insert(x[i],w[l]);
}
}
float Distance(struct Pattern x1,struct Pattern x2) //计算两个模式距离的函数
{
int i;
float temp=0.0;
for(i=0;idis)&&(w[j].n>2*(ON+1))||(Nc<=c/2))
{
i=w[j].max;
for(l=Nc;l>j;l--)
w[l].z=w[l-1].z;
w[j+1].z.s[i]-=K*sigma_temp;
w[j].z.s[i]+=K*sigma_temp;
Nc++;
return 1;
}
}
return 0;
}
void CalCenterDis() //计算各类对中心间的距离
{
int i,j;
for(i=0;ik;l--)
Dmin[l]=Dmin[l-1];
Dmin[k].d=D[i][j];
Dmin[k].i=i;
Dmin[k].j=j;
break;
}
for(i=0;i-1&&Dmin[i].j>-1)
{
Union(Dmin[i].i,Dmin[i].j);
flag=1;
}
for(j=0;j=2*c)||iter%2==0)
goto step8;
step6:
CalSigma();
step7:
if(divide())
{
iter++;
goto step2;
}
step8:
CalCenterDis();
step9:
if(UnionByOC())
changed=1;
step10:
if(iter>=I) //判断循环还是退出
{
printf("---------------经过 %d 次迭代,达到迭代次数--------------\n",iter);
return;
}
else
{
if(changed==1)
{
char ch;
iter++;
printf("本次迭代完成,是否需要改变参数(Y/N)??:");
while(!isspace(ch=getchar()));
if(ch==y||ch==Y)
goto start;
else goto step2;
}
else
{
iter++;
goto step2;
}
}
}
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:模式识别c语言ISODATA算法.doc
链接地址:https://www.renrendoc.com/p-40259822.html