模式识别c语言IODATA算法
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 CalCenterDi