QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2023|回复: 0
打印 上一主题 下一主题

[算法] K均值c原代码

[复制链接]
字体大小: 正常 放大

2329

主题

34

听众

6432

积分

  • TA的每日心情

    2013-11-18 14:37
  • 签到天数: 76 天

    [LV.6]常住居民II

    自我介绍
    阳光

    群组2013年数学建模国赛备

    群组2013年国赛A题讨论组

    群组2013年国赛B题讨论组

    群组2013年国赛C题讨论组

    群组2013年国赛D题讨论组

    跳转到指定楼层
    1#
    发表于 2013-8-17 11:17 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    [fly] #include #include #include ; #include #define TRUE 1 #define FALSE 0 int N;//数据个数 int K;//集合个数 int * CenterIndex;//初始化质心数组的索引 double * Center;//质心集合 double * CenterCopy;//质心集合副本 double * AllData;//数据集合 double ** Cluster;//簇的集合 int * Top;//集合中元素的个数,也会用作栈处理 //随机生成k个数x(0<=x<=n-1)作为起始的质心集合 void CreateRandomArray(int n, int k,int * center) { int i=0; int j=0; srand( (unsigned)time( NULL ) ); for( i=0;i=i)//如果不重复,加入 { center=a; } else { i--; //如果重复,本次重新随机生成 } } } //返回距离最小的质心的序号 int GetIndex(double value,double * center) { int i=0; int index=i;//最小的质心序号 double min=fabs(value-center);//距质心最小距离 for(i=0;i<k;i++) {="" if(fabs(value-center)); } } return index; } //拷贝质心数组到副本 void CopyCenter() { int i=0; for(i=0;i<k;i++) {="" centercopy=Center; } } //初始化质心,随机生成法 void InitCenter() { int i=0; CreateRandomArray(N,K,CenterIndex);//产生随机的K个<n的不同的序列 for(i="0;i<K;i++)" {="" center=AllData[CenterIndex];//将对应数据赋值给质心数组 } CopyCenter();//拷贝到质心副本 } //加入一个数据到一个Cluster[index]集合 void AddToCluster(int index,double value) { Cluster[index][Top[index]++]=value;//这里同进栈操作 } //重新计算簇集合 void UpdateCluster() { int i=0; int tindex; //将所有的集合清空,即将TOP置0 for(i=0;i<k;i++) {="" top=0; } for(i=0;i,Center);//得到与当前数据最小的质心索引 AddToCluster(tindex,AllData); //加入到相应的集合中 } } //重新计算质心集合,对每一簇集合中的元素加总求平均即可 void UpdateCenter() { int i=0; int j=0; double sum=0; for(i=0;i;j++) { sum+=Cluster[j]; } if(Top>0)//如果该簇元素不为空 { Center=sum/Top;//求其平均值 } } } //判断2数组元素是否相等 int IsEqual(double * center1 ,double * center2) { int i; for(i=0;i<k;i++) {="" if(fabs(center1!=center2)) { return FALSE; } } return TRUE; } //打印聚合结果 void Print() { int i,j; printf("-------------------------------------- "); for(i=0;i<k;i++) {="" printf("第%d组:="" 质心(%f)="" ",i,center); for(j=0;j<top;j++) { printf("%f ",Cluster[j]); } } } //初始化聚类的各种数据 void InitData() { int i=0; int a; printf("输入数据个数: "); scanf("%d",&N); printf("输入簇个数: "); scanf("%d",&K); if(K>N) { exit(0); } Center=(double *)malloc(sizeof(double)*K);//为质心集合申请空间 CenterIndex=(int *)malloc(sizeof(int)*K);//为质心集合索引申请空间 CenterCopy=(double *)malloc(sizeof(double)*K);//为质心集合副本申请空间 Top=(int *)malloc(sizeof(int)*K); AllData=(double *)malloc(sizeof(double)*N);//为数据集合申请空间 Cluster=(double **)malloc(sizeof(double *)*K);//为簇集合申请空间 //初始化K个簇集合 for(i=0;i<k;i++) {="" cluster=(double *)malloc(sizeof(double)*N); Top=0; } printf("输入%d数据: ",N); for(i=0;i<n;i++) {="" scanf("%d",&(a));="" alldata=a; } InitCenter();//初始化质心集合 UpdateCluster();//初始化K个簇集合 } /* 算法描述: K均值算法: 给定类的个数K,将N个对象分到K个类中去, 使得类内对象之间的相似性最大,而类之间的相似性最小。 */ void main() { int Flag=1;//迭代标志,若为false,则迭代结束 int i=0; InitData();//初始化数据 while(Flag)//开始迭代 { UpdateCluster();//更新各个聚类 UpdateCenter();//更新质心数组 if(IsEqual(Center,CenterCopy))//如果本次迭代与前次的质心聚合相等,即已收敛,结束退出 { Flag=0; } else//否则将质心副本置为本次迭代得到的的质心集合 { CopyCenter();//将质心副本置为本次迭代得到的的质心集合 } } Print();//输出结果 getchar(); getchar(); }</top[/fly]
    6 n5 \- r* x- Q: H9 h# x; z2 }
    zan
    转播转播 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-7-29 01:56 , Processed in 0.291036 second(s), 51 queries .

    回顶部