(3)当结果簇是密集的,而簇与簇之间的区别明显时,它的效果较好。
2.2.3聚类分析中常用的距离计算函数
当前聚类分析中常用距离计算算法有明氏距离、马氏距离、兰氏距离。
1.明氏(Minkowski)距离
(2.1)
当q取1,2,∞。
时,则分别得绝对距离、欧式(Euclid)距离、切比雪夫(Chebyshev)距离。
本系统所应用的距离算法是欧氏距离。
2.马氏(Mahalanois)距离
(2.2)
∑是样本矩阵A的协方差阵,是总体分布的协差估计量。
马氏距离是明氏距离的改进,它对于一切线性变换是不变的,克服了明氏距离受量纲影响的缺点;马氏距离也部分克服了多重相关性。
3.兰氏(Lance)距离
(2.3)
兰氏距离克服了明氏距离受量纲影响的缺点,但没有考虑多重相关性。
2.2.4聚类方法分析
聚类分析是直接比较各事物之间的性质,将性质相近的归为一类,将性质差别较大的归入不同的类。
在医学实践中也经常需要做分类工作,如根据病人的一系列症状、体征和生化检查的结果,判断病人所患疾病的类型;或对一系列检查方法及其结果,将之划分成某几种方法适合用于甲类病的检查,另几种方法适合用于乙类病的检查,等等。
聚类分析被广泛研究了许多年。
基于聚类分析的工具已经被加入到许多统计分析软件包或系统中,如S-Plus、SPSS,以及SAS。
大体上,聚类算法可以划分为如下几类:
(1)划分方法。
给定一个包含n个对象或数据行,划分方法将数据集划分为k个子集(划分)。
其中每个子集均代表一个聚类(k<=n)。
代表算法为K-means算法、K-medoids算法和CLARANS算法;
(2)层次方法。
该方法就是通过分解所给定的数据对象集来创建一个层次。
它存在的缺陷就是在进行(组)分解或合并之后无法回溯。
将循环再定位与层次方法结合起来使用常常是有效的,如BIRCH和CURE,就是基于这种组合方法设计的;
(3)基于密度的方法。
只要临近区域的密度(对象或数据点的数目)超过某个阈值,就继续聚类。
DBSCAN是一个有代表性的基于密度的方法。
它根据一个密度阈值来控制簇的增长;
(4)基于网格的方法。
基于网格方法将对象空间划分为有限数目的单元以形成网格结构。
其主要优点是它的处理速度很快,其处理时间独立于数据对象的数目,只与量化空间中每一维的单元数目有关。
STING就是一个典型的基于网格的方法;
(5)基于模型的方法。
该方法就是为每个聚类假设一个模型,然后再去发现符合相应模型的数据对象。
它根据标准统计方法并考虑到噪声或异常数据,可以自动确定聚类个数;因而它可以产生很多的聚类方法。
2.2.5其他聚类算法
1.K-medoid算法
K-medoid算法和K-means算法是最典型的划分方法,算法的处理思路基本相同,K-medoid算法有三种实现方式PAM,CLARA和CLARANS。
K-means算法后面我们会重点介绍。
PAM(PartitionAroundMedoid)方法:
对于一个数据库D,D中含有N个元素:
作为参数需给出要生成的簇的个数K(1≤k≤N)。
PAM方法首先随机选择k个对象作为簇的中心,对于每一个中心点O[j],PAM方法试图用所有N-k个非中心点替换它。
如果平方-误差减小则替换发生。
PAM方法对于小数据库处理能得到很好的结果,但是它的计算代价非常高。
需要用N-k个点替换k个点,每次替换都要检验N-k次代价函数,所以复杂度是O(N(N-k)2)。
CLARA(ClusteringLARgeApplication)方法:
是PAM方法的增强版,专门用于处理大量数据。
CLARA方法的思想是:
从所有的数据中取出5组样本,对每个样本实行PAM算法。
比较5组的平方-误差,选取最小的作为输出结果。
CLARA方法的确在处理大数据量时提高了运算速度,但是它所得出来的结果只是关于样本点最优的,并不是所有数据的最优解。
CLARA方法结果的优劣依赖于采样方法。
CLARANS(ClusteringLargeApplicationbaseduponRANdomizedSearch)方法是CLARA方法的加强版,用以提高结果的质量和伸缩性。
CLARANS方法的思想是:
任意从k个中心点中取出一个点,从N-k中任意取一个点去替换它,如果替换成功则重新开始。
如果尝试几次(参数由人给出)没有发现更好的结果,就认为已经达到局部最优。
CLARANS方法的复杂度是O(N2)。
实验显示CLARANS方法比PAM和CLARA更有效。
2.层次聚类法
层次聚类法也称系统聚类法,是目前实际工作中用得最多的一类算法。
层次聚类是将类由多变少的一种方法,分类的步骤如下:
(1)各样品各成一类,这时有n类;
(2)计算各样品之间的距离,将最近的两个样品归为一类;
(3)计算新类与其余各类的距离,再将距离最近的两类合并,这时如果类的个数仍大于1,则再继续重复上述步骤,直到所有样品归为一类,则停止。
样品之间的距离有不同的定义方法,类与类之间也同样有不同的距离的定义方法,这样就产生了不同的层次聚类方法。
常用的层次聚类方法有最短距离法、最长距离法、中间距离法、重心法等。
2.2设计目标
基于K-means算法的平面点集聚类系统是对已知的多个平面点根据用户对聚类中心的数量设置后通过K-means聚类算法的分析后得出相应结果。
通过数据测试能够充分体现出K-means算法的优点。
以上是理论方面的目标,在实践方面要做到编码较优,运行程序耗时较短,占内存较少。
2.3经济效益分析
本系统旨在通过对K-means算法的深入理解和使用后,在亲身体验K-means算法的应用过程中深切体会K-means算法的优点和缺点,为以后不断完善此算法做好准备。
3关键问题及分析
3.1研究设计中要解决的问题
本系统主要是根据K-means算法的基本思想,设计实现一个基于K-means算法下的平面点集聚类系统,并通过系统界面输入和输出结果。
根据上述过程中,有一个关键问题,即K-means算法的运算过程以及K-means在C语言中的实现。
下面重点介绍K-means算法的运算过程。
J.B.MacQueen在1967年提出的K-means算法,是一种被广泛应用于科学研究和工业应用中的经典聚类算法。
K-means算法的核心思想是把n个数据对象划分为k个聚类,使每个聚类中的数据点到该聚类中心的平方和最小,算法处理过程:
输入:
聚类个数k,包含n个数据对象的数据集。
输出:
k个聚类。
(1)从n个数据对象中任意选取k个对象作为初始的聚类中心。
(2)分别计算每个对象到各个聚类中心的距离,把对象分配到距离最近的聚类中。
(3)所有对象分配完成后,重新计算k个聚类的中心。
(4)与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转
(2),否则转(5)。
(5)输出聚类结果。
首先从n个数据对象中任意选择k个对象作为初始聚类中心;而对于所剩下的其它对象,则根据他们与这些聚类中心的相似度(距离),分别将他们分配给与其最相似的(聚类中心所代表的)聚类。
然后再计算每个新聚类的聚类中心(该聚类中所有对象的均值)。
不断重复这一过程直到标准测度函数开始收敛为止。
一般都采用均方差作为标准测度函数,具体定义如下:
(3.1)
其中E为数据库中所有对象的均方差之和;p为代表对象的空间中的一个点;m1为聚类c1的均值(p和m1均是多维的)。
公式3.1所示聚类标准旨在使所获得的k个聚类具有以下特点:
各聚类本身尽可能的紧凑,而各聚类间尽可能的分开。
图3.1K-means算法流程图
K-means算法优点是可以处理大数据集,K-means算法是相对可伸缩的和高效率的,因为它的计算复杂度为O(nkt),其中n为对象个数,k为聚类个数,t为迭代次数,通常有r≦n,k≦n,因此它的复杂度通常也用O(n)表示。
3.2前期工作
在开发程序之前,首先大量翻阅K-means算法相关资料,以求达到充分理解K-means算法的整个运算流程,根据C++的相关技术实现公式3.1中所达到的要求。
3.3关键技术
本系统是由C++和MFC技术在MicrosoftVisualStudio环境下开发完成的,下面将分别予以介绍。
3.3.1K-means算法
K-means算法是划分聚类算法的典型代表,实质上该算法基于簇中对象的平均值。
为了达到全局最优,基于划分的聚类会要求穷举所有可能的划分。
算法的处理过程如下:
算法的输入:
簇的数目k和数据库中的对象。
算法的输出:
使得平方误差准则最小的k个簇。
方法如下:
(1)从整个样本n中,任意选择k个对象作为初始的簇的中心mi(i=1,2,…k);
(2)利用公式3.2,计算数据集中的每个p到k个簇中心的距离d(p,mi);
(3)找到每个对象p的最小的d(p,mi),将p归入到与mi相同的簇中;
(4)遍历完所有对象之后,利用公式3.3重新计算mi的值,作为新的簇中心;
(5)重新将整个数据集中的对象赋给最类似的簇。
这个过程反复进行直至平方误差准则最小。
(3.2)
其中i=(xi1,xi2,…,xin)和j=(ji1,ji2,…,jin)是两个n维数据对象。
(3.3)
其中的mk代表第k个簇的簇中心,N代表第k个簇中数据对象的个数。
3.3.2相关技术介绍
C++语言发展大概可以分为三个阶段:
第一阶段从80年代到1995年。
这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。
当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
MFC,微软基础类(MicrosoftFoundationClasses),同VCL类似,是一种ApplicationFramework,随微软VisualC++开发工具发布。
目前最新版本为10.0(截止2011年3月),并且发布了中文版。
该类库提供一组通用的可重用的类库供开发人员使用。
大部分类均从CObject直接或间接派生,只有少部分类例外。
MFC是WinAPI与C++的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了很多程序开发人员在Windows下用C++&MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价,因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。
VisualStudio是微软公司推出的开发环境,VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件。
VisualStudio是目前最流行的Windows平台应用程序开发环境。
目前已经开发到10.0版本,也就是VisualStudio2010。
VisualStudio2008包括各种增强功能,例如可视化设计器(使用.NETFramework3.5加速开发)、对Web开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。
VisualStudio2008为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持AJAX的Web应用程序。
开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的Web应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问ASPNET应用程序服务和Microsoft平台。
4需求分析
4.1总体设计思想及设计原则
4.1.1设计思想
本设计的主要设计思想是根据用户在界面中输入的中心点个数n以及样本点个数m初始化数据,在用户输入各个样本点的过程中前n个样本点默认选取为中心点,在数据输入结束后,将数据传递到K-means算法的计算模块中,在经过计算模块计算得出最后结果,再将计算结果传递到输出模块中并显示计算结果,当用户点选绘图功能时,计算结果会被传递到绘图模块中,根据数据关系以坐标形式显示出来,并将在一个聚类中的数据用线连接起来,根据中心点的颜色和其他点颜色不同表现出其特征。
图4.1为本系统流程图。
图4.1系统流程图
在系统执行过程中每次输入数据会有相应提示,在输入样本点时会有一个列表来显示输入的数据的个数和已经输入的样本点。
系统应符合用户要求,满足用户的需要,并达到操作过程中的直观、方便、实用等要求。
系统采用整体化程序设计方法,程序一次性执行完成,显示结果简单明了。
4.1.2设计原则
系统主要实现内容为:
通过输入中心点以及样本点后,系统将结果直观返回给用户,并且能够根据结果绘图形象反映计算结果。
系统界面的总体设计原则为界面之间风格朴素、简洁大方、方便易操作。
4.2可行性分析
K-means聚类技术作为聚类算法中划分方法里面应用最广泛的一种方案,其发展相当成熟,大量数据和研究结果保证本系统能够顺利开发完成。
本系统主要运用MFC技术,充分的利用了在大学期间所学课程。
同时数学公式的算法清晰明了。
4.3系统开发工具及环境
本系统是由C++和MFC技术在MicrosoftVisualStudio环境下开发完成的。
5系统设计及实现
5.1系统构架
本系统主要由4个系统模块组成。
图5.1为系统模块图,下面将介绍各个模块功能。
图5.1系统模块图
数据输入模块:
本模块主要做为用户输入数据接口,根据提示输入中心点个数、样本点个数及具体样本点数据。
K-means算法计算模块:
本模块为本系统核心模块。
根据数据输入模块中传递的样本点及中心点数据进行K-means算法的聚类计算,并将计算结果返回给主系统。
结果输出模块:
在计算模块计算结束后,自动进入结果输出模块,主系统将计算模块返回的数据结果传递给输出模块,本模块根据数据通过列表输出最后的中心点信