K均值算法的c语言实现


l 算法:

第一步:选K个初始聚类中心,z1(1)z2(1)…,zK(1),其中括号内的序号为寻找聚类中心的迭代运算的次序号。聚类中心的向量值可任意设定,例如可选开始的K个模式样本的向量值作为初始聚类中心。

第二步:逐个将需分类的模式样本{x}按最小距离准则分配给K个聚类中心中的某一个zj(1)

假设i=j时,,则,其中k为迭代运算的次序号,第一次迭代k=1Sj表示第j个聚类,其聚类中心为zj。

第三步:计算各个聚类中心的新的向量值,zj(k+1)j=1,2,…,K

求各聚类域中所包含样本的均值向量:

其中Nj为第j个聚类域Sj中所包含的样本个数。以均值向量作为新的聚类中心,可使如下聚类准则函数最小:

在这一步中要分别计算K个聚类中的样本均值向量,所以称之为K-均值算法。

第四步:若,j=1,2,…,K,则返回第二步,将模式样本逐个重新分类,重复迭代运算;

若,j=1,2,…,K,则算法收敛,计算结束。


#include
#include
void classfication(int n,int dim,int c,int**sample,float**centre,int**category);
void newcentre(int n,int dim,int c,int**sample,float**centre,int**category);
void recordforecentre(int c,int dim,float**excentre,float**centre);  
int testfinish(int c,int dim,float**excentre,float**centre);
int main()
{
 int n=-1;
 int dim=-1; 
 int c=-1;
 int i=0;
 int j=0;
 printf("请输入样本数目.\n");
 scanf("%d",&n);
 printf("请输入样本维数.\n");
 scanf("%d",&dim);
 printf("请输入要分成的类的数目\n");	
 scanf("%d",&c);
 if(c==1||c<=0){
 	     printf("the input is invalid\n");
 	     return 0; }
 printf("please input the sample number.\n");
 int**sample=(int**)malloc(n*sizeof(int*));
 for( i=0;iresult){
					min=result;
					cc=j;} 
				result=0;
		}
		while(category[cc][t]!=-1)
			t++;
		category[cc][t]=i;
		t=0;
		min=-1; 
    }
 }
  /*
 本函数实现对原来聚类中心的记录*/
void recordforecentre(int c,int dim,float**excentre,float**centre) 
 {
  int i=0;
  int j=0;
  for(i=0;i=0)
 	{
 	 	for(k=0;k







K均值算法的c语言实现_第1张图片

你可能感兴趣的:(模式识别)