层次聚类算法(Hierarchical Clustering Algorithm)是一种常用的无监督学习算法,用于将数据集划分成多个不同层次的簇。与K均值聚类不同,层次聚类不需要预先指定聚类数量,而是通过计算样本之间的相似度或距离来构建一个层次结构。下面将详细介绍层次聚类算法的基本思想、原理以及Python代码实现。
基本思想
层次聚类算法的基本思想是将数据集构建成一个层次结构,其中每个样本最初表示为一个单独的簇,然后通过计算样本之间的相似度或距离来逐渐将簇合并成更大的簇。整个过程可以表示为一棵树形结构,称为聚类树或者树状图。通过该树状图,我们可以选择合适的切割点来确定最终的聚类结果。
原理
层次聚类算法通常有两种主要的方法:凝聚(自底向上)和分裂(自顶向下)。
凝聚层次聚类(Agglomerative Hierarchical Clustering)
凝聚层次聚类从每个样本作为一个单独的簇开始,然后在每个步骤中合并最相似的簇,直到达到所需的聚类数或者只剩下一个簇。该算法的主要步骤如下:
- 初始化:将每个样本视为一个簇。
- 计算相似度/距离:根据某种相似度或距离度量方法计算任意两个样本之间的相似度或距离。
- 合并:合并相似度/距离最小的簇,形成新的簇。
- 更新相似度/距离矩阵:根据实际合并情况更新相似度/距离矩阵。
- 重复:重复步骤3和4,直到只剩下一个簇或达到所需的聚类数。
分裂层次聚类(Divisive Hierarchical Clustering)
分裂层次聚类从所有样本作为一个簇开始,然后在每个步骤中选择一个簇并将其分裂成更小的簇,直到达到所需的聚类数或者每个簇包含一个样本。该算法的主要步骤如下:
- 初始化:将所有样本视为一个簇。
- 计算相似度/距离:根据某种相似度或距离度量方法计算任意两个样本之间的相似度或距离。
- 选择簇:选择一个需要分裂的簇,通常是其中包含样本数最多的簇。
- 分裂:将选择的簇分裂成更小的簇,形成新的簇。
- 更新相似度/距离矩阵:根据实际分裂情况更新相似度/距离矩阵。
- 重复:重复步骤3~5,直到达到所需的聚类数或每个簇只包含一个样本。
Python代码实现
下面是一个使用凝聚层次聚类算法进行聚类的Python代码实现示例:
import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram
# 生成样本数据
np.random.seed(0)
X = np.random.randn(100, 2)
# 使用凝聚层次聚类算法进行聚类
Z = linkage(X, method='average', metric='euclidean')
# 可视化聚类结果的树状图(聚类图)
dendrogram(Z)
# 输出最终的聚类结果
clusters = np.array([i for i in range(1, len(X) + 1)])
print("簇标签:")
print(clusters)
总结
层次聚类算法是一种常用的无监督学习算法,通过构建一个层次结构来划分数据集。凝聚层次聚类将样本逐渐合并成更大的簇,而分裂层次聚类则是将整个数据集分裂成更小的簇。这两种方法都可以根据实际问题选择合适的算法来进行聚类。