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

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

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

DALL·E 2023-11-22 14.23.51 - Illustration of a hierarchical clustering dendrogram in a 6x5 format. This wide graph should depict a tree-like structure with branches connecting var

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

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 层次聚类是一种无监督学习算法,它可以将数据集中的样本分成具有相似性的若干个簇。以下是使用Python实现层次聚类算法的示例代码: ``` import numpy as np from scipy.spatial.distance import pdist from scipy.cluster.hierarchy import dendrogram, linkage # 生成一个样本数据集 X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]) # 计算距离矩阵 dist_matrix = pdist(X) # 使用“ward”方法进行层次聚类 Z = linkage(dist_matrix, 'ward') # 生成树状图 dendrogram(Z) # 显示树状图 import matplotlib.pyplot as plt plt.show() ``` 在上面的代码中,我们首先生成了一个样本数据集,然后使用`pdist`函数计算距离矩阵。接着,我们使用`linkage`函数使用“ward”方法进行层次聚类。最后,我们使用`dendrogram`函数生成树状图并使用`matplotlib`库显示出来。 需要注意的是,由于层次聚类算法的时间复杂度较高,因此对于大规模数据集的应用,可能需要使用其他更加高效的算法。 ### 回答2: 层次聚类是一种聚类算法,其主要目标是将数据样本分成不同的组或类。它的实现方式在Python中可以使用scikit-learn或者其他机器学习库来完成。 在Python中,一个常用的层次聚类算法实现方法是使用scikit-learn库中的AgglomerativeClustering类。该类需要指定聚类的参数,例如聚类的数量或者距离度量方式。下面是一个简单的示例代码: ```python from sklearn.cluster import AgglomerativeClustering import numpy as np # 生成示例数据 X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]) # 定义层次聚类模型并拟合数据 model = AgglomerativeClustering(n_clusters=2) model.fit(X) # 输出每个数据点所属的聚类编号 print(model.labels_) ``` 在上面的代码中,首先导入必要的库,然后生成示例数据X。接下来定义一个AgglomerativeClustering对象,并指定聚类的数量为2。然后调用fit函数拟合数据。 最后输出每个数据点所属的聚类编号。这里将输出一个长度为6的数组,代表每个数据点属于哪个聚类。 以上是层次聚类算法在Python中的一种实现方式。你可以根据自己的需求选择其他合适的聚类算法和库,根据数据的特点进行调整、优化和评估。 ### 回答3: 层次聚类算法Hierarchical Clustering)是一种基于距离的聚类算法,通过逐步合并样本或聚类,构建一个树状结构,最终将所有样本或聚类划分为不同的簇。在Python中,可以使用scikit-learn库中的AgglomerativeClustering来实现层次聚类算法。 步骤如下: 1. 导入必要的库: ``` from sklearn.cluster import AgglomerativeClustering ``` 2. 准备数据: ``` X = [[1, 2], [3, 4], [1, 4], [2, 2], [3, 3]] ``` 3. 创建层次聚类对象: ``` agg_clustering = AgglomerativeClustering(n_clusters=2) ``` 4. 进行聚类: ``` labels = agg_clustering.fit_predict(X) ``` 5. 输出结果: ``` print(labels) ``` 这样就可以得到每个样本所属的簇的标签。层次聚类算法基于距离计算,通过不断合并样本或聚类,构建出一个树状结构。在这个树状结构中,可以根据需要选择合适的层次作为最终的聚类结果。 总结一下,层次聚类算法是一种基于距离的聚类算法,通过逐步合并样本或聚类,构建一个树状结构,将所有样本或聚类划分为不同的簇。在Python中,可以使用scikit-learn库中的AgglomerativeClustering来实现该算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值