⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csoures.c

📁 模式识别中的K均值的动态聚类算法
💻 C
字号:
#include<stdio.h>
#include<math.h>
main()
{
  int flag=0;             //循环判断开关;
  int i,j,n;
  float m[]={0,0,0,0,0,0,0,0,0,0};
  int length[]={0,0,0,0,0,0,0,0,0,0};//类长度;
  int t=0;                 //类长度传递因子;
  int K;                 //种类数目寄存器;
           
  int dl=0;            //类别传递因子;
  float Z[12][2];      //初始分类存贮器;
  float X[12][2]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};        //分类寄存器;
  float S[100][2];       //数据源存贮器;
  float P[100][100][2];  //结果寄存器;
  char c='a';
  while(c!='q')
  { 
	 /*..........数据输入 ...........*/
    for(i=0;i<100;i++)
	{
		S[i][0]=0;
		S[i][1]=0;
	}
    printf("\nHELLO! Please input the numble of the data:\n");
    scanf("%d",&n);
    printf("Please input data\n");
    for(i=0;i<n;i++)
	{
      for(j=0;j<2;j++)
	  {   
		 if(j==0)
		 {
       printf("S[%d]x=",i+1);
       scanf("%f",&S[i][j]);
		 }
         else
		 {
        printf("S[%d]y=",i+1);
        scanf("%f",&S[i][j]);
		 }
   
	  }
	}
/*******************************算法过程***************************************/
printf("GOOD! Please input the number of the sorts(K<10):\n");
scanf("%d",&K);
for(i=0;i<K;i++)                          //定义前面K个数据为初始聚类中心;
{   
	Z[i][0]=S[i][0];
    Z[i][1]=S[i][1];
}
 
 
again:
for(i=0;i<100;i++)
for(j=0;j<100;j++)
{
	P[i][j][0]=0;
 
    P[i][j][0]=0;
}
 
 dl=0;
for(i=0;i<n;i++)
{
m[i]=(Z[0][0]-S[i][0])*(Z[0][0]-S[i][0])+(Z[0][1]-S[i][1])*(Z[0][1]-S[i][1]);//第n点到第1聚类中心的距离为初始距离;
}


for(i=0;i<n;i++)
{     
	for(j=0;j<K;j++)
	{ 
		if(((Z[j][0]-S[i][0])*(Z[j][0]-S[i][0])+(Z[j][1]-S[i][1])*(Z[j][1]-S[i][1]))<=m[i])//第i个点到第j个聚类中心的距离;
		{ 
          m[i]=(Z[j][0]-S[i][0])*(Z[j][0]-S[i][0])+(Z[j][1]-S[i][1])*(Z[j][1]-S[i][1]);
		  dl=j;
		}
	 
		 
	}
	length[dl]+=1; //第j类的长度加一; 
    t=length[dl]-1;
	P[dl][t][0]=S[i][0];

 
    P[dl][t][1]=S[i][1];
   	
}

/*************判断聚类中心**************/
for(i=0;i<12;i++)
{
X[i][0]=0;
X[i][1]=0;
}
for(i=0;i<K;i++)                   //计算新的聚类中心;
{for(j=0;j<length[i];j++)
   {
	   X[i][0]+=P[i][j][0];
	   X[i][1]+=P[i][j][1];
   }
    X[i][0]=X[i][0]/length[i];
    X[i][1]=X[i][1]/length[i];
}
for(i=0;i<K;i++)
{
	if((X[i][0]!=Z[i][0])||(X[i][1]!=Z[i][1]))	
	 
	{    flag=1;                       //循环判断因子;
		Z[i][0]=X[i][0];
	    Z[i][1]=X[i][1];
		
	}
	 
 
    

}
if(flag==1)
{
	flag=0;
  for(i=0;i<K;i++)         //长度初始化;
    length[i]=0;
   	goto again;
}
/*******************************判断所属类,打印结果***************************************/
printf("the result of this learning is :\n");
for(i=0;i<K;i++)
{
	printf("\nthe %dth class:\n",i);
	for(j=0;j<length[i];j++)
	{
		printf("(%f, %f)  ",P[i][j][0],P[i][j][1]);
	}
}
   

  printf("\nYou did a good job ,press any key to continue");
  printf("\npress 'q' to quit!! thank you !!");
  
}
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -