层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足为止。具体又有凝聚的 (agglomerative) 和分裂的 (divisive) 两种策略。
1、凝聚的层次聚类
这是一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终结条件被满足,绝大多数层次聚类方法属于这一类,其区别仅在于簇间相似度的选择上有所不同。
2、分裂的层次聚类
这个策略与凝聚的层次聚类相反的,为自顶向下的策略,它首先将所有对象放置在同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。 层次凝聚的代表是AGNES (AGglomerative NESting) 算法,层次分裂的代表是DIANA (DIvisive ANAlysis) 算法。图10-15描述了对5个数据对象进行层次聚类计算过程。
最初, AGNES将每个对象作为一个簇,然后根据某种准则 (簇间距离最近或簇间相似度最大),将这些簇一步一步地合并成较大的簇。例如,如果簇
与簇
之间的距离,比其他任意两个簇的距离都小,则将
和
合并为一个簇。合并后的簇与其他簇同等看待,继续寻找簇间距离最小的两个簇,并将其合并,直到所有的对象最终都在一个簇中。 在DIANA算法的处理过程中,所有的对象开始都放在一个簇中,然后根据某种原则将该簇分裂,其分裂过程反复进行,直到每个新的簇只包含一个对象为止。
1、算法描述
AGNES算法是一个典型的凝聚层次聚类方法:最初将每个对象作为一个簇,再根据某种准则 (簇间距离或相似度),将这些簇逐渐合并成较大的簇,直到所有数据对象都在同一个簇或簇数达到用户指定数目。 簇的凝聚准则可以选择簇间最短距离、最长距离、中心距离和平均距离等。以下算法采用簇间中心距离为目标函数。
算法10-5 AGNES算法 (凝聚层次算法) 输入:数据集
和正整数
(簇的数目) 输出:含
个簇的一个聚类
(1)将
的每个对象当成一个初始簇,形成初始聚类
(2)REPEAT (3) 找出中心距离最近的两个簇 (4) 合并这两个簇,并生成新的聚类
(5)UNTIL簇的数目等于
2、计算实例
例10-5 设
为有8个数据对象的数据集
(表10-5),用户需要的簇数
。试用AGNES算法对其进行划分聚类。
解:首先将表10-15各个点的位置在二维平面给出。如下图10-17。
根据算法10-5,因为
有8个数据对象,因此,刚开始每个对象为一个簇,详见下表10-6。
计算步骤 | 最近距离 | 最近的两个簇 | 合并后的簇 | 簇的个数 |
---|---|---|---|---|
0 | — | — | { X 1 } , { X 2 } , { X 3 } , { X 4 } , { X 5 } , { X 6 } , { X 7 } , { X 8 } \{X_1\},\{X_2\},\{X_3\},\{X_4\},\{X_5\},\{X_6\},\{X_7\},\{X_8\} {X1},{X2},{X3},{X4},{X5},{X6},{X7},{X8} | 8 |
1 | 1 | { X 1 } , { X 2 } \{X_1\},\{X_2\} {X1},{X2} | { X 1 , X 2 } , { X 3 } , { X 4 } , { X 5 } , { X 6 } , { X 7 } , { X 8 } \{X_1,X_2\},\{X_3\},\{X_4\},\{X_5\},\{X_6\},\{X_7\},\{X_8\} {X1,X2},{X3},{X4},{X5},{X6},{X7},{X8} | 7 |
2 | 1 | { X 3 } , { X 4 } \{X_3\},\{X_4\} {X3},{X4} | { X 1 , X 2 } , { X 3 , X 4 } , { X 5 } , { X 6 } , { X 7 } , { X 8 } \{X_1,X_2\},\{X_3,X_4\},\{X_5\},\{X_6\},\{X_7\},\{X_8\} {X1,X2},{X3,X4},{X5},{X6},{X7},{X8} | 6 |
3 | { X 1 , X 2 } , { X 3 , X 4 } \{X_1,X_2\},\{X_3,X_4\} {X1,X2},{X3,X4} | { X 1 , X 2 , X 3 , X 4 } , { X 5 } , { X 6 } , { X 7 } , { X 8 } \{X_1,X_2,X_3,X_4\},\{X_5\},\{X_6\},\{X_7\},\{X_8\} {X1,X2,X3,X4},{X5},{X6},{X7},{X8} | 5 | |
4 | 1 | { X 5 } , { X 6 } \{X_5\},\{X_6\} {X5},{X6} | { X 1 , X 2 , X 3 , X 4 } , { X 5 , X 6 } , { X 7 } , { X 8 } \{X_1,X_2,X_3,X_4\},\{X_5,X_6\},\{X_7\},\{X_8\} {X1,X2,X3,X4},{X5,X6},{X7},{X8} | 4 |
5 | 1 | { X 7 } , { X 8 } \{X_7\},\{X_8\} {X7},{X8} | { X 1 , X 2 , X 3 , X 4 } , { X 5 , X 6 } , { X 7 , X 8 } \{X_1,X_2,X_3,X_4\},\{X_5,X_6\},\{X_7,X_8\} {X1,X2,X3,X4},{X5,X6},{X7,X8} | 3 |
6 | 1 | { X 5 , X 6 } , { X 7 , X 8 } \{X_5,X_6\},\{X_7,X_8\} {X5,X6},{X7,X8} | { X 1 , X 2 , X 3 , X 4 } , { X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4\},\{X_5,X_6,X_7,X_8\} {X1,X2,X3,X4},{X5,X6,X7,X8} | 2 |
811
721
63
541
451
361
2
初始步,每个对象为一个簇
。
第1步、为方便使用簇间中心距离平方。此例开始时有8个簇,共需计算28个簇间距离平方。但仅有
而其它对象之间的中心距离平方,如
等都大于1。 由于有多个簇间中心距离最小且相等。因此,按照数据对象坐标编号小者顺序优先合并,即选择
合并为
。 即得7个簇
第2步、重新计算簇
的中心点为
,并增加计算
与
的距离平方。
,其它
等都大于1.25。因
,故簇
和
合并为
,见表10-6计算步骤2所在的行。
第3步、重新计算簇
的中心点为
,并增加计算
与
的距离平方。
,且
更大。因此簇
和
合并为
,见表10-6计算步骤3所在的行。
第4步、重新计算簇
的中心点为
,并增加计算
与
的距离平方。
,且
更大。而
,因此簇
和
合并为
,见表10-6计算步骤4所在的行。
第5步、重新计算簇
的中心点为
,并增加计算
与
的距离平方。
,
而
。因此簇
和
合并为
,见表10-6计算步骤5所在的行。
第6步、重新计算簇
的中心点为
,并增加计算
与
的距离平方。
而
。因此簇
和
合并为
,见表10-6计算步骤6所在的行。
由于合并后的簇的数目
已经达到用户输入的终止条件,程序结束。
3、算法的性能分析
AGNES算法思想比较简单,但经常会因为出现多个簇间距离相等的情况,这时究竟选择哪两个簇优先合并是非常关键的,但又是比较困难的。因为两个簇合并的决定一经做出,以后的处理只能在新生成的簇上进行,即使后来发现聚类效果不好,但前面已经做过的合并处理却不能撤销,而每个簇之间又不能交换对象。即如果在某一步对簇进行合并时没有选择恰当,最终可能导致低质量的聚类结果。 AGNES算法的时间复杂性为
,因为对
个对象的数据集,算法必须计算所有对象两两之间的距离,其乘法计算量就达到
。此外,因为刚开始的时候就有
个簇,如果最后以1个簇结束,则主循环中有
次迭代,在第
次迭代中,我们必须在
个簇中找到最靠近的两个簇进行合并。因此,这种聚类方法不具有很好的可伸缩性,即该算法在
很大的情况就不是很适用。
1、算法描述
DIANA算法属于分裂的层次聚类。它的计算思路与凝聚的层次聚类方法相反,采用一种自顶向下的分裂策略。它首先将所有对象置于一个簇中,然后逐渐将其细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终结条件,例如达到了用户希望的簇数目,或者是两个最近簇之间的距离超过了指定的某个阈值等。 在DIANA算法的处理过程中,刚开始将所有的对象都放在一个簇中,然后根据一定的评价函数将其分裂为两个子簇,其中一个叫原始 (original) 簇,简记为
,另一个叫分裂 (split或divisive) 的子簇,记作
,再从中找出最应该被分裂 (比如,直径最大) 的子簇将其分裂为两个子簇,重复进行这个分裂过程,直到每个子簇中仅包含一个对象,或者已经达到用户指定的终止条件。 与AGNES算法类似,用户可以在DIANA聚类算法中指定簇的数目
作为算法的一个结束条件。因此,根据算法10-2 (划分聚类算法框架),我们可以得到DIANA算法的详细计算步骤。
算法10-6 DIANA算法 (分裂层次算法) 输人:数据对象集
和正整数
(簇的数目) 输出:含
个簇的聚类
(1)将
作为聚类的唯一初始簇,即聚类
(2)FOR
(3)在聚类
中挑出具有最大直径的簇记作
。且令
(4)计算簇
中每个点到其余点的平均距离,找出具有最大平均距离的一个点
,并令
(5)REPEAT (6)从
中任取一点
,计算
到
的最小距离
(7)计算
到
的最小距离,并记
是取得最小距离的点 (8)若
,则将
从
分裂出去,并分配给
,即令
(9)UNTIL集合
中没有新的点可以分配给
(10)将簇
、簇
和
中未被分裂的簇共同组成新的聚类
(11)END FOR
2、计算实例
例10-6 设
为有8个数据对象的数据集 (例10-5的表10-5),用户需要的簇数
。试用DIANA算法对其进行划分聚类。
解:根据算法10-6,因为
有8个数据对象,因此,刚开始所有对象作为一个簇
。详见下表10-7计算步骤0对应的行。
计算步骤 | 最大直径的簇 | C o C_o Co | C s C_s Cs | 簇个数k |
---|---|---|---|---|
0 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | — | 1 |
1 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X2,X3,X4,X5,X6,X7,X8} | { X 1 } \{X_1\} {X1} | 1 |
2 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_3,X_4,X_5,X_6,X_7,X_8\} {X3,X4,X5,X6,X7,X8} | { X 1 , X 2 } \{X_1,X_2\} {X1,X2} | 1 |
3 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 4 , X 5 , X 6 , X 7 , X 8 } \{X_4,X_5,X_6,X_7,X_8\} {X4,X5,X6,X7,X8} | { X 1 , X 2 , X 3 } \{X_1,X_2,X_3\} {X1,X2,X3} | 1 |
4 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 5 , X 6 , X 7 , X 8 } \{X_5,X_6,X_7,X_8\} {X5,X6,X7,X8} | { X 1 , X 2 , X 3 , X 4 } \{X_1,X_2,X_3,X_4\} {X1,X2,X3,X4} | 1 |
5 | { X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } \{X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8\} {X1,X2,X3,X4,X5,X6,X7,X8} | { X 5 , X 6 , X 7 , X 8 } \{X_5,X_6,X_7,X_8\} {X5,X6,X7,X8} | { X 1 , X 2 , X 3 , X 4 } \{X_1,X_2,X_3,X_4\} {X1,X2,X3,X4} | 2 |
簇个数k0
—11
12
13
14
15
2
初始步:为将
中分裂成两个簇,要计算每个对象
到其它对象
的平均相异度。
第一轮循环 (FOR h=1) 时,
由于
取得最大平均距离,按照对象下标编号小者优先的原则,将
从
中分裂出去,并分配给
,即得
,
。
内循环REPEAT 包括以下4个步骤: 第1步(1)从
中取一点
,计算它到
最小距离,经计算可得
; (2)计算点
到
中其它点的最小距离,即有
; (3)因
,所以将
从
中分裂出去,并分配给
,即得
,
。 第2步 把
从
中分裂出去,并分配给
,即得
,
。 第3步(1)从
取一点
,计算它到
最小距离,经计算可得
; (2)计算点
到
中其它点的最小距离,即有
; (3)因
,因此把
从
中分裂出去,并分配给
,即得
,
。 第4步 按照上面方法,分别计算
到
的最小距离
,但有
,即
中没有点需要分裂出去分配给
;至此,得到聚类
。
由于
,因此算法结束并输出聚类
,将其与图10-17比较可以发现,这个聚类结果还是相当令人满意的。但是,如果在例10-6中指定
,则算法需要进入第二轮和第三轮循环。
第二轮循环 (FOR h=2),得聚类
第三轮循环 (FOR h=3),得聚类
。
即DIANA算法得到了包括4个簇的聚类,算法结束。将以上结果与图10-17比较发现,虽然DIANA算法得到了包括4个簇的聚类,但这个聚类
显得很不靠谱,这个例子进一步说明,DIANA算法对k值的选取也是敏感的。
3、算法的性能分析
DIANA算法与AGNES算法一样,其时间复杂性为
,因为对有
个数据对象的数据集,算法也必须计算所有对象两两之间的距离,其乘法计算量就达到
。因此,这种聚类方法同样不具有很好的可伸缩性,即该算法在
很大的情况就不是很适用。
密度聚类方法的指导思想是,只要一个区域中对象的密度大于某个域值,就把它加到与之相近的簇中去。这种算法可发现任意形状的簇,对噪声数据也不敏感。 DBSCAN (Density Based Spatial Clustering of Applications with Noise) 是基于密度的聚类算法代表,且是一种部分聚类算法,即聚类
中所有簇的并集不能覆盖数据集
本身。
定义10-2 给定一个对象集
和实数
,则对于任意
,称
为
在
中的
-邻域,简称
的
-邻域。
显然,如果
为在平面上有20个对象的集合,且距离函数采用欧几里距离,则
的
-邻域是以
为中心,
为半径的圆内所有对象构成。对于图10-19所示的数据集
,其
的
-邻域就由圆内 (含圆周上) 的8个深色点构成。另外,如果在定义10-2中采用的距离函数
不同,则
在
中的
-邻域
也会不同。比如,当
选用切比雪夫距离时,
确定的区域就是一个矩形而不是圆形。因此,我们一般应该根据实际问题的特点选用合适的距离函数。
定义10-3 对于给定的实数
和正整数
,称 (
,
) 是为
指定的一个密度,简称 (
,
) 为密度。
在DBSCAN算法中,密度 (
,
) 专门用于刻画一个簇中对象的密集程度,为此引入核心对象的概念。
定义10-4 对给定的密度 (
,
) 和任意
,若
,则称
是
关于密度 (
,
) 的一个核心点,简称
为核心点 (对象)。
例10-7 假设给定
,
,则图10-19中的点
就是
的一个核心对象。但如果指定
,即使
取值不变,
也不再是
的核心点了。
定义10-5
,若
是一个核心点且
,则称点
从
出发关于
是直接密度可达的,简称从
到
是直接密度可达的。
例10-8 根据定义10-5,下图10-20中的对象
从
出发关于
是直接密度可达的,即从
到
是直接密度可达的。然而,从
到
就不是直接密度可达的。
定义10-6 如果
存在一个对象链
,且从
到
是直接密度可达的,则称从
到
是密度可达的。
例10-9 对包含21个点的平面数据集
(图10-21),如果密度参数
且
,请说明从
到
关于
是密度可达的。
定义10-7 对于任意
,如果存在
,使从
到
,从
到
都是关于
密度可达的,则称
和
关于
是密度相连的。
定义10-8 设有对象集
,若它的非空子集
满足以下条件: (1)对于任意
,如果
,且从
到
关于
是密度可达的,则
; (2)对于任意
,则
和
关于
是密度相连的,则称
是一个关于密度
的簇,简称
是基于密度的簇。
从定义10-8可知,一个基于密度的簇是基于密度可达性的最大的密度相连对象的集合。
定义10-9 对于任意
,若
不是关于密度
的核心点,但存在核心点
,使
,则称
为
边界点。
定义10-10 对于意
,如果
既不是关于密度
核心点,也不是边界点,则称
为
关于密度
“噪声”点,简称
为
的噪声点。
从定义10-10可知,
的一个对象
是否为噪声点,完全与给定的密度
相关。一般地说,若
关于
为噪声点,则只要让
足够大,或适当减小
,就可以使
不再是噪声点。
根据以上定义,我们可以得出以下两个有用的定理。
定理10-1 对于任意
,如果
是一个核心点,即
,则集合
称为
上一个关于密度
的簇。
此定理其实是一个关于密度
的簇的生成方法,即由核心对象
及其所有从
密度可达对象
所构成的集合,就是一个关于密度
的簇,我们将其称为由核心对象
生成的簇。
定理10-2 设
为一个关于密度
的簇,
,则
此定理进一步说明,一个关于密度
的簇
,都等同于它的任一核心对象
生成的簇。
DBSCAN算法通过检查数据集
中每个点
的
-邻域
来寻找一个由
生成的簇。对于每一个
,如果有
,则创建一个以
为核心点的新簇,并将从
密度可达的所有对象并入这个新簇,直到没有任何新的点可以添加到这个簇时,才开始检查
中下一个点,直到
中的每个点都已经检查完毕。
算法10-7 DBSCAN算法 输入:数据对象集
和密度
输出:达到密度要求的聚类
(1)
(2)REPEAT (3)从数据集
中抽取一个未处理过的对象
(4)如果
是核心对象且名,不在
的任何簇中,则将
连同从它出发密度可达的所有对象形成簇
,并令
(5)否则转第 (2) 步 (6)UNTIL所有对象都被处理
例10-10 设数据集
共有12个对象,密度
。试用DBSCAN算法对其进行聚类。
解:将12个对象及其相对位置展示在平面上 (图10-25)。
按照算法步骤,依次选择
中的点
,并检查它是否为关于密度
的核心点,如果是则将
以及所有从它密度可达的点形成一个新簇。其详细计算过程描述如下。 第1步,在
中选择一点
,由于以
为中心,
半径的圆内仅包含2个点
,即
,因此它不是核心点,继续选择下一个点。 第2步,在
中选择一点
,它也不是核心点,继续选下一个点。 第3步,在
中选择一点
,它也不是核心点,继续选下一个点。 第4步,在
中选择一点
,由于以
为中心,
为半径的圆内仅包含5个点
,即
,因此它是关于密度
的一个核心点,寻找从它出发密度可达的点,其中直接密度可达4个,密度可达3个,因此,得到以核心点
出发密度可达的所有对象形成的簇,记作
。按算法步骤继续选择下一个点。 第5步,在
中选择一点
,由于
已在簇
中,因此无需判断是否为核心点,继续选择下一个点。 类似地,依次选择一点
,其计算结果汇总于下表。
DBSCAN需要对数据集中的每个点进行考察,通过检查每个点的
-邻域来寻找聚类。如果某个点
为核心对象,则创建一个以该点
为核心对象的新簇,该簇包括核心对象
以及从
出发密度可达的所有点。如果
中有
对象,则其时间复杂性是
。 DBSCAN算法将达到或超过密度
生成的区域划分为簇,并可以在带有“噪声”的数据集中发现任意形状的簇,形成
的一个部分聚类。 说明:DBSCAN算法对用户定义的密度
参数是敏感的,即
和
的设置将直接影响聚类的效果。如果两个参数的设置稍有不同,就可能导致完全不同的聚类结果。