K_mean算法C的实现源码

#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]);
 }
}


转载于:https://my.oschina.net/u/2414082/blog/477753

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值