欢迎来到天天文库
浏览记录
ID:40557797
大小:36.00 KB
页数:4页
时间:2019-08-04
《K-Means聚类算法及实现代码》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、K-Means算法k-means算法接受参数k;然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。假设要把样本集分为c个类别,算法描述如下:(1)适当选择c个类的初始中心;(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;(3)利用均值等方法更新该类的中心值;(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则
2、继续迭代。#include#include#include#define_NUM3//预定义划分簇的数目usingnamespacestd;/**特征对象,表示一个元组,一个元组有两个数值属性**/structTuple{intattr1;intattr2;};/**获取两个特征对象之间的距离,在此以欧基米德距离作为距离度量标准**/doublegetDistXY(Tuplet1,Tuplet2){returnsqrt((t1.attr1-t2.attr1)*(t1.attr1-t2.attr1)+(
3、t1.attr2-t2.attr2)*(t1.attr2-t2.attr2));}/**计算簇的中心点,在此以簇中所有对象的平均距离来计算中心点**/TuplegetMeansC(vectorc){intnum=c.size();doublemeansX=0,meansY=0;Tuplet;for(inti=0;i4、数收敛时算法停止**/doublegetE(vectorclasses[],Tuplemeans[]){doublesum=0;for(inti=0;i<_NUM;i++){vectorv=classes[i];for(intj=0;j5、6、ans[i].attr1)+(t.attr2-means[i].attr2)*(t.attr2-means[i].attr2);if(tempinit){vectorclasses[_NUM];//定义簇数组,共需划分_NUM个簇intc;Tuplemeans[_NUM];//定义中心点数组,每个簇对应一个中心点doublenewE,oldE=-1;//定义准则函数值for(inti=0;i<_NUM;i++)7、//对每个簇初始赋予一个特征对象{cin>>c;classes[i].push_back(init[c-1]);means[i]=getMeansC(classes[i]);//计算当前每个簇的中心点cout<<"means["<8、i].clear();}while(abs(newE-oldE)>=1)//当新旧函数值相差不
4、数收敛时算法停止**/doublegetE(vectorclasses[],Tuplemeans[]){doublesum=0;for(inti=0;i<_NUM;i++){vectorv=classes[i];for(intj=0;j5、6、ans[i].attr1)+(t.attr2-means[i].attr2)*(t.attr2-means[i].attr2);if(tempinit){vectorclasses[_NUM];//定义簇数组,共需划分_NUM个簇intc;Tuplemeans[_NUM];//定义中心点数组,每个簇对应一个中心点doublenewE,oldE=-1;//定义准则函数值for(inti=0;i<_NUM;i++)7、//对每个簇初始赋予一个特征对象{cin>>c;classes[i].push_back(init[c-1]);means[i]=getMeansC(classes[i]);//计算当前每个簇的中心点cout<<"means["<8、i].clear();}while(abs(newE-oldE)>=1)//当新旧函数值相差不
5、6、ans[i].attr1)+(t.attr2-means[i].attr2)*(t.attr2-means[i].attr2);if(tempinit){vectorclasses[_NUM];//定义簇数组,共需划分_NUM个簇intc;Tuplemeans[_NUM];//定义中心点数组,每个簇对应一个中心点doublenewE,oldE=-1;//定义准则函数值for(inti=0;i<_NUM;i++)7、//对每个簇初始赋予一个特征对象{cin>>c;classes[i].push_back(init[c-1]);means[i]=getMeansC(classes[i]);//计算当前每个簇的中心点cout<<"means["<8、i].clear();}while(abs(newE-oldE)>=1)//当新旧函数值相差不
6、ans[i].attr1)+(t.attr2-means[i].attr2)*(t.attr2-means[i].attr2);if(tempinit){vectorclasses[_NUM];//定义簇数组,共需划分_NUM个簇intc;Tuplemeans[_NUM];//定义中心点数组,每个簇对应一个中心点doublenewE,oldE=-1;//定义准则函数值for(inti=0;i<_NUM;i++)
7、//对每个簇初始赋予一个特征对象{cin>>c;classes[i].push_back(init[c-1]);means[i]=getMeansC(classes[i]);//计算当前每个簇的中心点cout<<"means["<
8、i].clear();}while(abs(newE-oldE)>=1)//当新旧函数值相差不
此文档下载收益归作者所有