K-means C语言实现代码_第1页
K-means C语言实现代码_第2页
K-means C语言实现代码_第3页
K-means C语言实现代码_第4页
K-means C语言实现代码_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include <stdio.h> #include <math.h>#define TRUE            1#define FALSE           0 int N;/数据个数int K;/集合个数int * CenterIndex;/初始化质心数组的索引double * Center;/质心集合double * Cente

2、rCopy;/质心集合副本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 ) );

3、60;   for( i=0;i<k;+i)/随机生成k个数            int a=rand()%n;        /判重        for(j=0;j<i;j+)             

4、       if(centerj=a)/重复                            break;              

5、0;             if(j>=i)/如果不重复,加入                    centeri=a;                else

6、                    i-;            /如果重复,本次重新随机生成                 /返回距离最小的质心的序号i

7、nt GetIndex(double value,double * center)    int i=0;    int index=i;/最小的质心序号    double min=fabs(value-centeri);/距质心最小距离    for(i=0;i<K;i+)            if(fabs(value-centeri)<min)/如果比当前

8、距离还小,更新最小的质心序号和距离值                     index=i;             min=fabs(value-centeri);           

9、     return index;/拷贝质心数组到副本void CopyCenter()    int i=0;    for(i=0;i<K;i+)            CenterCopyi=Centeri;    /初始化质心,随机生成法void InitCenter()    int i=0;   

10、CreateRandomArray(N,K,CenterIndex);/产生随机的K个<N的不同的序列    for(i=0;i<K;i+)            Centeri=AllDataCenterIndexi;/将对应数据赋值给质心数组        CopyCenter();/拷贝到质心副本/加入一个数据到一个Clusterindex集合void AddToCluster(int i

11、ndex,double value)    ClusterindexTopindex+=value;/这里同进栈操作/重新计算簇集合void UpdateCluster()        int i=0;    int tindex;    /将所有的集合清空,即将TOP置0    for(i=0;i<K;i+)        &#

12、160;   Topi=0;        for(i=0;i<N;i+)            tindex=GetIndex(AllDatai,Center);/得到与当前数据最小的质心索引        AddToCluster(tindex,AllDatai);      &

13、#160; /加入到相应的集合中     /重新计算质心集合,对每一簇集合中的元素加总求平均即可void UpdateCenter()    int i=0;    int j=0;    double sum=0;    for(i=0;i<K;i+)            sum=0;   

14、0;        /计算簇i的元素和        for(j=0;j<Topi;j+)                      sum+=Clusterij;       

15、60;         if(Topi>0)/如果该簇元素不为空                   Centeri=sum/Topi;/求其平均值            /判断2数组元素是否相等int IsEqual(double * center1

16、,double * center2)    int i;    for(i=0;i<K;i+)             if(fabs(center1i!=center2i)                      ret

17、urn FALSE;                 return TRUE;/打印聚合结果void Print()    int i,j;    printf("- ");    for(i=0;i<K;i+)            

18、; printf("第%d组: 质心(%f) ",i,Centeri);          for(j=0;j<Topi;j+)                        printf("%f ",Clusterij); 

19、0;                            /初始化聚类的各种数据void InitData()    int i=0;    int a;    printf("输入数据个数: ");  &#

20、160;      scanf("%d",&N);    printf("输入簇个数: ");         scanf("%d",&K);        if(K>N)          

21、60; 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)*

22、K);     AllData=(double *)malloc(sizeof(double)*N);/为数据集合申请空间    Cluster=(double *)malloc(sizeof(double *)*K);/为簇集合申请空间    /初始化K个簇集合    for(i=0;i<K;i+)            Clusteri=(double *)

23、malloc(sizeof(double)*N);        Topi=0;        printf("输入%d数据: ",N);    for(i=0;i<N;i+)            scanf("%d",&(a);    

24、60;   AllDatai=a;        InitCenter();/初始化质心集合          UpdateCluster();/初始化K个簇集合     /*算法描述:K均值算法:    给定类的个数K,将N个对象分到K个类中去,    使得类内对象之间的相似性最大,而类之间的相似性最小。*/main()    int Flag=1;/迭代标志,若为false,则迭代结束    int i=0;     InitData();/初始化数据           while(Flag)/开始迭代           

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论