层次聚类(Hierarchical Clustering)是一种常用的聚类算法,它的主要思想是通过计算样本之间的相似性或距离,将样本逐步合并形成一棵层次化的聚类树。层次聚类算法可以分为两种类型:凝聚型(Agglomerative)和分裂型(Divisive)。 凝聚型层次聚类是从每个样本作为一个独立的聚类开始,然后通过合并相似的聚类逐渐形成更大的聚类,直到最终只剩下一个聚类或者达到预设的聚类数目。合并的方式可以通过计算样本之间的距离来决定,常用的距离度量包括欧氏距离、曼哈顿距离等。凝聚型层次聚类的优势在于它不需要预先指定聚类的数目,同时可以得到层次化的聚类结果,方便后续的分析和解释。 分裂型层次聚类则是从全部样本作为一个聚类开始,然后通过分裂聚类来逐渐形成更小的聚类,直到每个样本都成为一个独立的聚类或者达到预设的聚类数目。分裂的方式通常是通过选择一个合适的聚类中心点,然后将其他样本分配到最近的聚类中心点,重复这个过程直到满足停止条件。分裂型层次聚类相比凝聚型层次聚类更加复杂和计算量大,因此在实际应用中较少使用。 层次聚类的结果可以通过聚类树(Dendrogram)来展示,聚类树是一种树状图,其中每个节点代表一个聚类,叶子节点代表单个样本。树的高度表示样本之间的距离或相似性,可以根据需要选择一个合适的高度来切割聚类树,得到最终的聚类结果。 层次聚类算法的优点在于它不依赖于初始聚类中心的选择,同时可以得到更加丰富的聚类结构信息。然而,层次聚类算法的计算复杂度较高,特别是对于大规模数据集而言,时间和空间开销较大。 在实际应用中,层次聚类算法常常用于数据挖掘、模式识别、生物信息学等领域,可以帮助我们发现数据集中的隐藏模式、群组结构等信息。
层次聚类算法的步骤如下:
- 初始化:将每个样本视为一个独立的聚类。
- 计算样本之间的相似性或距离:根据问题的需求选择适当的距离度量方法,比如欧氏距离、曼哈顿距离、余弦距离等。通过计算样本之间的距离矩阵或相似性矩阵来表示样本之间的相似度。
- 合并聚类:根据距离或相似性矩阵,选择合适的合并策略将距离最近或相似度最高的两个聚类合并为一个新的聚类。常用的合并策略包括单链接(Single Linkage)、完全链接(Complete Linkage)、平均链接(Average Linkage)等。合并后重新计算距离矩阵或相似性矩阵。
- 重复步骤3,直到满足停止条件。停止条件可以是达到预设的聚类数目,或者根据某个阈值判断合并的质量。
- 根据聚类结果生成聚类树(Dendrogram):聚类树是一种树状图,其中每个节点代表一个聚类,叶子节点代表单个样本。树的高度表示样本之间的距离或相似性,可以根据需要选择一个合适的高度来切割聚类树,得到最终的聚类结果。 层次聚类算法的优点包括不需要预先指定聚类数目,可以得到层次化的聚类结果,便于后续分析和解释。然而,层次聚类算法的计算复杂度较高,特别是对于大规模数据集而言,时间和空间开销较大。此外,层次聚类算法对噪声和离群点比较敏感,可能会导致不稳定的聚类结果。 在实际应用中,层次聚类算法常常与其他聚类算法结合使用,比如先使用层次聚类算法得到初始聚类结果,然后再使用划分型聚类算法进行细化或优化。这样可以充分利用层次聚类算法的优势,并克服其缺点。
下面是一个使用Python中的scikit-learn库进行层次聚类的示例代码:
pythonCopy codefrom 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]])
# 创建层次聚类对象
clustering = AgglomerativeClustering(n_clusters=2)
# 进行聚类
clustering.fit(X)
# 打印每个样本的聚类标签
print("样本的聚类标签:", clustering.labels_)
运行以上代码,将得到以下输出结果:
plaintextCopy code样本的聚类标签: [0 0 1 1 0 1]
这里使用了AgglomerativeClustering类来进行层次聚类,其中n_clusters参数指定了聚类的数目。在本例中,将样本分为2个聚类。聚类结果通过labels_属性获得,每个样本被标记为0或1,表示属于哪个聚类。
接上文的代码,我们可以继续展示如何可视化层次聚类的结果:
pythonCopy codeimport matplotlib.pyplot as plt
# 绘制样本数据的散点图
plt.scatter(X[:,0], X[:,1], c=clustering.labels_, cmap='rainbow')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Hierarchical Clustering')
plt.show()
运行以上代码,将会显示一个散点图,其中不同聚类的样本被用不同的颜色标记。这样可以直观地观察到聚类结果。 另外,如果需要获取聚类树(Dendrogram),可以使用scipy库中的hierarchy模块,示例代码如下:
pythonCopy codefrom scipy.cluster import hierarchy
# 计算样本之间的距离矩阵
dist_matrix = hierarchy.distance.pdist(X)
# 使用最短距离法进行层次聚类
linkage_matrix = hierarchy.linkage(dist_matrix, method='single')
# 绘制聚类树
dendrogram = hierarchy.dendrogram(linkage_matrix)
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.title('Dendrogram')
plt.show()
运行以上代码,将会显示一个聚类树的图像,横轴表示样本的索引,纵轴表示样本之间的距离或相似度。通过观察聚类树,可以确定合适的切割高度,得到最终的聚类结果。