好的,我注意到你的已讲题目列表中尚未涵盖层次聚类(Hierarchical Clustering)中的一种经典且重要的算法——凝聚层次聚类(Agglomerative Hierarchical Clustering)的距离度量、链接准则与树状图(Dendrogram)生成过程。这是一个基础且关键的算法,对于理解层次聚类的全貌非常重要。
凝聚层次聚类(Agglomerative Hierarchical Clustering)的距离度量、链接准则与树状图生成过程
题目描述:
想象我们有一组数据点,没有预先设定要分成多少类,但我们想看到数据从“每个点一个类”到“所有点归为一类”的整个聚合过程,并能根据这个聚合过程决定最终的聚类数目。这就是凝聚层次聚类要解决的问题。我们需要一个清晰的算法,它不仅定义了如何计算两个数据点之间的距离,更重要的是,定义了如何计算两个簇(Cluster)之间的距离(链接准则),并一步步合并最近的簇,最终形成一颗能够可视化聚类过程的树状图。
解题过程详解:
步骤一:问题初始化与基本概念
- 输入:给定一个包含
n个数据点的数据集 \(D = \{x_1, x_2, ..., x_n\}\),以及一个计算两个数据点间距离的函数(如欧氏距离)。 - 初始状态:开始时,将每个数据点视为一个独立的簇。此时我们有
n个簇。 - 核心输出:一个树状图(Dendrogram)。这是一个树形结构,展示了簇从底部(
n个叶子节点)到顶部(1个根节点)的合并顺序和合并时的距离。 - 最终聚类:通过在树状图的某个“高度”进行水平切割,我们可以得到任意数量的聚类结果(从1到
n类)。
步骤二:距离矩阵初始化
这是算法的起点。我们计算所有数据点两两之间的距离,形成一个 n x n 的对称距离矩阵 \(M\)。
- \(M_{ij} = dist(x_i, x_j)\),其中 \(dist\) 可以是欧氏距离、曼哈顿距离等。
- 对角线上的元素为0(自己与自己的距离)。
- 此时,这个距离矩阵也代表了簇间距离矩阵,因为每个簇只有一个点。
步骤三:迭代合并过程(算法的核心循环)
这是算法的主体,会重复 n-1 次,直到所有点合并为一个簇。
循环的每一步包含以下子步骤:
-
寻找最近的两个簇:在当前的距离矩阵 \(M\) 中,找到值最小的那个元素(对角线除外)。假设这个最小距离是 \(d_{min}\),它对应于簇 \(C_a\) 和簇 \(C_b\)。
-
合并这两个簇:将簇 \(C_a\) 和 \(C_b\) 合并成一个新的簇 \(C_{new} = C_a \cup C_b\)。
-
更新距离矩阵(最关键的一步):删除与 \(C_a\) 和 \(C_b\) 相关的行和列,并新增一行一列对应于新簇 \(C_{new}\)。新簇 \(C_{new}\) 与其它任意簇 \(C_k\) 的距离,需要根据我们选择的链接准则(Linkage Criterion)来计算。这是层次聚类的精髓所在。
常见的链接准则详解:
- 单链接(Single Linkage):取两个簇中最近的两个点之间的距离。
\(dist_{single}(C_{new}, C_k) = min(dist(x_i, x_j))\),其中 \(x_i \in C_{new}\), \(x_j \in C_k\)。- 特点:容易产生“链式效应”,擅长发现非球形、拉长的簇,但对噪声敏感。
- 全链接(Complete Linkage):取两个簇中最远的两个点之间的距离。
\(dist_{complete}(C_{new}, C_k) = max(dist(x_i, x_j))\),其中 \(x_i \in C_{new}\), \(x_j \in C_k\)。- 特点:倾向于产生紧凑的、大小相近的球形簇,对噪声相对鲁棒。
- 平均链接(Average Linkage):取两个簇中所有点对之间的平均距离。
\(dist_{average}(C_{new}, C_k) = \frac{1}{|C_{new}| \cdot |C_k|} \sum_{x_i \in C_{new}} \sum_{x_j \in C_k} dist(x_i, x_j)\)。- 特点:介于单链接和全链接之间,是一种常用的折中方法。
- 沃德法(Ward‘s Method):衡量的是合并两个簇导致的总方差增加。它试图在每一步合并中,最小化所有簇内误差平方和(SSE)的增加量。
\(dist_{ward}(C_a, C_b) = \frac{|C_a| \cdot |C_b|}{|C_a| + |C_b|} \cdot ||\mu_a - \mu_b||^2\),其中 \(\mu\) 是簇的质心。- 特点:倾向于生成大小均匀的簇,是许多场景下的默认选择,因为它基于方差,与K-Means的目标函数有内在联系。
- 单链接(Single Linkage):取两个簇中最近的两个点之间的距离。
-
记录合并信息:记录下这一步合并的簇对 \((C_a, C_b)\) 以及它们之间的距离 \(d_{min}\)。这个信息将用于绘制树状图。
步骤四:构建树状图
树状图是算法过程的直观可视化。
- 叶子节点:最底部的
n个点代表初始的n个数据点。 - 内部节点与高度:每次合并产生一个新的内部节点。这个节点的高度(即在Y轴上的位置)被设置为这次合并时的距离 \(d_{min}\)。这个高度代表了这两个子簇之间的“相异性”。
- 连接:将这个新节点用两条线段分别连接到它合并的两个子簇(可能是叶子节点或已有的内部节点)上。
- 重复这个过程,直到画出最顶部的根节点,其高度是最后一次合并的距离。
步骤五:获取最终聚类结果
树状图本身并不直接给出聚类结果,它展示了所有可能性。要得到具体的 k 个簇,你需要:
- 在树状图的Y轴上选择一个“距离阈值”或“切割高度”。
- 画一条水平线穿过树状图。
- 这条水平线与树状图垂直线的交点数量,就是得到的簇的数量。每个交点以下的子树构成一个簇。
如何选择 k:通常观察树状图,寻找“腿”比较长的部分(即合并距离突然增大的地方),在这个高度进行切割,意味着合并的两个簇差异很大,不应再合并,从而得到有意义的聚类数目。
总结与串联
整个凝聚层次聚类算法的流程可以总结为:
- 初始化:计算所有点对距离,每个点自成一簇。
- 循环:
- 找当前距离最近的簇对 \((A, B)\)。
- 合并 \(A\) 和 \(B\) 为 \(C_{new}\)。
- 用链接准则更新 \(C_{new}\) 与其他所有簇的距离。
- 记录合并事件。
- 构建:利用记录信息,绘制树状图。
- 切割:根据树状图和分析目标,选择合适的切割点,得到最终聚类。
这个过程的核心在于链接准则的选择,它决定了算法对簇“形状”和“大小”的偏好,从而直接影响到最终的聚类效果和树状图的形态。