模式识别c语言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]; //分量的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
差
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; //记录迭代次数
i,j; //循环变量 int
//以下为程序用到的调用函数
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;
}
}
}
页脚.