1 `! ]' X! d* \. u5 e1) 从数据集中选择k个质心C1,C2,… ,Ck作为初始的聚类中心; + X: w0 i- W c7 p 9 L9 B$ ]8 C. f# w% P* p, m2) 把每个对象分配到与之最相似的聚合。每个聚合用其中所有对象的均值来代表,“最相似”就是指距离最小。对于每个点Vi,找出一个质心Cj,使它们之间的距离d(Vj,Cj)最小,并把Vi分配到第j组; j" n2 } \! y1 t4 Q0 M6 q+ p
D4 A/ U- E# J6 T0 \/ f1 ?3) 把所有的点都分配到相应的组之后,重新计算每个组的质心Cj; 3 ]# K, u9 t$ y0 V8 p# G& P9 H$ K' H+ c
4) 循环执行第2)步和第3)步,直到数据的划分不再发生变化。 . D9 Z: x% f4 H0 l+ b0 M" z/ { & d2 b% y" s! e该算法具有很好的可伸缩性,其计算复杂度为O(nkt),其中,t是循环的次数。K-means聚类算法的不足之处在于它要多次扫描数据库,此外,它只能找出球形的类,而不能发现任意形状的类。还有,初始质心的选择对聚类结果有较大的影响,该算法对噪声很敏感。) Q; b- y; a+ C# _$ X; O, K( s
( H# ]3 E! J6 n, g/ A
2. K-medoids算法 Z$ G8 ^1 w8 I% V# S" O+ R5 l. p 9 A+ K* l2 j$ n4 |& N2 fK-medoids算法的过程和上述k-means的算法过程相似,唯一不同之处是:k-medoids算法用类中最靠近中心的一个对象来代表该聚类,而k-means算法用质心来代表聚类。在k-means算法中,对噪声非常敏感,因为一个极大的值会对质心的计算带来很大的影响。而k-medoid算法中,通过用中心来代替质心,可以有效地消除该影响。/ K6 `) ], J- r$ j! n
* N3 o1 g# w$ d" A% y; Y6 _K-medoids算法首先随机选择k个对象,每个对象代表一个聚类,把其余的对象分别分配给最相似的聚类。然后,尝试把每个中心分别用其他非中心来代替,检查聚类的质量是否有所提高。若是,则保留该替换。重复上述过程,直到不再发生变化。 ! ?. V1 q( u7 q1 B) X& a( B% ]$ i! w ( J3 o# {- D7 V N常见的k-medoids算法有PAM(Partitioning Around Medoids)算法、CLARA(Clustering LARge Application)算法、CLARANS(Clustering LARge Application based upon Randomized Search)算法。当存在“噪声”和孤立点数据时,k-medoids算法比可k-means更健壮,这是因为中心点不像平均值那么容易被极端数据影响。但是,k-medoids算法的执行代价比k-means高。6 E3 h5 W! j% k4 F
: ^0 n. y& [, h( C o6 i! F总结:划分方法具有线性复杂度,聚类的效率高的优点。然而,由于它要求输入数字k确定结果簇的个数,并且不适合于发现非凸面形状的簇,或者大小差别很大的簇,所以这些启发式聚类方法对在中小规模的数据库中发现球状簇很适用。为了对大规模的数据集进行聚类,以及处理复杂形状的聚类,基于划分的方法需要进一步的扩展。1 O3 h8 A) }6 K( }2 N
1 ]# |2 p/ i; P6 E7 x% h9 W' Q1.2 层次方法(hierarchical method)) C/ g, g7 T7 {* w& |: ~3 M/ L7 ]
层次方法对给定数据对象集合进行层次的分解。根据层次的分解如何形成,层次的方法可以分为凝聚的和分裂的[30]。凝聚的方法,也称为自底向上的方法,一开始将每个对象作为单独的一个组,然后相继地合并相近的对象或组,直到所有的组合并为一个(层次的最上层),或者达到一个终止条件。分裂的方法,也称为自顶向下的方法,一开始将所有的对象置于一个簇中,在迭代的每一步中,一个簇被分裂为更小的簇,直到最终每个对象在单独的一个簇中,或者达到一个终止条件。 ( C9 ^5 w9 g- E, k: n. g$ Q! U1 l2 t5 y
主要的凝聚聚类算法有CURE,CHAMELEON,BIRCH,ROCK等。 9 P" k( w+ T7 _4 `- p 0 j `6 r; m2 P" g+ H1.BIRCH算法% i2 Z+ l7 u8 C
. z% Y7 d; C% J
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)算法使用了一种叫做CF-树(聚类特征树,即Clustering Feature Tree)的分层数据结构,来对数据点进行动态、增量式聚类。CF-树是存储了层次聚类过程中的聚类特征信息的一个加权平衡树,树中每个节点代表一个子聚类,并保持有一个聚类特征向量CF。每个聚类特征向量是一个三元组,存储了一个聚类的统计信息。聚类特征向量中包含了一个聚类的三个统计信息:数据点的数目N,这N个数据点的线性和,以及这N个数据点的平方和SS。一个聚类特征树是用于存储聚类特征CF的平衡树,它有两个参数:每个节点的最大子节点数和每个子聚类的最大直径。当新数据插入时,就动态地构建该树。与空间索引相似,它也用于把新数据加入到正确的聚类当中。 % j! G1 e# o i7 ]; b, Z. i0 ?" b! m
BIRCH算法的主要目标是使I/0时间尽可能小,原因在于大型数据集通常不能完全装入内存中。BIRCH算法通过把聚类分为两个阶段来达到此目的。首先通过构建CF-树对原数据集进行预聚类,然后在前面预聚类的基础上进行聚类。4 L" B- Z& L7 Y, u( Z
/ I; X8 y; X5 p8 j i3 [
2.CURE算法 ], j! W6 I J0 u) \% I9 n % H* i9 b2 h4 `& ECURE(Clustering Using Representative)算法选择基于质心和基于代表对象方法之间的中间策略。它不用单个质心或对象来代表一个簇,而是选择数据空间中固定数目的具有代表性的点。针对大型数据库,CURE采用随机取样和划分两种方法的组合:一个随机样本首先被划分,每个划分再被部分聚类。 6 K$ H$ z8 @: l9 [2 v n2 h ( L5 X* {" f6 j8 W+ C; c4 _) J! f3 }3.ROCK算法: z7 L5 h! T$ @& T$ T' c
$ Y h0 {! B; p) A6 [+ G8 D! dCURE算法不能处理枚举型数据,而ROCK算法是在CURE基础之上适用于枚举数据的聚结分层聚类算法。通过把两个聚类的聚集相互连接度(aggregate interconnectivity)与用户定义的静态相互连接模型相比较,从而度量两个聚类之间的相似度。其中,两个聚类的相互连接度是指两个聚类之间的交叉连接数目,而连接link(pi,pj)是指这两点之间的共同邻居数。换句话说,聚类相似度是用不同聚类中又共同邻居的点的数目来确定的。 5 f% D9 q _2 F3 m. b; w 1 O, J! `4 R8 xROCK算法首先用相似度阀值和共同邻居的概念,从给定的数据相似度矩阵中构建一个稀疏图,然后对该稀疏图使用分层聚类算法进行聚类。 + i& L9 f' E/ q- [! W8 O" f: d9 N6 G+ v3 F
4.Chameleon算法 * W9 z, s: S+ y% C; t ) P7 j D$ P" g" Q/ YChameleon(变色龙)是一个利用动态模型的层次聚类算法。算法思想是:首先通过一个图划分算法将数据对象聚类为大量相对较小的子聚类,然后用一个凝聚的层次聚类算法通过反复地合并子类来找到真正的结果簇。它既考虑了互连性,又考虑了簇间的近似度,特别是簇内部的特征,来确定最相似的子簇[31]。 # @% M1 `- v( }. |' ]* D+ B2 T* W( s% e- I. Y( q$ n, U4 s3 I6 }
Chameleon跟CURE和DBSCAN相比,在发现高质量的任意形状的聚类方面有更强的能力。但是,在最坏的情况下,高维数据的处理代价可能对n个对象需要O(n2)的时间。 1 b$ ^( Q$ y W0 o+ E9 n' s) r; i3 _" V7 C1 H5 C. r8 m
总结:层次的方法的缺陷在于,一旦一个步骤(合并或分裂)完成,它就不能被撤消,该技术的一个主要问题是它不能更正错误的决定。有两种方法可以改进层次聚类的结果:(a)在每层划分中,仔细分析对象间的“联接”,例如CURE中的做法。(b)综合层次凝聚和迭代的重定位方法。首先用自底向上的层次算法,然后用迭代的重定位来改进结果。0 K; a0 W' d" @; l+ E- j9 p8 d