聚类算法之层次聚类 (Hierarchical Clustering)

层次聚类是一种非常独特和强大的聚类方法,与众多其他的聚类技术相比,它不仅为数据集提供了一个划分,还给出了一个层次结构,这在某些应用中是非常有价值的。在生物信息学、社会网络分析、市场研究等领域,层次聚类方法被广泛采用,因为它们能够揭示数据的深层结构和关系。

图片[1]-聚类算法之层次聚类 (Hierarchical Clustering)-点头深度学习网站

1. 算法解读

层次聚类是一种树形方法,旨在建立一个分层的聚类结构。这种结构通常呈现为一个称为“树状图”(Dendrogram)的树形图,其中数据的每一项都位于树的叶子上,然后通过不断地合并或分裂,最终形成一个树形的聚类层次。

2. 步骤和细节

凝聚型 (Agglomerative):

开始: 每个数据点都是一个聚类,因此有N个聚类(其中N是数据点的数量)。

迭代:在每一步,找到最近的两个聚类并合并它们,因此聚类的数量减少一个。

结束:最后只剩下一个包含所有数据点的聚类。

分裂型 (Divisive):

开始: 所有数据点都属于一个大的聚类。

迭代:在每一步,选择一个聚类并将其分割为两个子聚类。

结束:最后每个数据点都成为自己的聚类。

3. 举例

假设我们有四种不同的物种:A、B、C和D,我们已经测量了它们在某些条件下的基因表达水平。我们的目标是使用层次聚类来探索这些物种之间的相似性,并了解它们之间的进化关系。

考虑我们有以下物种的基因表达数据:

物种A:[1, 2, 3]

物种B:[2, 3, 4]

物种C:[5, 6, 7]

物种D:[8, 9, 10]

我们希望基于这些基因表达数据来理解这四个物种之间的相似性。

凝聚性的流程如下:

步骤1:开始时,每个物种都被视为一个单独的聚类,即我们有四个聚类:{A}、{B}、{C}和{D}。

步骤2:计算每对聚类之间的距离。在这个例子中,我们可以计算每对物种基因表达数据之间的欧几里得距离。找到距离最近的两个聚类,并将它们合并为一个新的聚类。假设物种A和物种B的距离最近,我们将它们合并为一个新的聚类{A, B}。现在我们有三个聚类:{A, B}、{C}和{D}。

步骤3:继续计算新聚类与其他聚类之间的距离,并合并距离最近的两个聚类。假设{A, B}和{C}之间的距离最近,我们将它们合并为一个新的聚类{A, B, C}。现在我们有两个聚类:{A, B, C}和{D}。

步骤4:最后,我们将剩下的两个聚类{A, B, C}和{D}合并为一个聚类{A, B, C, D}。

通过这个过程,我们构建了一个树状图(Dendrogram),展示了这四个物种之间的相似性和层次结构,从而帮助我们理解它们的进化关系。

分裂性的流程如下:

步骤1:开始时,所有物种都属于一个大的聚类,即我们有一个聚类:{A, B, C, D}。

步骤2:选择一个聚类并将其分裂为两个子聚类。在这个例子中,我们可以使用一种方法(如k-means聚类)来确定如何将大聚类分裂。假设我们将{A, B, C, D}分裂为两个聚类:{A, B}和{C, D}。

步骤3:继续选择一个聚类并将其分裂。例如,我们可以进一步将{A, B}分裂为两个聚类:{A}和{B},同时,将{C, D}分裂为两个聚类:{C}和{D}。

步骤4:最后,每个物种都成为自己的聚类,即我们得到四个聚类:{A}、{B}、{C}和{D}。

通过这个过程,我们同样构建了一个树状图(Dendrogram),展示了这四个物种之间的相似性和层次结构,帮助我们理解它们的进化关系,但是这次是通过分裂的方式进行的。

代码示例:

我们可以使用Python的scipy库来演示层次聚类的凝聚型和分裂型方法。下面是一个简单的代码示例,展示了如何使用这两种方法进行层次聚类。

我们将演示凝聚型层次聚类:

import numpy as np

from scipy.cluster.hierarchy import dendrogram, linkage, cut_tree

import matplotlib.pyplot as plt

# 定义基因表达数据

data = np.array([

    [1, 2, 3],  # 物种A

    [2, 3, 4],  # 物种B

    [5, 6, 7],  # 物种C

    [8, 9, 10]  # 物种D

])

# 使用“ward”方法进行凝聚型层次聚类

linked = linkage(data, 'ward')

# 绘制树状图

plt.figure(figsize=(10, 7))

dendrogram(linked, labels=['A', 'B', 'C', 'D'])

plt.title('Agglomerative Hierarchical Clustering Dendrogram')

plt.xlabel('Species')

plt.ylabel('Euclidean distances')

plt.show()

4. 算法评价

优点:

动态聚类数:不需要预先指定聚类数,可以根据树状图切割得到任意数量的聚类。

解释性:通过层次结构,研究者可以更加直观地看到数据的层次和结构,从而获得更深入的洞察。

缺点:

计算复杂度:尤其是凝聚型方法,随着数据点数量的增加,计算复杂度急剧上升。

大数据集不友好:由于其高计算复杂度,不推荐在大数据集上使用。

5. 算法的变体

凝聚型 (Agglomerative):

凝聚型层次聚类有多种变体,这些变体主要基于不同的距离度量方法和链结标准来定义。以下是一些常见的变体:

最近邻链结(Single Linkage):

定义:最近邻链结法中,两个聚类之间的距离被定义为这两个聚类中最近两个点之间的距离。

优点:能够处理非球形的聚类和不同大小的聚类。

缺点:对噪声和异常点敏感,容易产生链状效应。

最远邻链结(Complete Linkage):

定义:最远邻链结法中,两个聚类之间的距离被定义为这两个聚类中最远两个点之间的距离。

优点:能够较好地处理噪声和异常点,减少链状效应。

缺点:倾向于生成大小相近的聚类,可能会忽略真实的聚类结构。

平均链结(Average Linkage):

定义:平均链结法中,两个聚类之间的距离被定义为这两个聚类中所有点对之间距离的平均值。

优点:综合了最近邻链结和最远邻链结的优点,适用于多种类型的数据集。

缺点:计算复杂度相对较高。

Ward链结(Ward’s Method):

定义:Ward链结法中,两个聚类合并后产生的方差增加值被用作这两个聚类之间的距离。

优点:通常能够生成较为均匀大小的聚类。

缺点:可能会忽略不同大小的真实聚类结构。

分裂型 (Divisive):

分裂型层次聚类较少使用,但在某些特定的应用中可能更有优势。其变体主要基于如何选择待分裂的聚类和如何进行分裂:

基于直径的分裂:

定义:选择直径(最远内部点之间的距离)最大的聚类进行分裂。

应用:适用于当聚类的直径差异较大时。

基于密度的分裂:

定义:选择点的密度(例如,点的数量或平均距离)最低的聚类进行分裂。

应用:适用于当聚类的密度差异较大时。

分裂型层次聚类虽然较少使用,但在特定应用中有其独特优势。例如,在生物信息学中,分裂型方法可用于基于基因表达模式的样本分类。此外,分裂型和凝聚型层次聚类可以相互补充,在某些情况下,结合使用这两种方法可能会得到更好的聚类结果。

与其他聚类算法的比较:

层次聚类与如k-means聚类等其他非层次聚类算法相比,有其独特之处。层次聚类不需要预先指定聚类数目,能够直观地通过树状图展示数据的层次结构,适合于探索性数据分析。但是,层次聚类的计算复杂度通常较高,可能不适合于大规模数据集。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容