摘要:层次聚类(凝聚型)是一种自底向上的无监督聚类算法,通过逐步合并最近邻簇构建层次结构。该算法首先将每个样本视为独立簇,然后基于距离度量(如Ward法、单链接法等)迭代合并簇,最终形成树状图。Python实现中,可使用scikit-learn的AgglomerativeClustering和scipy的dendrogram函数进行聚类分析和可视化。虽然算法能直观展示数据层次关系且无需预设簇数,但对距离度量敏感且计算复杂度较高。典型应用包括客户细分、文档聚类等场景。
目录
机器学习中的层次聚类(凝聚型)
一、概述
核心定义
关键步骤
二、层次聚类(凝聚型)算法
三、为何使用层次聚类(凝聚型)?
四、Python 中层次聚类(凝聚型)的实现
(一)导入所需库并加载数据集
(二)构建连接矩阵
(三)可视化树状图
(四)应用聚类算法并提取聚类标签
(五)可视化聚类结果
六、层次聚类(凝聚型)的优势
七、层次聚类(凝聚型)的劣势
八、层次聚类(凝聚型)的应用场景
机器学习中的层次聚类(凝聚型)
一、概述
层次聚类(凝聚型)是一种层次化聚类算法,它以每个数据点作为独立聚类开始,通过迭代方式合并最接近的聚类,直至满足停止条件。这是一种自下而上的方法,会生成树状图(dendrogram)—— 一种类似树的图表,用于展示聚类间的层次关系。该算法可通过 Python 中的 scikit-learn 库实现。
层次聚类(凝聚型)是机器学习中无监督聚类的重要方法,其核心思想是从单个样本出发,逐步合并距离最近的簇,最终形成一棵聚类树(树状图)。
核心定义
凝聚型层次聚类(Agglomerative Hierarchical Clustering, AHC)属于 “自底向上” 的聚类策略:
- 初始状态下,每个样本都是一个独立的簇。
- 计算所有簇两两之间的距离,每次将距离最近的两个簇合并为一个新簇。
- 重复步骤 2,直到所有样本都被合并为一个簇,或者达到预设的聚类数量。
关键步骤
初始化簇将数据集 D={x1,x2,...,xn} 中的每个样本 xi 初始化为一个簇 Ci={xi},此时簇的总数为 n。
定义簇间距离簇间距离的计算方式直接决定聚类结果,常用的方法有 4 种:
- 单链接法(Single-linkage):两个簇中最近样本的距离,容易形成链式聚类。
- 全链接法(Complete-linkage):两个簇中最远样本的距离,能有效避免链式聚类,但对异常值敏感。
- 平均链接法(Average-linkage):两个簇中所有样本对距离的平均值,平衡性较好。
- 沃德法(Ward's method):合并两个簇时,簇内平方和(SSE)的增量最小,倾向于生成紧凑且大小均匀的簇,是最常用的方法之一。
迭代合并簇
- 计算当前所有簇两两之间的距离。
- 找出距离最小的一对簇,将它们合并为一个新簇。
- 更新簇的集合,减少一个簇。
- 重复上述过程,直到满足停止条件(如簇数 = 1,或达到目标簇数)。
生成树状图(Dendrogram)聚类过程可以用树状图可视化,横轴是样本,纵轴是簇间距离。通过截取树状图的某一高度,就能得到对应数量的簇。
二、层次聚类(凝聚型)算法
层次聚类(凝聚型)是通过自下而上合并聚类来构建嵌套式层次聚类结构的算法,具体步骤如下:
- 将每个数据点视为单个聚类;
- 采用距离度量方法计算邻近矩阵;
- 依据连接准则合并聚类;
- 更新距离矩阵;
- 重复步骤 3 和步骤 4,直至仅剩余一个聚类。
三、为何使用层次聚类(凝聚型)?
层次聚类(凝聚型)便于解读数据点间的关系。与 K - 均值聚类不同,该算法无需预先指定聚类数量,且效率高,能够识别小型聚类。
四、Python 中层次聚类(凝聚型)的实现
我们将以鸢尾花(iris)数据集为例进行演示,具体步骤如下:
(一)导入所需库并加载数据集
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.cluster import AgglomerativeClustering from scipy.cluster.hierarchy import dendrogram, linkage # 加载鸢尾花数据集 iris = load_iris() X = iris.data # 特征数据 y = iris.target # 目标标签(二)构建连接矩阵
连接矩阵包含了每对聚类之间的距离,可通过scipy.cluster.hierarchy模块中的linkage函数构建:
# 使用"ward"方法计算聚类间距离,该方法可最小化被合并聚类间距离的方差 Z = linkage(X, 'ward')(三)可视化树状图
通过同一模块中的dendrogram函数可视化树状图:
plt.figure(figsize=(7.5, 3.5)) plt.title("鸢尾花数据集树状图") dendrogram(Z) # 绘制树状图 plt.show()生成的树状图(见下图)展示了聚类间的层次关系:算法首先合并最接近的聚类,且随着树状图向上延伸,聚类间的距离逐渐增大。
(四)应用聚类算法并提取聚类标签
通过sklearn.cluster模块中的AgglomerativeClustering类应用算法:
# 创建层次聚类(凝聚型)实例,指定聚类数量为3(已知鸢尾花数据集包含3个类别) model = AgglomerativeClustering(n_clusters=3) model.fit(X) # 拟合数据集 labels = model.labels_ # 提取聚类标签(五)可视化聚类结果
通过散点图可视化最终聚类结果:
plt.figure(figsize=(7.5, 3.5)) # 以花萼长度为x轴、花萼宽度为y轴绘制散点图,不同聚类用不同颜色标识 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.xlabel("花萼长度") plt.ylabel("花萼宽度") plt.title("层次聚类(凝聚型)结果") plt.show()生成的图表展示了算法识别出的 3 个聚类,可见算法成功将数据点划分为对应的类别。
五、完整代码示例
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.cluster import AgglomerativeClustering from scipy.cluster.hierarchy import dendrogram, linkage # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # 构建连接矩阵并绘制树状图 Z = linkage(X, 'ward') plt.figure(figsize=(7.5, 3.5)) plt.title("鸢尾花数据集树状图") dendrogram(Z) plt.show() # 创建层次聚类(凝聚型)模型并拟合数据 model = AgglomerativeClustering(n_clusters=3) model.fit(X) labels = model.labels_ # 可视化聚类结果 plt.figure(figsize=(7.5, 3.5)) plt.scatter(X[:, 0], X[:, 1], c=labels) plt.xlabel("花萼长度") plt.ylabel("花萼宽度") plt.title("层次聚类(凝聚型)结果") plt.show()六、层次聚类(凝聚型)的优势
- 生成树状图,清晰展示聚类间的层次关系;
- 可兼容多种距离度量方法和连接准则;
- 聚类数量灵活,可根据需求从数据中提取;
- 高效实现版本可处理大型数据集。
七、层次聚类(凝聚型)的劣势
- 处理大型数据集时计算成本较高;
- 若距离度量方法或连接准则与数据不匹配,可能产生不平衡聚类;
- 最终结果对距离度量方法和连接准则的选择较为敏感;
- 对于包含大量聚类的大型数据集,树状图的解读难度较大。
八、层次聚类(凝聚型)的应用场景
层次聚类(凝聚型)在无监督机器学习任务的多个领域均有应用,主要包括:
- 图像分割;
- 文档聚类;
- 客户行为分析(客户细分);
- 市场细分;
- 社交网络分析。