69、聚类算法全解析:从基础概念到实际应用

聚类算法全解析:从基础概念到实际应用

1. 聚类简介

聚类是无监督学习中一种非常常见的形式,主要有两种方法。第一种方法的输入是一组数据样本 (D = {x_n : n = 1 : N}),其中 (x_n \in X),通常 (X = R^D);第二种方法的输入则是一个 (N × N) 的成对不相似度矩阵 (D_{ij} \geq 0)。这两种方法的目标都是将相似的数据点分配到同一个簇中。

在无监督学习中,评估聚类算法的质量往往是一件困难的事。如果部分数据带有标签,我们可以利用两个数据点标签之间的相似度(或相等性)来判断这两个输入是否“应该”被分配到同一个簇中。若没有标签,但方法基于数据的生成模型,我们可以使用对数似然作为评估指标。

1.1 聚类方法输出的评估

聚类结构的验证是聚类分析中最困难和令人沮丧的部分。由于聚类是一种无监督学习技术,很难评估任何给定方法的输出质量。使用概率模型时,虽然可以评估数据的似然性,但存在两个缺点:一是不能直接评估模型发现的聚类情况;二是不适用于非概率方法。因此,接下来将讨论一些不基于似然性的性能度量方法。

直观上,聚类的目标是将相似的点分配到同一簇,并确保不相似的点位于不同簇。有多种方法可以衡量这些指标,但这些内部标准的作用可能有限。另一种选择是依靠一些外部数据来验证方法。例如,如果每个对象都有标签,我们可以假设具有相同标签的对象是相似的,然后使用以下指标来量化聚类的质量。

1.1.1 纯度

设 (N_{ij}) 是簇 (i) 中属于类 (j) 的对象数量,(N_i = \sum_{j=1}^{C} N_{ij}) 是簇 (i) 中的对象总数。定义 (p_{ij} = N_{ij}/N_i),这是簇 (i) 中类标签的经验分布。簇的纯度定义为 (p_i \triangleq \max_j p_{ij}),整个聚类的纯度定义为:
[purity \triangleq \sum_{i} \frac{N_i}{N} p_i]
例如,在图 21.1 中,纯度为:
[\frac{6}{17} \times \frac{5}{6} + \frac{6}{17} \times \frac{4}{6} + \frac{5}{17} \times \frac{3}{5} = \frac{5 + 4 + 3}{17} = 0.71]
纯度的范围在 0(差)到 1(好)之间。然而,通过将每个对象放入其自己的簇中,我们可以轻松实现纯度为 1,所以该指标不会对簇的数量进行惩罚。

1.1.2 Rand 指数

设 (U = {u_1, \ldots, u_R}) 和 (V = {v_1, \ldots, v_C}) 是 (N) 个数据点的两种不同划分。例如,(U) 可能是估计的聚类,(V) 是从类标签导出的参考聚类。定义一个 (2 × 2) 列联表,包含以下数量:
- (TP):在 (U) 和 (V) 中都属于同一簇的对数(真正例);
- (TN):在 (U) 和 (V) 中都属于不同簇的对数(真反例);
- (FN):在 (U) 中属于不同簇,但在 (V) 中属于同一簇的对数(假反例);
- (FP):在 (U) 中属于同一簇,但在 (V) 中属于不同簇的对数(假正例)。

常见的汇总统计量是 Rand 指数:
[R \triangleq \frac{TP + TN}{TP + FP + FN + TN}]
这可以解释为聚类决策正确的比例,显然 (0 \leq R \leq 1)。

例如,在图 21.1 中,三个簇分别包含 6、6 和 5 个点,“正例”(即被放入同一簇的对象对,无论标签如何)的数量为:
[TP + FP = \binom{6}{2} + \binom{6}{2} + \binom{5}{2} = 40]
其中,真正例的数量为:
[TP = \binom{5}{2} + \binom{4}{2} + \binom{3}{2} + \binom{2}{2} = 20]
所以 (FP = 40 - 20 = 20)。同样,可以计算出 (FN = 24) 和 (TN = 72)。因此,Rand 指数为 ((20 + 72)/(20 + 20 + 24 + 72) = 0.68)。

Rand 指数只有在 (TP = TN = 0) 时才达到下限 0,这是一个罕见的事件。可以定义一个调整后的 Rand 指数:
[AR \triangleq \frac{index - expected\ index}{max\ index - expected\ index}]
这里的随机性模型基于广义超几何分布,即两个划分是在保持原始类和对象数量的情况下随机选取的,然后计算 (TP + TN) 的期望值。该模型可用于计算 Rand 指数的统计显著性。

Rand 指数对假正例和假反例的权重相同,其他用于二元决策问题的汇总统计量,如 F 分数,也可以使用。

1.1.3 互信息

另一种衡量聚类质量的方法是计算两个候选划分 (U) 和 (V) 之间的互信息。设 (p_{UV}(i, j) = \frac{|u_i \cap v_j|}{N}) 是随机选择的对象属于 (U) 中的簇 (u_i) 和 (V) 中的簇 (v_j) 的概率,(p_U(i) = \frac{|u_i|}{N}) 是随机选择的对象属于 (U) 中的簇 (u_i) 的概率,(p_V(j) = \frac{|v_j|}{N}) 同理。则互信息为:
[I(U, V) = \sum_{i=1}^{R} \sum_{j=1}^{C} p_{UV}(i, j) \log \frac{p_{UV}(i, j)}{p_U(i)p_V(j)}]
互信息的值介于 0 和 (\min{H_U, H_V}) 之间。不幸的是,通过使用大量低熵的小簇可以达到最大值。为了弥补这一点,可以使用归一化互信息:
[NMI(U, V) \triangleq \frac{I(U, V)}{(H_U + H_V)/2}]
归一化互信息的值介于 0 和 1 之间。还有一种针对特定随机数据模型进行机会调整的版本,以及一种称为信息变化的变体。

2. 层次聚合聚类

层次聚合聚类(Hierarchical Agglomerative Clustering,HAC)是一种常见的聚类形式。该算法的输入是一个 (N × N) 的不相似度矩阵 (D_{ij} \geq 0),输出是一个树结构,其中不相似度较小的组 (i) 和 (j) 以层次方式组合在一起。

2.1 算法流程

聚合聚类从 (N) 个组开始,每个组最初包含一个对象,然后在每一步合并两个最相似的组,直到形成一个包含所有数据的组。以下是伪代码:

Algorithm 11: Agglomerative clustering
1 Initialize clusters as singletons: for i ← 1 to n do C_i ← {i};
2 ;
3 Initialize set of clusters available for merging: S ← {1, ..., n}; repeat
4     Pick 2 most similar clusters to merge: (j, k) ← arg min_{j,k∈S} d_{j,k};
5     Create new cluster C_ℓ ← C_j ∪ C_k;
6     Mark j and k as unavailable: S ← S \ {j, k};
7     if C_ℓ ≠ {1, ..., n} then
8         Mark ℓ as available, S ← S ∪ {ℓ};
9     foreach i ∈ S do
10        Update dissimilarity matrix d(i, ℓ);
11 until no more clusters are available for merging;

由于选择两个最相似的簇进行合并需要 (O(N^2)) 的时间,并且算法有 (O(N)) 个步骤,因此总运行时间为 (O(N^3))。不过,使用优先队列可以将时间复杂度降低到 (O(N^2 \log N))。

2.2 聚类变体

根据如何定义对象组之间的不相似度,聚合聚类实际上有三种变体:

2.2.1 单链接

单链接聚类(Single Link Clustering)也称为最近邻聚类,两个组 (G) 和 (H) 之间的距离定义为每个组中两个最接近成员之间的距离:
[d_{SL}(G, H) = \min_{i \in G, i’ \in H} d_{i,i’}]
使用单链接聚类构建的树是数据的最小生成树,它以最小化边权重(距离)总和的方式连接所有对象。单链接聚类可以在 (O(N^2)) 时间内实现,而其他变体需要 (O(N^3)) 时间。

2.2.2 全链接

全链接聚类(Complete Link Clustering)也称为最远邻聚类,两个组之间的距离定义为两个最远距离对之间的距离:
[d_{CL}(G, H) = \max_{i \in G, i’ \in H} d_{i,i’}]
单链接聚类只要求一组中的一对对象接近,就认为这两个组接近,而不考虑组中其他成员的相似度,因此可能会形成违反紧凑性属性的簇。全链接聚类则代表了另一个极端,只有当两个组的所有观测值都相对相似时,才认为这两个组接近,这往往会产生直径较小的紧凑簇。

2.2.3 平均链接

平均链接聚类(Average Link Clustering)测量所有对之间的平均距离:
[d_{avg}(G, H) = \frac{1}{n_G n_H} \sum_{i \in G} \sum_{i’ \in H} d_{i,i’}]
其中 (n_G) 和 (n_H) 分别是组 (G) 和 (H) 中的元素数量。平均链接聚类是单链接和全链接聚类之间的折衷,它倾向于产生相对紧凑且彼此相对较远的簇。然而,由于它涉及对 (d_{i,i’}) 的平均,任何测量尺度的变化都可能改变结果。相比之下,单链接和全链接聚类对 (d_{i,i’}) 的单调变换是不变的。

2.3 示例

假设我们有一组对 (N = 300) 个基因在 (T = 7) 个时间点的表达水平进行的时间序列测量。每个数据样本是一个 (R^7) 向量。使用欧几里得距离计算成对不相似度矩阵 (D \in R^{300×300}),并应用平均链接的层次聚合聚类,得到一个树状图。在树的某个高度进行切割,可以得到 16 个簇,分配到每个簇的时间序列看起来确实彼此相似。

3. K 均值聚类

层次聚合聚类存在一些问题,例如平均链接方法的时间复杂度为 (O(N^3)),难以应用于大型数据集;它假设已经计算了不相似度矩阵,但“相似度”的概念往往不明确,需要学习;它只是一个算法,不是一个模型,很难评估其优劣,没有明确的优化目标。而 K 均值算法可以解决这些问题。

3.1 算法原理

假设存在 (K) 个簇中心 (\mu_k \in R^D),我们可以通过将每个数据点 (x_n \in R^D) 分配到最近的中心来对数据进行聚类:
[z_n^* = \arg \min_k |x_n - \mu_k| 2^2]
当然,我们并不知道簇中心,但可以通过计算分配到每个中心的所有点的平均值来估计它们:
[\mu_k = \frac{1}{N_k} \sum
{n:z_n=k} x_n]
然后迭代这些步骤直到收敛。

更正式地说,我们可以将其视为寻找以下成本函数的局部最小值:
[J(M, Z) = \sum_{n=1}^{N} |x_n - \mu_{z_n}|^2 = |X - ZM^T|_F^2]
其中 (X \in R^{N×D}),(Z \in [0, 1]^{N×K}),(M \in R^{D×K}) 的列包含簇中心 (\mu_k)。K 均值算法使用交替最小化来优化这个成本函数,这与高斯混合模型的 EM 算法密切相关。

3.2 应用示例

3.2.1 二维平面点聚类

在二维平面上应用 K 均值聚类时,该方法会诱导出点的 Voronoi 镶嵌。聚类结果对初始化很敏感,不同的随机种子可能会导致不同的聚类质量和失真度。默认情况下, sklearn 使用 10 次随机重启(结合 K 均值++初始化),并返回失真度最低的聚类结果。

3.2.2 酵母细胞基因表达时间序列数据聚类

对酵母基因表达的时间序列矩阵应用 K 均值聚类((K = 16)),可以将看起来相似的时间序列分配到同一个簇中。每个簇的质心是分配到该簇的所有数据点的合理总结。不过,由于初始化过程的影响,重复算法可能不会得到相同的聚类结果或簇的数量。

3.3 向量量化

向量量化(Vector Quantization,VQ)是一种对实值向量进行有损压缩的简单方法。其基本思想是用一个离散符号 (z_n \in {1, \ldots, K}) 替换每个实值向量 (x_n \in R^D),这个符号是一个包含 (K) 个原型 (\mu_k \in R^D) 的码本的索引。每个数据向量通过使用最相似原型的索引进行编码:
[encode(x_n) = \arg \min_k |x_n - \mu_k| 2]
我们可以定义一个成本函数来衡量码本的质量,即计算它引起的重建误差或失真度:
[J \triangleq \frac{1}{N} \sum
{n=1}^{N} |x_n - decode(encode(x_n))|^2 = \frac{1}{N} \sum_{n=1}^{N} |x_n - \mu_{z_n}|^2]
其中 (decode(k) = \mu_k)。这正是 K 均值算法所最小化的成本函数。

如果为每个数据向量分配一个原型(即 (K = N) 且 (\mu_n = x_n)),可以实现零失真,但这并没有对数据进行压缩。通过检测数据中的相似向量,为它们创建原型或质心,并将数据表示为与这些原型的偏差,可以减少空间需求。当 (N) 很大时,编码方案的速率(每个对象所需的位数)可以近似为 (O(\log_2 K)),通常远小于 (O(DB))。

向量量化的一个应用是图像压缩。例如,对于一个 (200 × 320) 像素的图像,将其视为一组 (N = 64,000) 个标量。如果使用一个字节来表示每个像素,未压缩的图像需要 (NB = 512,000) 位。使用向量量化进行压缩时,对于 (K = 4) 的码本,大约需要 128kb,压缩因子为 4,且感知损失可以忽略不计。如果对像素之间的空间相关性进行建模,例如使用 JPEG 中的 (5×5) 块编码,可以实现更大的压缩比。这表明数据压缩和密度估计之间存在着深刻的联系。

综上所述,聚类算法在数据处理和分析中具有重要的应用价值。不同的聚类算法适用于不同的场景和数据类型,了解它们的原理和特点可以帮助我们选择合适的方法来解决实际问题。同时,聚类结果的评估也是聚类分析中不可或缺的一部分,通过合理的评估指标可以判断聚类的质量和有效性。

4. 聚类算法对比总结

不同的聚类算法有各自的特点和适用场景,下面对层次聚合聚类和 K 均值聚类进行对比总结:
| 算法类型 | 时间复杂度 | 输入要求 | 优化目标 | 聚类结果特点 | 适用场景 |
| — | — | — | — | — | — |
| 层次聚合聚类 | 平均 (O(N^3)),单链接 (O(N^2)) | 需要预先计算不相似度矩阵 | 无明确优化目标 | 可得到层次化的聚类结构,适合探索数据的层次关系 | 数据规模较小,需要了解数据层次结构时 |
| K 均值聚类 | (O(N)) | 直接使用数据点 | 最小化成本函数 (J(M, Z)) | 聚类结果相对紧凑,每个数据点分配到最近的簇中心 | 数据规模较大,对计算效率要求较高时 |

4.1 流程对比

下面是两种算法的流程对比 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([开始]):::startend --> B(初始化聚类):::process
    B --> C{是否所有簇合并为一个}:::process
    C -- 否 --> D(选择最相似的两个簇合并):::process
    D --> E(更新不相似度矩阵):::process
    E --> C
    C -- 是 --> F([结束]):::startend
    subgraph 层次聚合聚类
    A --> B --> C --> D --> E --> C --> F
    end

    G([开始]):::startend --> H(初始化簇中心):::process
    H --> I(分配数据点到最近的簇中心):::process
    I --> J(更新簇中心):::process
    J --> K{是否收敛}:::process
    K -- 否 --> I
    K -- 是 --> L([结束]):::startend
    subgraph K 均值聚类
    G --> H --> I --> J --> K --> I --> K --> L
    end

5. 聚类算法选择建议

在实际应用中,选择合适的聚类算法需要考虑以下几个因素:
1. 数据规模 :如果数据规模较小,层次聚合聚类可以提供更详细的层次结构信息;如果数据规模较大,K 均值聚类的计算效率更高。
2. 相似度定义 :如果相似度的概念比较明确,且可以预先计算不相似度矩阵,层次聚合聚类是一个不错的选择;如果相似度需要在算法中学习,K 均值聚类更合适。
3. 聚类结果要求 :如果需要了解数据的层次结构,层次聚合聚类可以得到树状图;如果只需要将数据点分配到不同的簇中,K 均值聚类可以快速得到结果。
4. 计算资源 :如果计算资源有限,K 均值聚类的低时间复杂度更适合;如果计算资源充足,可以考虑使用层次聚合聚类。

6. 聚类算法的拓展与思考

虽然层次聚合聚类和 K 均值聚类是常用的聚类算法,但在实际应用中,还可以根据具体问题对算法进行拓展和改进。例如:
- 结合多种算法 :可以先使用层次聚合聚类得到数据的层次结构,再使用 K 均值聚类对某个层次的簇进行进一步细分,以提高聚类的准确性。
- 引入新的相似度度量 :除了欧几里得距离,还可以使用其他相似度度量,如余弦相似度、曼哈顿距离等,以适应不同类型的数据。
- 处理高维数据 :在高维数据中,传统的聚类算法可能会遇到“维度灾难”问题。可以使用降维技术,如主成分分析(PCA),将数据降维后再进行聚类。

聚类算法在数据挖掘、机器学习、图像处理等领域都有广泛的应用。通过了解不同聚类算法的原理、特点和适用场景,我们可以选择合适的算法来解决实际问题,并在必要时对算法进行拓展和改进,以提高聚类的质量和效率。同时,合理的聚类结果评估也是保证聚类有效性的重要环节。希望本文能帮助读者更好地理解和应用聚类算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值