您的位置:首页 > 其它

层次聚类--凝聚(自底向上)和分裂(自顶向下)

2015-03-10 15:26 1046 查看

1、概念

层次聚类就是对数据集采用某种方法逐层地进行分解或者汇聚,直到分出的最后一层的所有的类别数据满足要求为止。所以按照分解或者汇聚的原理的不同,层次聚类可以分为凝聚(agglomerative)和分裂(divisive)两种方法。

K-means和k-medias都是划分的聚类算法,而层次聚类就是要把数据自顶向下分裂成或者自底向上合并成一棵树。层次聚类涉及到嵌套聚类,嵌套聚类是指一个聚类中R1包含了另一个R2,那这就是R2嵌套在R1中,或者说是R1嵌套了R2。具体说怎么算嵌套呢?聚类R1={{x1,x2},{x3},{x4,x5}嵌套在聚类R2={{x1,x2,x3},{x4,x5}}中,但并不嵌套在聚类R3={{x1,x4},{x3},{x2,x5}}中,即R2的每一个子类都包含R1中对应的子类。层次聚类算法产生一个嵌套聚类的层次,算法最多包含N步,在第t步,执行的操作就是在前t-1步的聚类基础上进行合并或者分裂而生成新聚类。



2、凝聚(agglomerative)层次聚类

凝聚的层次聚类是一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终结条件被满足,绝大多数层次聚类方法属于这一类,它们只是在簇间相似度的定义上有所不同。

3、分裂(divisive)层次聚类

分裂的层次聚类与凝聚的层次聚类相反,采用自顶向下的策略,它首先将所有对象置于同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。该种方法一般较少使用。

4、类间距离计算

在上述第三步中,凝聚的层次聚类要找到距离最近的子类(样本点对),分裂的层次聚类要找到距离最远的子类(样本点对),其中距离的计算可以采用不同的方法,主要有如下几种:
(1)minimum 方法
类间距离等于两类对象之间的最小距离,若用相似度衡量,则是各类中的任一对象与另一类中任一对象的最大相似度。
(2)maximum 方法
类间距离等于两组对象之间的最大距离。

(3)average方法
类间距离等于两组对象之间的平均距离。

(4)UCLUS方法
该方法为average方法的一个变种,
它使用的是median距离,,在受异常数据对象的影响方面, 它要比平均距离表现更佳一些.。

5、举例

令g(Ci,Cj)为所有可能的X聚类对的距离函数,此函数用于测量两个聚类之间的近邻性,用t表示当前聚类的层次级别。通用合并算法的伪码描述如下:

1. 初始化:

a) 选择C0={{x1},…,{xN}}

b) 令t=0

2. 重复执行以下步骤:

a) t=t+1

b) 在Ct-1中选择一组(Ci,Cj),满足


c) 定义Cq=Ci U Cj,并且产生新聚类Ct=(Ct-1-{Ci,Cj}) U {Cq}

3 . 直到所有向量全被加入到单一聚类中。

这一方法在t层时将两个向量合并,那么这两个向量在以后的聚类过程中的后继聚类都是相同的,也就是说一旦它们走到一起,那么以后就不会再分离……(很专一哦O(∩_∩)O~)。这也就引出了这个算法的缺点,当在算法开始阶段,若出现聚类错误,那么这种错误将一直会被延续,无法修改。在层次t上,有N-t个聚类,为了确定t+1层上要合并的聚类对,必须考虑(N-t)(N-t-1)/2个聚类对。这样,聚类过程总共要考虑的聚类对数量就是(N-1)N(N+1)/6,也就是说整个算法的时间复杂度是O(N3)。

例如令X={x1, x2, x3, x4, x5},其中x1=[1, 1]T, x2=[2, 1]T, x3=[5,4]T, x4=[6, 5]T, x5=[6.5, 6]T。那么合并算法执行的过程可以用下面的图来表示。





P(X)是不相似矩阵

该算法从核心过程上来讲,就是先计算出数据集中向量之间的距离,记为距离矩阵(也叫不相似矩阵)。接着通过不断的对矩阵更新,完成聚类。矩阵更新算法的伪码描述如下:

1. 初始化:

a) C0={{x1},…,{xN}}

b) P0=P(X) (距离矩阵)

c) t=0

2. 重复执行以下步骤:

a) t=t+1

b) 合并Ci和Cj为Cq,这两个聚类满足d(Ci,Cj)=minr,s=1,…,N,r≠sd(Cr,Cs)

c) 删除第i和j行,第i和j列,同时插入新的行和列,新的行列为新合并的类Cq与所有其他聚类之间的距离值

3. 直到将所有向量合并到一个聚类中

大家可以看到,层次聚类算法的输出结果总是一个聚类,这往往不是我们想要的,我们总希望算法在得到我们期望的结果后就停止。那么我们如何控制呢?常用的做法就是为算法限制一个阈值,矩阵更新过程中,总是将两个距离最近的聚类合并,那么我们只要加入一个阈值判断,当这个距离大于阈值时,就说明不需要再合并了,此时算法结束。这样的阈值引入可以很好的控制算法结束时间,将层次截断在某一层上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: