K_mean算法C的实现

这是我大三的时候写在QQ空间的玩意,现在在长沙工作一年的我准备去深圳工作,在研究简历时发现需要给自己在专业的网页建个博客,于是把那时候写的几个小玩意贴上来供大家交流研究下。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
#include<math.h>
#define AttSetSize 2
#define n 8
#define  k 2
double  DIstance( double  DataBase[], double  ClusterCenter[]){
  int  i;
  double  distance=0;
  for (i=0;i<AttSetSize;i++){
   distance+=(DataBase[i]-ClusterCenter[i])*(DataBase[i]-ClusterCenter[i]);
  }
  distance= sqrt (distance); 
  return  distance;
}
main()
{
  double  ClusterCenter[k][AttSetSize];             //簇中心对象
  double  DataBase[n][AttSetSize]={{1,1},{2,1},{1,2},{2,2},{4,3},{5,3},{4,4},{5,4}};  //原始数据对象
  int  i,j;
  int  objectCluster[n];      //数据的簇分类的编号
  double  sim;      
  int  ClusterNo=-1;  // 簇标号
  bool  HasChanged= true ;
  //选择初始簇中心
  for (i=0;i<k;i++){
   for (j=0;j<AttSetSize;j++)
   {
    ClusterCenter[i][j]=DataBase[i][j];   //取前面k个对象
   }
    printf ( "第%d个初始簇中心为:(%f,%f)\n" ,i,ClusterCenter[i][0],ClusterCenter[i][1]);
  }
  //将数据分配进入簇
  while (HasChanged){
  for (j=0;j<n;j++){     //对象的序号的循环
   double  sim=1000;
   for (i=0;i<k;i++){      //簇的循环,判断与那个簇距离更近
    if (DIstance(DataBase[j],ClusterCenter[i])<sim){
     sim =DIstance(DataBase[j],ClusterCenter[i]);
     ClusterNo=i;
    }
  
   objectCluster[j]=ClusterNo;  //对数据簇分类后,标记序号
   printf ( "对象序号为%d初始分配进入簇%d\n" ,j+1 ,objectCluster[j]+1);
  }
  //簇的更新
   for (i=0;i<k;i++)
  
    double  temp0=0;
    double  temp1=0;
    int     num=0;
    printf ( "\n The Current Custer No is %d:\n" ,i);
    for (j=0;j<n;j++){       //对象个数的循环
     if (objectCluster[j]==i){  //判断是哪组簇
     num++;
     temp0=temp0+DataBase[j][0]; 
     temp1=temp1+DataBase[j][1]; 
     printf ( "第%d个对象的属性为:%f,%f\n" ,j+1,DataBase[j][0],DataBase[j][1]);
    // printf("DataBase[j][0]:%f\nDataBase[j][1]:%f\n",DataBase[j][0],DataBase[j][1]);
    // printf("temp0,1:%f,%f\n",temp0,temp1);
     }
    }
    temp0=temp0/num;
    temp1=temp1/num;
    if (ClusterCenter[i][0]==temp0&&ClusterCenter[i][1]==temp1){
     HasChanged= false ;
    }
    ClusterCenter[i][0]=temp0;
    ClusterCenter[i][1]=temp1;
   }
  }
  //结果的输出
  for (i=0;i<k;i++)
  {
   printf ( "输出第%d个簇的对象:" ,i+1);
   for (j=0;j<n;j++)
    if (objectCluster[j]==i)  printf ( "%d " ,j+1);
   printf ( "\n" );
   printf ( "\t\t\t簇平均值为(%f,%f)\n" ,ClusterCenter[i][0],ClusterCenter[i][1]);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值