聚类算法全解析:从层次聚类到非层次聚类
1. 层次聚类算法概述
层次聚类算法可从图论角度进行解释。单链接聚类和完全链接聚类分别对应寻找最大连通图和最大完全图(或团)。
1.1 组平均凝聚聚类
组平均凝聚聚类是单链接和完全链接聚类的折衷方案。它不以簇元素间的最大相似度(单链接)或最小相似度(完全链接)作为合并标准,而是采用平均相似度。
在某些情况下,平均相似度可以高效计算。若对象以 m 维实值空间中的长度归一化向量表示,且相似度度量为余弦相似度,那么存在一种算法能在常数时间内根据两个子簇的平均相似度计算出一个簇的平均相似度。整个算法的时间复杂度为 $O(n^2)$ ,这反映了最初需要计算所有相似度,后续的合并步骤(每次线性时间)也具有线性复杂度,总体复杂度为二次。
组平均凝聚聚类在处理大量特征和大量对象时效率较高,但合并两个组的常数时间计算依赖于向量空间的性质,目前没有独立于对象表示的通用高效算法。
具体步骤如下:
1. 给定一组待聚类对象 $X$,每个对象由 m 维向量表示。
2. 对于一个簇 $C \subseteq X$,向量间的平均相似度 $\overline{s}(C)$ 定义为:
- $\overline{s}(C)=\frac{2}{|C|(|C|-1)}\sum_{i=1}^{|C|-1}\sum_{j=i + 1}^{|C|}s(x_i,x_j)$
3. 设 $C$ 为当前簇的集合。在每次迭代中,找出使 $\overline{s}(C_1 \cup C_2)$ 最大的两个簇 $C_1$ 和 $C_2$。
4. 通过合并 $C_1$ 和 $C_2$ 构建一个新的、更小的划分 $C’$:
- $C’=(C - {C_1,C_2}) \cup {C_1 \cup C_2}$
1.2 应用:改进语言模型
语言模型在语音识别和机器翻译中用于从多个候选假设中进行选择。聚类可以通过泛化来改进语言模型(计算 $P(H)$)。
语言模型采用一阶马尔可夫假设,即一个单词仅依赖于前一个单词。优化的标准是降低交叉熵或困惑度,目标是找到一个将单词分配到簇的函数,使困惑度相对于简单的单词模型有所降低。
聚类算法采用自底向上的方式,合并准则是最大化相邻类之间的互信息。在每一步,选择合并后互信息损失最小的两个簇。聚类在达到预定的簇数量时停止。
例如,Brown 等人找到的 1000 个簇中的三个如下:
- 计划、信件、请求、备忘录、案例、问题、指控、声明、草稿
- 天、年、周、月、季度、半年
- 评估、评价、分析、理解、意见、对话、讨论
虽然基于簇的语言模型的困惑度为 277,高于基于单词的模型的 244,但单词模型和基于簇的模型的线性插值困惑度为 236,优于基于单词的模型,这展示了聚类在泛化方面的实用性。
1.3 自顶向下聚类
自顶向下层次聚类从包含所有对象的一个簇开始,每次迭代选择最不连贯的簇并将其拆分。单链接、完全链接和组平均度量都可用于选择最不连贯的簇。
拆分一个簇也是一个聚类任务,可以使用任何聚类算法,包括前面提到的自底向上算法和非层次聚类算法。由于递归需要第二个聚类算法,自顶向下聚类不如自底向上聚类常用。
然而,在某些任务中,自顶向下聚类是更自然的选择。例如,使用 Kullback - Leibler 散度对概率分布进行聚类时,当单个对象的概率分布有很多零值时,无法计算自底向上聚类所需的所有对象的相似度系数矩阵,此时可以采用自顶向下聚类。
以下是自顶向下聚类的流程图:
graph TD;
A[开始:一个包含所有对象的簇] --> B[选择最不连贯的簇];
B --> C[拆分该簇];
C --> D{是否达到停止条件};
D -- 否 --> B;
D -- 是 --> E[结束];
2. 非层次聚类算法概述
非层次聚类算法通常从基于随机选择的种子(每个簇一个种子)的分区开始,然后细化这个初始分区。大多数非层次聚类算法需要多次将对象重新分配到当前最佳簇,而层次聚类算法只需要一次遍历。不过,对象在簇之间的重新分配也可以改善层次聚类的结果。
2.1 停止条件和簇数量的确定
非层次聚类算法需要确定何时停止以及合适的簇数量。停止条件可以基于某种度量,如组平均相似度、相邻簇之间的互信息或数据在聚类模型下的似然度。只要每次迭代中度量的改善足够大,就继续聚类,当改善曲线变平或度量开始下降时停止。
确定簇数量的方法有多种。如果有先验知识,可以直接使用;否则,可以对不同的 $n$ 值进行聚类,观察度量的变化。通常,簇数量增加时,度量会改善,但如果数据自然地分为 $k$ 个簇,从 $k - 1$ 到 $k$ 个簇的过渡中度量会有显著增加,从 $k$ 到 $k + 1$ 个簇的过渡中增加较小。也可以使用最小描述长度(MDL)方法,该方法在 AUTOCLASS 系统中应用,通过一个成本函数同时考虑对象与簇的拟合程度和簇的数量,最小化该函数可以确定簇的数量和对象的分配。
2.2 K - 均值聚类
K - 均值是一种硬聚类算法,通过簇成员的质心来定义簇。算法开始时需要一组初始簇中心,然后进行多次迭代,每次将每个对象分配到距离最近的簇中心所在的簇,分配完成后重新计算每个簇的中心。
距离函数通常使用欧几里得距离,也可以使用 $L_1$ 范数,它对离群点不太敏感,常与作为簇中心的中心点(medoids)结合使用。中心点是簇中的一个对象,而质心是簇成员的平均值,通常与任何对象都不相同。
K - 均值算法的时间复杂度为 $O(n)$,因为每次迭代的两个步骤都是线性的,且只计算常数次迭代。
K - 均值聚类算法的伪代码如下:
Given: a set X = {x_1, x_2, ..., x_n}, a distance measure d : X x X -> R, a function for computing the mean
Select k initial centers c_1, c_2, ..., c_k
while stopping criterion is not true do
for all x in X do
Assign x to the cluster whose center is closest according to d
end
for all means c_i do
Recompute c_i as the centroid of the set of objects assigned to it
end
end
在实现 K - 均值聚类时,需要处理多个中心与一个对象距离相同的情况,可以随机分配对象到候选簇(可能导致算法不收敛)或轻微扰动对象以避免平局。
例如,使用来自《纽约时报》语料库的 20 个单词:Barbara, Edward, Gov, Mary, NFL, Reds, Scott, Sox, ballot, finance, inning, payments, polls, profit, quarterback, researchers, science, score, scored, seats 进行 K - 均值聚类。
以下是 K - 均值聚类的步骤总结:
1. 选择初始簇中心。
2. 迭代进行对象分配和簇中心重新计算。
3. 处理平局情况。
4. 直到满足停止条件。
通过以上对层次聚类和非层次聚类算法的介绍,我们可以根据不同的应用场景和数据特点选择合适的聚类算法,以达到更好的聚类效果。
2.3 EM 算法
EM 算法是一个通用的算法模板,可用于聚类任务。它是一种迭代算法,用于在存在隐变量的情况下进行最大似然估计。
在聚类的上下文中,隐变量通常表示每个数据点属于哪个簇。EM 算法通过交替执行两个步骤来工作:期望步骤(E - step)和最大化步骤(M - step)。
2.3.1 期望步骤(E - step)
在 E - step 中,算法根据当前的模型参数估计每个数据点属于每个簇的概率。具体来说,对于每个数据点 $x_i$ 和每个簇 $j$,计算后验概率 $P(z_{ij}=1|x_i;\theta)$,其中 $z_{ij}$ 是一个指示变量,表示数据点 $i$ 是否属于簇 $j$,$\theta$ 是模型的参数。
2.3.2 最大化步骤(M - step)
在 M - step 中,算法根据 E - step 中计算的后验概率更新模型参数 $\theta$。目标是最大化似然函数 $P(X|Z;\theta)P(Z;\theta)$,其中 $X$ 是观测数据,$Z$ 是隐变量。
以下是 EM 算法用于聚类的流程图:
graph TD;
A[初始化模型参数 $\theta$] --> B[E - step: 计算后验概率];
B --> C[M - step: 更新模型参数 $\theta$];
C --> D{是否收敛};
D -- 否 --> B;
D -- 是 --> E[结束];
EM 算法的优点是它可以处理复杂的概率模型,并且通常能够收敛到局部最优解。然而,它的收敛速度可能较慢,并且结果可能依赖于初始参数的选择。
3. 聚类算法的比较与选择
不同的聚类算法具有不同的特点和适用场景,以下是对层次聚类和非层次聚类算法的比较:
| 算法类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 层次聚类 |
- 可以生成聚类的层次结构,便于理解数据的嵌套关系。
- 不需要预先指定簇的数量。 |
- 计算复杂度较高,尤其是对于大规模数据集。
- 一旦合并或拆分操作完成,就不能撤销,可能导致不理想的聚类结果。 |
- 数据具有明显的层次结构。
- 对簇的数量没有先验知识。 |
| 非层次聚类 |
- 计算效率较高,适合处理大规模数据集。
- 可以通过多次迭代优化聚类结果。 |
- 需要预先指定簇的数量。
- 结果可能依赖于初始种子的选择。 |
- 数据规模较大。
- 对簇的数量有一定的先验估计。 |
在选择聚类算法时,需要考虑以下因素:
1.
数据规模
:对于大规模数据集,非层次聚类算法(如 K - 均值、EM 算法)通常更高效。
2.
数据结构
:如果数据具有明显的层次结构,层次聚类算法可能更合适。
3.
簇的数量
:如果预先知道簇的数量,非层次聚类算法可以直接使用;如果不知道,可以使用层次聚类算法或通过一些方法(如 MDL)确定簇的数量。
4.
数据特点
:例如,数据中是否存在离群点,是否需要考虑概率模型等。
4. 聚类算法的应用案例
聚类算法在许多领域都有广泛的应用,以下是一些具体的案例:
4.1 文本挖掘
在文本挖掘中,聚类算法可以用于文档分类、主题发现等。例如,将新闻文章聚类成不同的主题,如政治、经济、体育等,有助于用户快速浏览和理解大量的文本信息。
4.2 图像识别
在图像识别中,聚类算法可以用于图像分割、特征提取等。例如,将图像中的像素点聚类成不同的区域,每个区域代表一个物体或背景,从而实现图像的分割。
4.3 市场细分
在市场营销中,聚类算法可以用于市场细分,将消费者根据其购买行为、偏好等特征聚类成不同的群体,以便企业制定针对性的营销策略。
5. 总结
聚类算法是数据挖掘和机器学习中的重要工具,它可以帮助我们发现数据中的结构和模式。本文介绍了层次聚类和非层次聚类算法,包括组平均凝聚聚类、自顶向下聚类、K - 均值聚类和 EM 算法。我们还讨论了聚类算法的停止条件、簇数量的确定方法,以及如何根据不同的应用场景和数据特点选择合适的算法。
通过合理选择和应用聚类算法,我们可以在各种领域中获得有价值的信息,为决策提供支持。未来,随着数据量的不断增加和数据类型的不断丰富,聚类算法的研究和应用将继续发展,为解决更多复杂的问题提供有效的方法。
超级会员免费看
2708

被折叠的 条评论
为什么被折叠?



