东莞理工学院学报 第1 7卷第3期 V0I.17 NO.3 2010年6月 JOURNAL OF DONGGUAN UNIVERSITY OF TECHNOLOGY Jun. 2OlO 一个基于k—m e a n s算法的聚类 陈勇 陈健 (东莞理工学院计算机学院,广东东莞523808) 摘要:用七.means算法对二维数据进行聚类分析,并用c 语言实现了该算法。先按照样本点的距离 进行初始划分,然后再按照各样本点和初始中点的距离远近进行聚类。结果表明,k-means算法对二维数 据的聚类是有效的,实现该算法的程序对二维数据的聚类具有通用性。 关键词:足.means算法;聚类;迭代;数据挖掘 中图分类号:0211.4 文献标识码:A 文章编号t l009—0312(2010)03一o027—05 随着数据库技术的迅速发展以及数据库管理系统广泛的应用,人们利用信息技术和搜集数据的 能力大幅度提高,数据库被广泛应用于商业管理、办公、科学研究和工程开发等领域。数据挖 掘技术是人们长期对数据库技术进行研究而产生的一种技术。它是一门交叉学科,汇聚了数据库、 人工智能、统计学、可视化等不同学科和领域,因此近年来受到各界的广泛关注” 。聚类是数据挖 掘中的一类重要技术,是分析数据并从中发现有用信息的一种有效手段 。数据聚类是发现事物自 然分类的一种方法,也是机器学习和模式识别的一个重要研究领域。为了得到分类,人们提出了许 多种聚类算法,如庀.means算法、高斯最大期望算法、七.harmonic算法等” 。这些算法形成的聚类会 使一个客观划分标准(如最小方差)最优化,从而使得一个聚类中的对象是相似的,而不同聚类中 的对象是不相似的。本文用k.means算法对一个二维数据集进行聚类。 1 问题和算法 1.1 要解决的问题 以坐标表示的7个点( ・, , ,,X4, s, , )作为一个聚类分析的二维样本: .=(1。2), := (3,2), ,=(1,1),X4=(6,5), s=(8,5), =(5,6), =(3,1),要求划分的簇的数量k =2。 1.2 k—means算法 1.2.1 庀一means算法的基本思想 k-means算法采用迭代更新的方法,在每一次迭代中,依据 个聚类中心将周围的点分别组成k 个簇,而重新计算的每个簇的质 tl,(即簇中所有点的平均值,也就是几何中心)将被作为下一次迭 ⑩ 图1 k—moans算法聚类示意图 收稿日期:201 0—01—1 8 基金项目:广东省科技计划项目(2009B010800054)。 作者简介:陈勇(1 964一)。男。广东阳江人,【程师,硕士。主要从事人 _【智能及数据挖掘研究。 28 东 莞理工学院学报 2Ol 代的参照点。迭代使得选取的参照点越来越接近真实的簇的质心,所以目标函数越来越小,聚类效 果也就越来越好” 。图1是聚类示意图。 1.2-2 一means算法的基本步骤 步骤一:由样本的随机分布形成下面两个簇开始迭代:C-=( ,, :, ,, , s, )和c:=(x3, ・, 7)。 步骤二:计算两个簇的中点。 步骤三:计算每个点到两个簇的 中点的距离。 点距离的大小,对二维样本点进行重新分类,形成新簇。 步骤四:按照样本点和两个簇中 步骤五:新簇和旧簇是否一样。 是,则聚类到此结束;否,则按顺序重新执行步骤二、步骤三 和步骤四。 2算法的实现 2.1 编程 编程语言:c 算法实现代码 //样本点类 public class Position{ private float x,y: private int kl,k2; public Position(){j public Position(lfoat x,float Y,int kl,int k2){ this.x=x;this.Y=y;this.kl=kl;this.k2 k2; ) public lfoat X{get{return x;}set{x value;}} public lfoat Y{get{return y;}set{y value;)) public int K1{get{return kl;)set{kl value;)} public int K2{get{return k2;)set{k2 value;)) ) struct MidXY{ public lfoat x://簇中点x坐标 public lfoat y;//簇中点Y坐标 ) class Program{ //计算二维样本点到簇巾点的距离 static lfoat Distant(MidXY mid,Position P){ lfoat distant; distant=(lfoat)System.Math.Sqrt((mid.x-p.X) (mid.x—p.X)+(mid.y。p.Y)‘ (mid.Y—p.Y)); return distant; } //对样本进行聚类 static void DieDai(params Position[】P){ int[】count=new int[2】{O,0); MidXY[】mid=new MidXY[2]; foreach(Position P in P){ if(p.Kl=:1){ count[0】=count[0】+l; 第3期 陈勇等:一个越于k—means算法的聚类 mid[O】.x mid[O].x+p.x; mid[0】.Y mid[0】.Y+‘P.Y; ) if(P.K1=:2){ count【1】 count[1】+1; mid[1】.X mid【1】.x p.x; mid[1】.Y mid【1】.Y p.Y; } } //输出簇中点坐标 for(int i=0;i<2;i++){ mid[i].x/=count[i];mid[i].Y/ count[i]; if(i==0)Console.Write(”Cl簇的中点为:”); if(i==1)Console.Write(”C2簇的巾点为:”); Console.WriteLine(”({0},{1))”,mid[i】-x_ToString(”F2”), mid[i].Y.ToString(”F2”)); } lfoat distant l,distant2; int k:1; //输出各二维样本点到簇巾点距离 foreach(Position P in P){ distant 1 Distant(mid[0],p);distant2=Distant(mid[1】,p); Console.WriteLine(”x{o}到cl的距离{1), ̄lJC2的距离{2 k,distant1.ToString(”F2”),distant2.ToString(”F2”));k++; if(distantl>distant2)p.K2=2; else P.K2:l: } Console.Write(”产生的新簇CI:”); f0r(intj 0i_j<7;j++){ if(P【j】.K2==1) Console.Write(”X{0}”,j十1); ) Console.Write(”\n”);Console.Write(”产生的新簇C2:”); for(intj O;j<7;j++){ if(P[j】.K2=;2) Console.Write(”X{0)”,j+1); } Console.Write(”\n”); } static void Main(string[】args){ bool sign=true; Position[】position=new Position[7]; position[O】=new Position(1,2,1,0); //Xl position【I】=new Position(3,2,1,0); //X2 position[2】=new Position(1,1,2,o); //X3 position[3】=new Position(6,5,2,0); ||X4 position[4】=new Position(8,5,1,O); | 5 position[5】=new Position(5,6,1,0); //X6 position[6】=new Position(3,1,2,o); //X7 while(sign){ Q DleDal(positIon); int count=O: 查苤 茎堕学报 201 for(intj=0;j<7;j++){ if(position[j].K1==position[j].K2)count++; if(count= 7){sign=false;} ) if(!sign)break; foreach(Position P in position){ p.KIp.K2; } ) Console.ReadKey(); } ) 2.2 结果 结果精确到小数点后两位。 第一次迭代: C・簇的中点为:(4.25,3.75)。 C:簇的中点为:(3.33,2.33)。 一到C・的距离3.69,到C:的距离2.36。 到C-的距离2.15,到 的距离0.47。 到C,的距离4.26,到 的距离2.69。 到Ct的距离2.15,到C:的距离3.77。 :,Xs到C・的距离3.95,到C:的距离5-37。 到Ct的距离2.37,到C2的距离4.03。 ,到C-的距离3.O2,到 的距离1.37。 产生的新簇Ct:{ , s, )。 产生的新簇C::{ 一, :, ,,X7)。 第二次迭代: C・簇的中点为:(6.33,5.33)。 C:簇的中点为:(2.O0,1.50)。 t一 到C-的距离6.29,到C:的距离1.12。 到C・的距离4.71,到C2的距离1.12。 z,到C.的距离6.87,到C:的距离1.12。 到C.的距离0.47,到C:的距离5.32。 Xs到C,的距离1.70,到C:的距离6.95。 到C。的距离1.49,到C:的距离5.41。 ,到Ct的距离5.47,到C:的距离1.12。 产生的新簇C・:{ ,X5, o)。 产生的新簇C2:{ -, , 3, }。 相邻两次聚类结果一样,k-'means算法结束。 2.3 结果分析 从7个二维数据样本集{Xl,X2,Xs,X4,Xs,X6, ,},可以很容易看出( -, :, , ,)应该聚为一个 簇,{ , s,X6)应该为另一个簇,实验结果也表明了这一点,从而表明了七-means算法的有效性。 第3期 陈¨ 勇等:一个 于庀一means算法的聚类 口 3l 3 结语 本文简要介绍足.means算法的基本思想及具体步骤,针对要解决的问题,使用k-means算法思想 (按照样本点与簇的中点距离大小,对样本点进行聚类),用CjIj}语言实现了该算法,并解决了二维 数据集聚类问题。算例表明,使用k.means算法可以对二维数据有效地实现聚类。编制的程序对二维 数据的聚类具有通用性。 参考文献 朱明.数据挖掘[M】.合肥:中国科学技术大学出版社,2008. 张一K芳,毛熹莉,熊忠阳.一种改进的k—means算法[J】l计算机应用,2003,8(8):31-33. 袁方,孟增辉,于戈.对k—means算法的改进【J】_计算机工程与应用,2004,36(1):1 77-l 80 王燕.一种改进的k-means聚类算法[J】.计算机应用与软件,2004,l0(3):122-123. A Clustering Based on k-Means Algorithm CHEN Yong CHEN Jlan (College of Computer,Dongguan University ofTechnology,Dongguan 523808,China) Abstract This paper uses七一means algorithm to analyse clusteredly two-dimensional data,and implements the algorithm in C language.This algorithm makes initial division according to the distance between sample points.and then clusters them based on the distance between each sample point and initial midpoint.The result shows that庀-means algorithm is valid to cluster two-dimensional data,and the procedure of the algorithm is applicable for clustering two-dimensionaI data. Key words七一means algorithm;clustering;iterative;data mining