下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州省遵义市新蒲新区2026届中考历史押题试卷含解析
- 2026银川市护士招聘考试题及答案
- 十五五新型储能在大型演唱会临时供电中投资
- 十五五飞轮储能与轨道交通再生能量回收投资
- 2026山东省公共卫生临床中心招聘中初级专业技术人员18人笔试参考试题及答案详解
- 江苏省仪征市新集初级中学2026届中考二模语文试题含解析
- 2026四川内江市隆昌市响石镇中心学校招聘1人笔试备考题库及答案详解
- 2026湖南岳阳市临湘市教育体育局所属公办学校招聘教师10人笔试参考题库及答案详解
- 2026辽宁省机场管理集团有限公司所属通航公司市场化选聘1人笔试参考题库及答案详解
- 2026届湖北省黄冈黄梅县联考中考语文模拟试题含解析
- 四川省成都市成华区片区联考2025-2026学年八年级(上学期)期中英语试卷(含解析)
- 2025年顺丰快递员劳动合同模板
- 2026年中考语文专题复习:标点符号 讲义
- 常见病小儿推拿培训
- 政务颁奖礼仪培训
- 疝气手术护理宣教
- 行文格式规范培训
- 肝癌破裂出血的护理
- 持续时间模型的估计与检验
- 螺旋改直升气柜施工方案
- 陶瓷茶具基本知识培训课件
评论
0/150
提交评论