



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
K-Means算法k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。假设要把样本集分为c个类别,算法描述如下: (1)适当选择c个类的初始中心; (2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类; (3)利用均值等方法更新该类的中心值; (4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。#include #include #include #define _NUM 3 /预定义划分簇的数目 using namespace std; /* 特征对象,表示一个元组,一个元组有两个数值属性 */ struct Tuple int attr1; int attr2; ; /* 获取两个特征对象之间的距离,在此以欧基米德距离作为距离度量标准 */ double getDistXY(Tuple t1, Tuple t2) return sqrt(t1.attr1 - t2.attr1) * (t1.attr1 - t2.attr1) + (t1.attr2 - t2.attr2) * (t1.attr2 - t2.attr2); /* 计算簇的中心点,在此以簇中所有对象的平均距离来计算中心点 */ Tuple getMeansC(vector c) int num = c.size(); double meansX = 0, meansY = 0; Tuple t; for (int i = 0; i num; i+) meansX += ci.attr1; meansY += ci.attr2; t.attr1 = meansX / num; t.attr2 = meansY / num; return t; /* 获取算法的准则函数值,当准则函数收敛时算法停止 */ double getE(vector classes, Tuple means) double sum = 0; for (int i = 0; i _NUM; i+) vector v = classesi; for (int j = 0; j v.size(); j+) sum += (vj.attr1 - meansi.attr1) * (vj.attr1 - meansi.attr1) + (vj.attr2 - meansi.attr2) *(vj.attr2 - meansi.attr2); coutsum:sumendl; return sum; /* 对当前的特征对象,查找与其最临近的簇,最临近即到簇中心点的距离最短 */ int searchMinC(Tuple t, Tuple means_NUM) int c = 0; int d = (t.attr1 - means0.attr1) * (t.attr1 - means0.attr1) + (t.attr2 - means0.attr2) * (t.attr2 - means0.attr2); for (int i = 1; i _NUM; i+) int temp = (t.attr1 - meansi.attr1) * (t.attr1 - meansi.attr1) + (t.attr2 - meansi.attr2) * (t.attr2 - meansi.attr2); if (temp d) c = i; d = temp; return c; /* k-Means算法 */ void kMeans(vector init) vector classes_NUM; /定义簇数组,共需划分_NUM个簇 int c; Tuple means_NUM; /定义中心点数组,每个簇对应一个中心点 double newE, oldE = -1; /定义准则函数值 for (int i = 0; i c; classesi.push_back(initc - 1); meansi = getMeansC(classesi); /计算当前每个簇的中心点 coutmeansi:meansi.attr1 meansi.attr2endl; newE = getE(classes, means); /计算当前准则函数值 coutnewE:newE oldE:oldEendl; for (i = 0; i = 1) /当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止 for (int j = 0; j init.size(); j+) /遍历所有特征对象,将其加入到离它最近的簇 int toC = searchMinC(initj, means); classestoC.push_back(initj); cout-endl; for (i = 0; i _NUM; i+) /打印出当前每个簇的特征对象 vector temp = classesi; cout类i+1:endl; for (j = 0; j temp.size(); j+) couttempj.attr1 tempj.attr2endl; cout-endl; for (i = 0; i _NUM; i+) /更新每个簇的中心点 meansi = getMeansC(classesi); coutmeansi:meansi.attr1 meansi.attr2endl; oldE = newE; newE = getE(classes, means); /计算新的准则函数值 for (i = 0; i _NUM; i+) /清空每个簇 classesi.clear(); /* 程序入口 */ void main(int args, char * arg) int n1, n2; vector init; /保存所有输入的特征对象 whil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议补充协议:财产分割及子女抚养费用调整范本
- 专利权质押担保合同设计要点与执行细则
- 矿山合作协议与承包权投资合作及风险控制协议
- 社区党组织书记选拔任用事业编制合同范本
- 班组本质安全培训教程课件
- 油气行业安全培训
- 光纤光栅传感课件
- 开叉车技术考试题及答案
- 文化旅游资金申请2025年政策环境与市场分析报告
- 建设银行2025文山壮族苗族自治州秋招笔试价值观测评题专练及答案
- 挖孔桩孔内气体检测
- 2023年宪法学习宪法知识竞赛试题及答案
- 古诗活动沙龙活动方案
- 2026年高考政治一轮复习:选择性必修1~3共3册知识点背诵提纲汇编
- 《大学生创新创业基础》教案 第1课 大学生创新创业教育概论一
- CJ/T 120-2016给水涂塑复合钢管
- T/CECS 10214-2022钢面镁质复合风管
- (高清版)DG∕TJ 08-202-2020 钻孔灌注桩施工标准
- 肌肉注射技术试题及答案
- 马工程西方经济学(精要本第三版)教案
- GSP药品经营质量管理规范培训
评论
0/150
提交评论