Skip to content

聚类分析

本页深入讲解聚类分析(Clustering)——无监督学习中最核心的任务。聚类在无监督学习中作为概览介绍,本页作为独立教程展开各算法的数学原理、适用场景和代码实践。聚类的目标是将相似样本归为一组,是客户分群、文档聚类、图像分割等任务的基础技术。

聚类的本质:物以类聚——让相似的数据自动成团。不同算法对”相似”和”成团”的定义截然不同:

  • K-means = 撒种子、归团队、移中心:随机放 K 个中心点,每个样本归到最近的中心,然后中心移动到团队的重心——重复直到稳定。只能发现球形簇,需要预先指定 K。
  • 层次聚类 = 画家谱树:从每个样本自成一类开始,不断合并最相似的两类,最终形成一棵”家族树”(树状图 dendrogram)——在任意高度”切一刀”就得到对应数量的簇。不需要预设 K,可视化直观。
  • DBSCAN = 看人群密度:人多的地方自然成团(核心点),边缘的人也算(边界点),孤立的零星人就是噪声。不需要预设簇数,还能发现任意形状的簇——月牙形、环形都行。
  • GMM = 软分配的概率模型:不是硬邦邦地”这个点属于 A 簇”,而是”这个点 70% 可能属于 A,30% 可能属于 B”。假设数据由多个高斯分布混合而成,用 EM 算法同时学分布参数和分配概率。

为什么要聚类? 当你手头有数据但没有任何标签(不知道正确答案),却想把数据”分门别类”时,聚类就是最自然的工具。它广泛用于探索性数据分析(EDA)——先看看数据自然形成哪些结构,再决定后续策略。

K-means 本质上是 EM 算法的特例——E 步分配样本,M 步更新中心:

K-means 是硬分配(Hard Assignment)的 EM——E 步中每个样本 100% 归属一个簇。GMM 是软分配(Soft Assignment)的 EM——E 步算的是样本属于各簇的概率。

各算法对同一数据聚类,效果差异巨大:

K-means 和 GMM 基于距离/概率假设,适合球形簇;DBSCAN 基于密度,适合任意形状;谱聚类把数据建成图,通过图分割聚类,特别适合非凸形状。

from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_moons
# 生成月牙形数据(非球形,用来测试各算法)
X, _ = make_moons(n_samples=300, noise=0.08, random_state=42)
# K-means: 预设 K=2,只能找球形簇
kmeans = KMeans(n_clusters=2, random_state=42, n_init=10).fit_predict(X)
# DBSCAN: 基于密度,能发现任意形状
dbscan = DBSCAN(eps=0.2, min_samples=5).fit_predict(X)
# 层次聚类: 自底向上合并
agg = AgglomerativeClustering(n_clusters=2, linkage="ward").fit_predict(X)
# GMM: 高斯混合模型 + EM 算法
gmm = GaussianMixture(n_components=2, random_state=42).fit_predict(X)
# 只有 DBSCAN 能正确聚类月牙形数据
print(f"K-means 标签: {kmeans[:10]}") # 线性切开
print(f"DBSCAN 标签: {dbscan[:10]}") # 正确识别两个月牙

HDBSCAN(Hierarchical DBSCAN)是 DBSCAN 的层次化升级版,最大的改进是不需要手动调 ε——它自动探索不同密度层级并选出最稳定的簇:

# pip install hdbscan
import hdbscan
from sklearn.datasets import make_blobs
import numpy as np
# 生成密度不均匀的数据(真实场景中簇密度往往不同)
centers = [[0, 0], [5, 5], [10, 0]]
X, _ = make_blobs(n_samples=[50, 200, 50], centers=centers,
cluster_std=[0.5, 2.0, 0.5], random_state=42)
# HDBSCAN:只需指定 min_cluster_size(最小簇大小),无需调 ε
clusterer = hdbscan.HDBSCAN(min_cluster_size=15, min_samples=5)
labels = clusterer.fit_predict(X)
print(f"发现簇数: {len(set(labels)) - (1 if -1 in labels else 0)}")
print(f"噪声点数: {np.sum(labels == -1)}")
print(f"聚类置信度(0~1,越高越确定): {clusterer.probabilities_[:5]}")
# HDBSCAN 还提供簇的稳定性分数和层次结构可视化
clusterer.condensed_tree_.plot(select_clusters=True)

HDBSCAN vs DBSCAN 的核心区别:DBSCAN 用单一 ε 值,当不同簇密度差异大时顾此失彼;HDBSCAN 构建完整的密度层次树,自动提取不同密度下最”稳定”(持久存在)的簇。实践中 HDBSCAN 几乎总是优于 DBSCAN——它让”调参”这件事简单到只需指定”一个簇至少多大”。

from sklearn.metrics import silhouette_score
# 尝试不同 K 值,选择轮廓系数最高的
for k in range(2, 7):
labels = KMeans(n_clusters=k, random_state=42, n_init=10).fit_predict(X)
score = silhouette_score(X, labels) # 越接近 1 越好
print(f"K={k}, 轮廓系数={score:.3f}")
# 输出示例: K=2 最高,说明分 2 簇最优

实际项目中,选 K 不能只靠一个指标。下面演示肘部法则(Elbow Method)+ 轮廓系数 + Calinski-Harabasz 指数三者结合的综合评估:

import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score
inertias = []
silhouettes = []
ch_scores = []
db_scores = []
K_range = range(2, 11)
for k in K_range:
km = KMeans(n_clusters=k, random_state=42, n_init=10).fit(X)
labels = km.labels_
inertias.append(km.inertia_) # 越小越好(但会持续下降)
silhouettes.append(silhouette_score(X, labels)) # 越大越好
ch_scores.append(calinski_harabasz_score(X, labels)) # 越大越好
db_scores.append(davies_bouldin_score(X, labels)) # 越小越好
fig, axes = plt.subplots(1, 4, figsize=(18, 4))
# 肘部法则:看 inertia 曲线的"肘部"拐点
axes[0].plot(K_range, inertias, 'bo-'); axes[0].set_title('肘部法则 (Inertia)')
axes[0].set_xlabel('K'); axes[0].set_ylabel('Inertia (越小越好)')
# 轮廓系数:越大越好
axes[1].plot(K_range, silhouettes, 'gs-'); axes[1].set_title('轮廓系数')
axes[1].set_xlabel('K'); axes[1].set_ylabel('Silhouette (越大越好)')
# Calinski-Harabasz:越大越好
axes[2].plot(K_range, ch_scores, 'r^-'); axes[2].set_title('CH 指数')
axes[2].set_xlabel('K'); axes[2].set_ylabel('CH Index (越大越好)')
# Davies-Bouldin:越小越好
axes[3].plot(K_range, db_scores, 'md-'); axes[3].set_title('Davies-Bouldin')
axes[3].set_xlabel('K'); axes[3].set_ylabel('DB Index (越小越好)')
plt.tight_layout(); plt.savefig('clustering_evaluation.png', dpi=150)
# 多个指标共同指向的 K 值通常最可靠

肘部法则、轮廓系数、CH 指数与 Davies-Bouldin 多指标评估

指标解读直觉:inertia 衡量”簇内有多紧凑”(必然随 K 增大而下降,所以找”拐点”而非最小值);轮廓系数同时考虑”簇内紧凑”和”簇间分离”,是综合指标;CH 指数类似方差分析中 F 统计量的思想;DB 指数衡量每对簇之间的相似度,越低说明簇之间分得越开。

目标是最小化所有样本到其所属簇中心的距离平方和(inertia / WCSS,Within-Cluster Sum of Squares):

J=∑i=1Nmin⁡c∥xi−μc∥2=∑i=1N∥xi−μci∥2J = \sum_{i=1}^{N} \min_{c} \lVert x_i - \mu_c \rVert^2 = \sum_{i=1}^{N} \lVert x_i - \mu_{c_i} \rVert^2

其中 μc=1∣Cc∣∑xi∈Ccxi\mu_c = \frac{1}{|C_c|}\sum_{x_i \in C_c} x_i 是簇 cc 的均值中心,cic_i 是样本 ii 所属的簇。

EM 视角:

  • E 步(Expectation):固定中心,每个样本分配到最近中心 → ci=arg⁡min⁡c∥xi−μc∥c_i = \arg\min_c \lVert x_i - \mu_c \rVert
  • M 步(Maximization):固定分配,每个中心更新为所属样本的均值 → μc=mean(xi where ci=c)\mu_c = \text{mean}(x_i \text{ where } c_i = c)

K-means 为什么一定能收敛(停下)?关键在于目标函数 J 是单调递减且有下界的:

  1. E 步后 J 不增:固定中心 μc\mu_c,每个样本 xix_i 选最近中心,新的分配 cinew=arg⁡min⁡c∥xi−μc∥2c_i^{new} = \arg\min_c \lVert x_i - \mu_c \rVert^2。这意味着 ∥xi−μcinew∥2≤∥xi−μciold∥2\lVert x_i - \mu_{c_i^{new}} \rVert^2 \le \lVert x_i - \mu_{c_i^{old}} \rVert^2,所以 JJ 不可能增大。

  2. M 步后 J 不增:固定分配 cic_i,把 μc\mu_c 更新为簇内均值。可以证明:均值是最小化 ∑xi∈Cc∥xi−μc∥2\sum_{x_i \in C_c} \lVert x_i - \mu_c \rVert^2 的解。对 μc\mu_c 求导令其为零:

∂∂μc∑xi∈Cc∥xi−μc∥2=−2∑xi∈Cc(xi−μc)=0  ⟹  μc=1∣Cc∣∑xi∈Ccxi\frac{\partial}{\partial \mu_c} \sum_{x_i \in C_c} \lVert x_i - \mu_c \rVert^2 = -2 \sum_{x_i \in C_c}(x_i - \mu_c) = 0 \implies \mu_c = \frac{1}{|C_c|} \sum_{x_i \in C_c} x_i

所以 M 步的均值更新就是最优解,JJ 不会增大。

  1. 有下界:J≥0J \ge 0(距离平方和不可能为负)。

综合以上:JJ 在每一步 E 和 M 后都不增大,且 J≥0J \ge 0,由单调收敛定理,JJ 必然收敛到一个极限值。由于样本分配的方案是有限种(KNK^N 种),最终会到达一个 JJ 不再变化的稳定分配——这就是收敛。

直觉理解:K-means 像一个球只会往下滚不会往上升——每一步要么让总误差变小,要么不变。它不可能永远变化下去,因为状态空间有限。但它可能停在”半山腰”的局部最优,而非全局最优——这就是为什么需要多次随机初始化(n_init=10)取最好的结果。

K-means 的收敛质量严重依赖初始中心的位置。K-means++(Arthur 2007)用一种巧妙的概率采样来分散初始中心:

  1. 随机选第一个中心
  2. 对每个剩余点 xx,计算它到已选中心的最短距离 D(x)D(x)
  3. 以概率 P(x)=D(x)2/∑D(x′)2P(x) = D(x)^2 / \sum D(x')^2 选下一个中心——离已有中心越远的点越可能被选中
  4. 重复直到选满 K 个

这保证了初始中心在空间上充分分散,数学上可以证明 K-means++ 的期望近似比(approximation ratio)为 O(log⁡K)O(\log K),远优于纯随机初始化。scikit-learn 的 KMeans 默认就使用 K-means++。

局限:K-means 隐含假设簇是球形且大小相近,对非球形数据(月牙、环形)效果差;对异常值敏感(一个极端点会拉动中心);维度灾难(curse of dimensionality)使得高维空间中距离的区分度变差。

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于两个参数:ε(邻域半径)和 MinPts(最小邻居数)。

  • 核心点(Core Point):ε 邻域内至少有 MinPts 个邻居 → 簇的”骨架”
  • 边界点(Border Point):在某个核心点的 ε 邻域内,但自己不是核心点 → 簇的”边缘”
  • 噪声点(Noise Point):既不是核心点也不是边界点 → 异常值

DBSCAN 的核心概念是密度可达(density-reachable)和密度相连(density-connected):

  • 直接密度可达:如果 pp 是核心点,且 qq 在 pp 的 ε 邻域内(q∈Nε(p)q \in N_\varepsilon(p)),则 qq 从 pp 直接密度可达。
  • 密度可达:如果存在一条链 p1,p2,…,pnp_1, p_2, \ldots, p_n,使得 pi+1p_{i+1} 从 pip_i 直接密度可达(p1=pp_1 = p, pn=qp_n = q),则 qq 从 pp 密度可达。注意:密度可达是不对称的——核心点可以到达边界点,但边界点不能反过来到达核心点。
  • 密度相连:如果存在一个核心点 oo,使得 pp 和 qq 都从 oo 密度可达,则 pp 和 qq 密度相连。密度相连是对称的(这是一个等价关系的核心性质)。

一个簇就是密度相连关系的最大集合——这保证了簇内任意两点都通过密度关系连通,且不存在跨簇的密度连接。这种基于密度的连通性,不是基于距离的圆形划分,所以能发现任意形状。

from sklearn.neighbors import NearestNeighbors
import numpy as np
import matplotlib.pyplot as plt
# 计算每个点到第 k 近邻的距离,排序后画图
k = 5 # 对应 min_samples=5
neighbors = NearestNeighbors(n_neighbors=k).fit(X)
distances, _ = neighbors.kneighbors(X)
k_distances = np.sort(distances[:, -1]) # 第 k 近邻的距离
plt.plot(k_distances)
plt.xlabel('样本(按距离排序)')
plt.ylabel(f'第 {k} 近邻距离')
plt.title('k-距离图 — 拐点处即为合适的 ε')
plt.axhline(y=0.3, color='r', linestyle='--', label='建议 ε≈0.3')
plt.legend()
plt.savefig('k_distance_plot.png', dpi=150)
# k-距离图的"拐点"(elbow)通常就是 ε 的好选择:
# 拐点之前 = 簇内点(密度高),拐点之后 = 噪声/簇间点(密度低)

k-距离图:拐点处即为合适的 ε 值

直觉:k-距离图把所有点按”第 k 近邻有多远”排序后画出来。大部分点(簇内)的第 k 近邻很近,所以曲线前段平坦。到了簇的边缘和噪声区域,第 k 近邻突然变远,曲线陡升——拐点对应的距离值就是区分”簇内”和”簇外”的天然分界,即 ε。

GMM(Gaussian Mixture Model)假设数据由 K 个高斯分布混合而成:

p(x)=∑k=1Kwk⋅N(x∣μk,Σk)p(x) = \sum_{k=1}^{K} w_k \cdot \mathcal{N}(x \mid \mu_k, \Sigma_k)

其中 wkw_k 是第 kk 个高斯分布的权重(∑kwk=1\sum_k w_k = 1),μk\mu_k 和 Σk\Sigma_k 是其均值向量和协方差矩阵。

目标:最大化对数似然 ℓ=∑i=1Nlog⁡∑k=1Kwk⋅N(xi∣μk,Σk)\ell = \sum_{i=1}^{N} \log \sum_{k=1}^{K} w_k \cdot \mathcal{N}(x_i \mid \mu_k, \Sigma_k)。这个对数似然内部有个求和,直接对 μk\mu_k 求导会得到复杂的耦合方程,无法闭式求解。EM 算法通过引入隐变量(每个样本属于哪个高斯分量)来巧妙绕过这一困难。

E 步(Expectation):计算每个样本属于每个高斯分量的后验概率(软分配 / responsibility):

rik=wk⋅N(xi∣μk,Σk)∑j=1Kwj⋅N(xi∣μj,Σj)r_{ik} = \frac{w_k \cdot \mathcal{N}(x_i \mid \mu_k, \Sigma_k)}{\sum_{j=1}^{K} w_j \cdot \mathcal{N}(x_i \mid \mu_j, \Sigma_j)}

这里 rikr_{ik} 是样本 ii 属于分量 kk 的概率,满足 ∑krik=1\sum_k r_{ik} = 1。直觉上:如果 xix_i 离 μk\mu_k 很近,且 Σk\Sigma_k 很小(分布很集中),那么 rikr_{ik} 就大。

M 步(Maximization):用软分配概率作为权重更新各高斯分布的参数。令 Nk=∑irikN_k = \sum_i r_{ik}(分量 kk 的有效样本数),则:

μknew=∑i=1Nrik⋅xiNk,Σknew=∑i=1Nrik(xi−μknew)(xi−μknew)TNk,wknew=NkN\mu_k^{new} = \frac{\sum_{i=1}^{N} r_{ik} \cdot x_i}{N_k}, \quad \Sigma_k^{new} = \frac{\sum_{i=1}^{N} r_{ik}(x_i - \mu_k^{new})(x_i - \mu_k^{new})^T}{N_k}, \quad w_k^{new} = \frac{N_k}{N}

直觉:E 步在说”每个数据点有多大可能属于哪个高斯”,M 步在说”在这些概率下,最优的高斯参数应该长什么样”。两者交替进行,就像一个人蒙眼拼图:先猜每块属于哪个位置(E),再根据猜测调整拼图块(M),反复直到拼对。EM 算法在 Dempster, Laird & Rubin (1977) 的经典论文中被正式提出,是统计学习中最重要的算法之一。

EM 的收敛性:和 K-means 类似,EM 的对数似然在每次迭代后单调不降(这是 EM 的一个基本定理),且有上界(数据决定的),所以必定收敛——但同样只能保证收敛到局部最优。

GMM vs K-means:K-means 是 GMM 的特殊情况——当所有高斯分布的协方差相等 Σk=σ2I\Sigma_k = \sigma^2 I 且 σ→0\sigma \to 0 时,后验概率退化为”赢者通吃”的硬分配,GMM 的 M 步就变成了 K-means 的均值更新。GMM 更灵活(支持椭圆形簇、软分配),但计算量更大,且对初始化更敏感。

谱聚类(Spectral Clustering)不走距离/密度的路子,而是从**图论(Graph Theory)**的角度切入:

把 NN 个数据点看作图的顶点,点之间的相似度看作边的权重:

  1. 构建相似度矩阵 WW:用高斯核(RBF kernel)计算边权重 Wij=exp⁡(−∥xi−xj∥2/(2σ2))W_{ij} = \exp(-\lVert x_i - x_j \rVert^2 / (2\sigma^2))。σ\sigma 控制”相似”的尺度——σ\sigma 小时只有非常近的点才有边,σ\sigma 大时远处的点也有弱连接。实践中常取与数据的尺度匹配的值,或用自调整(self-tuning)方法自动确定。

  2. 度矩阵 DD:对角矩阵,Dii=∑jWijD_{ii} = \sum_j W_{ij},即顶点 ii 的所有边权重之和——衡量顶点的”连接强度”。

  3. 图拉普拉斯矩阵(Graph Laplacian):L=D−WL = D - W。这个矩阵有非常优美的性质:

    • LL 是半正定的(xTLx≥0x^T L x \ge 0)
    • LL 的最小特征值为 0,对应特征向量是常数向量 1\mathbf{1}
    • 零特征值的重数等于图的连通分量数——如果图有 KK 个独立的连通子图,LL 就有 KK 个零特征值

    直觉:图拉普拉斯衡量的是信号在图上的”平滑度”。xTLx=12∑i,jWij(xi−xj)2x^T L x = \frac{1}{2}\sum_{i,j} W_{ij}(x_i - x_j)^2,如果相邻(权重大的)点的值差异大,这个能量就大。所以 LL 的小特征值对应的特征向量,就是图上最”平滑”的模式——它们自然地把不同连通分量分到不同的值。

  4. 求 LL 的前 KK 个最小特征向量(跳过第一个全零的),构成矩阵 U∈RN×KU \in \mathbb{R}^{N \times K}。

  5. 行归一化后,在 UU 的列构成的 KK 维空间中跑 K-means。

为什么谱聚类能处理非凸形状? 因为图拉普拉斯的特征向量做了一种非线性降维——它把原始空间中通过密度/相似度连通的点映射到低维空间中相近的位置。月牙形、环形等在原始空间中是非凸的,但在拉普拉斯特征空间中变成了线性可分的块,K-means 就能轻松切分了。这和流形学习(如 LLE、t-SNE)的思想一脉相承。

实践中更常用归一化拉普拉斯矩阵 Lsym=I−D−1/2WD−1/2L_{sym} = I - D^{-1/2} W D^{-1/2}(Ng, Jordan & Weiss 2002)或 Lrw=I−D−1WL_{rw} = I - D^{-1} W(Shi & Malik 2000),它们对度数差异大的图更鲁棒。scikit-learn 的 SpectralClustering 默认使用归一化版本。

层次聚类不需要预设 K,而是构建一个完整的层次结构(hierarchy),有两种方向:

  • 凝聚式(Agglomerative,自底向上):从每个样本自成一类开始,每步合并最相似的两类,直到所有样本合为一类。
  • 分裂式(Divisive,自顶向下):从一个大类开始,每步将一类分成两类,直到每个样本自成一类。

凝聚式更常用,关键是** linkage(连接方式)**定义了两类之间的距离:

Linkage两类间距离定义特点
Single(单连接)两类间最近的点对距离容易产生链式效应(chaining),把细长的点串连成一个簇
Complete(全连接)两类间最远的点对距离倾向紧凑的球形簇,对噪声敏感
Average(平均连接)所有点对距离的平均值折中方案
Ward合并后 inertia 的增量类似 K-means 思想,倾向于等大小的簇
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
# 使用 Ward linkage 做层次聚类
Z = linkage(X, method='ward')
# 画树状图(dendrogram)
plt.figure(figsize=(12, 5))
dendrogram(Z, truncate_mode='lastp', p=20) # 只显示最后 20 次合并
plt.axhline(y=Z[-3, 2], color='r', linestyle='--', label='切割线 → 4 簇')
plt.title('层次聚类树状图 (Dendrogram)')
plt.xlabel('样本 / 簇'); plt.ylabel('合并距离')
plt.legend(); plt.savefig('dendrogram.png', dpi=150)
# 在指定高度切割得到簇标签
labels = fcluster(Z, t=4, criterion='maxclust') # 得到 4 个簇

层次聚类树状图(Dendrogram)

树状图的读取:横轴是样本(或合并后的簇),纵轴是合并时的距离——合并越晚(线越高)说明两类越不相似。在某个高度画一条水平线,穿过的竖线数量就是切割后的簇数。这就是层次聚类的”先聚类后选 K”优势。

  • K-means 要先标准化:它基于欧氏距离,大量纲特征会主导聚类结果。用 StandardScaler 是标准操作。
  • 选 K 的方法:肘部法则(elbow method,看 inertia 随 K 变化的拐点)或轮廓系数(silhouette score,越大越好)——两者结合判断更可靠。
  • DBSCAN 参数调优:ε 太大所有点成一簇,太小所有点都是噪声。实践中可以画 k-距离图(k-distance plot)辅助选 ε。更推荐直接用 HDBSCAN,只需指定最小簇大小。
  • GMM 注意初始化:EM 算法可能收敛到局部最优,多次随机初始化取最优结果(n_init 参数)。
  • 大规模数据用 MiniBatchKMeans:K-means 的小批量版本,用随机子样本更新中心,速度大幅提升,适合百万级数据。
  • 维度灾难:在高维空间中,所有点对之间的距离趋于相同,距离的区分力急剧下降。对策:先降维(PCA、UMAP),再聚类。UMAP 降维后接 HDBSCAN 是 2024-2025 年文本聚类的主流 pipeline。
  • 聚类结果不稳定:不同随机种子可能给出不同结果(尤其 K-means 和 GMM)。实践中应多次运行取共识结果,或用集成聚类(ensemble clustering)提升稳定性。
  • 客户分群 → 精准营销:电商用 K-means 或 GMM 根据消费金额、频次、品类偏好将用户分为”高价值用户""价格敏感型""潜力用户”等群体,支撑差异化运营和个性化推荐。
  • 文档聚类 → 内容组织:用 TF-IDF 向量化文档后聚类,自动发现主题分组——新闻聚合(Google News 把同一事件的多篇报道聚类在一起)是最典型的应用。2025 年,用 LLM embedding(如 OpenAI text-embedding-3-large、BGE-M3)替代 TF-IDF 已成为主流,详见下方聚类与 LLM Embedding。
  • 图像分割 → 计算机视觉:对图像像素的 RGB 值聚类,每簇代表一个颜色区域——这是经典的无监督图像分割方法(更先进的方法见图像分割)。
  • 异常检测 → 风控与质检:DBSCAN 的噪声点天然是异常点,聚类中远离簇中心的小簇也是异常候选——聚类和异常检测(见异常检测)天然相关。
  • 基因表达分析 → 生物信息学:对不同基因在不同条件下的表达水平聚类,发现功能相关的基因组——聚类是生物信息学的基本工具。
  • 网络社群发现 → 社交网络分析:对社交网络、引用网络等图结构做聚类(社区检测),自动发现紧密连接的用户群体。谱聚类和模块度优化(Louvain 算法)是核心方法。
  • 日志聚类 → AIOps 运维:将海量服务器日志按模板聚类,自动发现异常日志模式,支撑智能告警和根因分析。
  • 图像检索与推荐 → 向量聚类:将图片/商品编码为向量后聚类(常用 FAISS 加速的 K-means),实现近似最近邻搜索(ANN),是电商推荐和视觉检索系统的底层技术。

2024-2026 年,大语言模型(LLM)的 embedding 能力深刻改变了聚类实践。传统方法用 TF-IDF 或 word2vec 获得文本表示,而现代 LLM embedding 捕捉到更深层、更上下文相关的语义信息:

# 现代 LLM embedding 聚类 pipeline
from sentence_transformers import SentenceTransformer
import hdbscan
import umap
# 1. 用 LLM 编码文本为稠密向量(捕捉深层语义)
model = SentenceTransformer('BAAI/bge-large-zh-v1.5') # 中文 embedding 模型
documents = ["机器学习算法入门", "深度学习神经网络", "今天天气真好",
"CNN 图像分类", "明天可能下雨", "Transformer 架构"]
embeddings = model.encode(documents) # → shape (6, 1024)
# 2. UMAP 降维(从 1024 维降到 5 维,保留流形结构)
reducer = umap.UMAP(n_components=5, random_state=42)
embeddings_2d = reducer.fit_transform(embeddings)
# 3. HDBSCAN 聚类(无需指定簇数,自动发现语义类)
clusterer = hdbscan.HDBSCAN(min_cluster_size=2)
labels = clusterer.fit_predict(embeddings_2d)
for doc, label in zip(documents, labels):
print(f"[簇 {label}] {doc}")
# 簇 0: 机器学习/深度学习/CNN/Transformer(AI 主题)
# 簇 1: 天气相关

为什么 UMAP + HDBSCAN 成为黄金组合? LLM embedding 通常有几百上千维,直接在高维空间聚类会遭遇维度灾难。UMAP(Uniform Manifold Approximation and Projection)是一种流形学习降维方法,能保留数据在高维空间中的拓扑结构(谁和谁相邻),同时把维度降到适合聚类的范围。HDBSCAN 在低维空间中基于密度聚类,不预设簇数,还能标出噪声。这个 pipeline 被称为 BERTopic 的核心技术路线,广泛用于主题建模和文档聚类。

这一组合在 RAG(Retrieval-Augmented Generation)系统中也至关重要——聚类后的语义簇用于构建多级检索索引、去重和主题分析。

传统聚类算法在原始特征空间上操作,而深度聚类(Deep Clustering)利用神经网络学习更适合聚类的特征表示,然后再做聚类。核心思想是端到端联合优化:表示学习和聚类目标。

方法年份核心思想
DEC (Deep Embedded Clustering)2016自编码器预训练 → 用 KL 散度迭代微调,使表示适配聚类目标
VaDE (Variational Deep Embedding)2018VAE + GMM 的变分推断框架,深度版的 GMM
DeepCluster2018用 K-means 的簇标签作为伪标签训练 CNN,表示与聚类互相提升
SwAV (Swassing Assignments Views)2020对同一图像的不同增强视图做一致性聚类约束
SCAN2020利用预训练特征 + 近邻一致性做聚类微调
CLIP-based 聚类2023-2025利用 CLIP/多模态 embedding 做跨模态聚类(图文混合聚类)
DINOv2 + K-means2024-2025冻结 DINOv2 自监督特征 + 经典聚类,以极简 pipeline 超越复杂深度聚类方法
DCDC (Deep Conceptor Deep Clustering)2024用 conceptor 理论引导深度聚类,避免表征坍塌问题
# 深度聚类的简化伪代码(DEC 思路)
import torch
import torch.nn as nn
class AutoEncoder(nn.Module):
def __init__(self, input_dim, latent_dim):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 512), nn.ReLU(),
nn.Linear(512, 128), nn.ReLU(),
nn.Linear(128, latent_dim)
)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 128), nn.ReLU(),
nn.Linear(128, 512), nn.ReLU(),
nn.Linear(512, input_dim)
)
def forward(self, x):
z = self.encoder(x)
return z, self.decoder(z)
# 步骤 1: 预训练自编码器(最小化重构误差)
# 步骤 2: 在 latent space 上跑 K-means 得到初始簇中心
# 步骤 3: 用 KL 散度微调 —— 让 latent 表示更适配聚类目标
# 目标: L = 重构损失 + λ * KL(软分配 || 目标分布)

深度聚类 vs 传统聚类:传统聚类(K-means、DBSCAN)是”特征给定后做聚类”;深度聚类是”边学特征边聚类”。当原始数据是图像、文本、音频等非结构化数据时,原始像素/词向量空间不适合直接聚类,深度聚类通过学到的语义特征,往往能大幅提升效果。代价是需要大量数据和 GPU 训练。

纯无监督聚类不使用任何标签,而半监督聚类(Semi-Supervised Clustering)利用少量已知信息(must-link / cannot-link 约束,或少量种子标签)来引导聚类,效果往往显著优于纯无监督方法。

  • Must-link 约束:“这两个样本必须在同一个簇”(已知同类)
  • Cannot-link 约束:“这两个样本不能在同一个簇”(已知不同类)

代表算法:

  • COP-KMeans:修改 K-means 的 E 步,分配样本时检查约束,如果违反约束就跳过该点。
  • MPCKMeans(Metric Pairwise Constraint K-Means):不仅用约束引导分配,还同时学习一个马氏距离(Mahalanobis distance)度量,使约束在特征空间中被更好地满足——这实际上是**度量学习(Metric Learning)**与聚类的结合。
  • ** seeded K-Means**:用少量已知标签的样本初始化簇中心,然后正常跑 K-means。
# COP-KMeans 示意(使用约束引导聚类)
from active_semi_clustering.semi_supervised.pairwise_constraints import COPKMeans
# must-link: 第 0 和第 1 个样本必须同簇
# cannot-link: 第 0 和第 3 个样本不能同簇
ml = [(0, 1), (2, 3)]
cl = [(0, 3), (1, 4)]
cop_kmeans = COPKMeans(n_clusters=3)
labels = cop_kmeans.fit_predict(X, ml=ml, cl=cl)
# 少量约束就能大幅改善聚类质量,尤其当数据本身难以区分时

实际价值:在很多场景中,获取全量标签成本极高,但少量标注(“这几条客服对话是同一类投诉”、“这两个用户明显不属于同一客群”)成本很低。半监督聚类用这些廉价约束显著提升聚类质量,性价比极高。

聚类分析领域在 2025-2026 年呈现以下主要趋势:

1. LLM 驱动的语义聚类成为默认方案

Section titled “1. LLM 驱动的语义聚类成为默认方案”

传统 TF-IDF + K-means 的文档聚类正在被 LLM embedding + UMAP + HDBSCAN 的 pipeline 全面取代。这一趋势的代表是 BERTopic(Grootendorst, 2022-2025),它将 LLM embedding 聚类与主题表示提取(c-TF-IDF)结合,成为主题建模的新标准。商业产品如 OpenAI、Cohere 提供的 embedding API 使得任何应用都能轻松获得高质量的语义向量。

2025 年 BERTopic 生态进一步成熟:支持动态主题建模(追踪主题随时间演化)、层次主题建模(构建主题层级树)、以及 LLM 自动主题命名与摘要。这些能力使 BERTopic 从学术工具变成企业内容分析的基础设施——新闻聚合、客服对话分析、学术文献挖掘等场景广泛采用。

随着 RAG 系统的普及,向量数据库(Pinecone、Weaviate、Milvus、Qdrant)普遍内置了 K-means 或 IVF(Inverted File Index)聚类来加速近似最近邻搜索。聚类从”分析工具”变成了”基础设施组件”。Facebook 的 FAISS 库支持 GPU 加速的 K-means,可在分钟级完成十亿级向量的聚类。

2025 年的趋势是分层聚类索引——先用粗粒度 K-means 把向量空间分成大区域,再在每个区域内做细粒度聚类,形成多级索引树。Milvus 和 Qdrant 都已实现这种分层 IVF 索引,在十亿级向量检索中实现了亚毫秒级延迟。

自监督预训练(SimCLR、DINO、MAE)产生的高质量特征表示,使得”预训练特征 + 经典聚类”的组合在图像、音频等非结构化数据上效果接近专门的深度聚类方法,且更简单。纯端到端深度聚类的研究仍在继续,但工业界更倾向于两阶段 pipeline。

2024-2025 年的关键突破来自 DINOv2(Meta AI):其自监督视觉特征质量极高,以至于”冻结 DINOv2 + K-means”这个极其简单的组合,在图像聚类任务上的效果就能超越复杂的端到端深度聚类方法。这进一步验证了”强表征 > 好聚类算法”的趋势——当特征已经足够好时,聚类算法的选择变得不那么重要。

随着 LLM 成为”标注引擎”(用 GPT-4 生成大量伪标签和约束),半监督聚类获得了丰富的约束来源。LLM 引导聚类(LLM-Guided Clustering)成为新兴方向——用 LLM 生成的语义约束来引导传统聚类算法,结合了 LLM 的语义理解能力和经典算法的效率。

2025 年的最新进展包括:

  • LLM-as-a-Cluster-Labeler:聚类完成后,让 LLM 为每个簇自动生成自然语言标签和描述(如”簇 0 = 关注价格、偏好折扣的年轻用户”),大幅降低人工解读成本。
  • LLM 主动约束生成:在聚类过程中,让 LLM 判断”这两个样本是否应该在同一簇”,自动生成 must-link / cannot-link 约束,实现迭代优化的半监督聚类。

HDBSCAN 已从学术算法变成工业界密度聚类的首选工具。它的 hdbscan Python 库持续维护更新,被集成到 BERTopic、scikit-learn-contrib 等主流生态中。相比 DBSCAN 需要痛苦调参 ε,HDBSCAN 只需指定 min_cluster_size,这个参数有明确的业务含义(“一个簇至少包含多少点”),更易于领域专家理解和操作。

2024-2025 年,hdbscan 库引入了 soft clustering 能力——每个样本不再被硬分配到唯一簇,而是获得属于各簇的概率向量。这对模糊边界场景(如一个文档同时涉及多个主题)特别有用,也使得聚类结果可以下游任务做更灵活的融合。

随着 AI 透明性要求的提高,可解释聚类(Explainable Clustering)受到关注——不仅要分好簇,还要解释”为什么这样分”。代表方法如 EXPERT(决策树风格的聚类解释)、基于 SHAP 值的簇特征解释等。LLM 在这一方向也有应用:让 LLM 自动为每个簇生成自然语言描述(“簇 0 是对价格敏感、偏好折扣的年轻用户”)。

2025 年的 可解释 K-means(Explainable K-means, IKM)方法更进一步:用一棵浅层决策树替代质心分配规则,使得”样本为什么被分到这个簇”可以用 2-3 个简单规则解释(如”年龄 < 35 且月消费 > 500 → 簇 2”),在牺牲极小聚类质量的前提下大幅提升可解释性。

7. 不确定性感知聚类(2025 新兴方向)

Section titled “7. 不确定性感知聚类(2025 新兴方向)”

传统聚类给出确定性的簇分配,但在安全关键场景(医疗、金融)中,知道”模型对某个样本的簇分配有多不确定”同样重要。2025 年出现了多种不确定性量化方法:

  • Conformal Clustering:结合保形预测(Conformal Prediction)框架,为每个样本提供有保证覆盖率的预测集——即”这个样本有 90% 的概率属于这 N 个簇之一”。
  • 贝叶斯深度聚类:在深度聚类的神经网络中引入贝叶斯推断,输出簇分配的后验分布而非点估计,自然量化不确定性。
  • 能量分数聚类:利用能量模型(Energy-Based Models)为每个簇分配计算能量分数,低能量 = 高置信度,高能量 = 边界或异常样本。
类库语言说明
scikit-learnPython提供 KMeans、DBSCAN、AgglomerativeClustering、GMM、SpectralClustering 全谱算法
SciPy(scipy.cluster)Python提供层次聚类的 linkage、fcluster、dendrogram 等经典函数
hdbscanPythonDBSCAN 的改进版(HDBSCAN),自动选择最优参数,无需手动调 ε
FAISSC++/PythonFacebook 的向量聚类与检索库,支持 GPU 加速的 K-means
UMAP-learnPython流形学习降维库,常与 HDBSCAN 组合用于高维聚类
BERTopicPython基于 LLM embedding + UMAP + HDBSCAN 的主题建模框架
sentence-transformersPython获取高质量文本 embedding,聚类 pipeline 的第一步
MCL(Markov Cluster)Python/命令行基于马尔可夫链流动模拟的图聚类算法,常用于网络分析
术语英文解释
簇Cluster聚类结果中一组相似的样本
质心Centroid一个簇内所有样本的均值中心点,K-means 迭代更新的对象
簇内平方和Inertia / WCSS所有样本到其所属簇中心的距离平方和,K-means 的最小化目标
肘部法则Elbow Method绘制 inertia 随 K 的变化曲线,在拐点(肘部)选择 K
轮廓系数Silhouette Score衡量聚类质量的指标,结合簇内紧密度与簇间分离度,范围 [-1, 1]
软分配Soft AssignmentGMM 中给样本分配属于各簇的概率(而非唯一归属)的方式
硬分配Hard AssignmentK-means 中每个样本唯一归属一个簇的分配方式
树状图Dendrogram层次聚类结果的树形可视化,在任意高度切割得到对应簇数
核心点 / 边界点 / 噪声点Core / Border / Noise PointDBSCAN 中按邻域密度对点的三种分类
图拉普拉斯Graph Laplacian谱聚类中度矩阵减去相似度矩阵得到的矩阵,其特征向量用于降维
密度可达Density-ReachableDBSCAN 中通过核心点链连接两点的关系,是簇定义的基础
流形学习Manifold Learning假设高维数据位于低维流形上的学习方法,UMAP/t-SNE 属于此类
自编码器Autoencoder输入等于输出的神经网络,通过瓶颈层学习压缩表示,深度聚类的基础
维度灾难Curse of Dimensionality高维空间中距离区分力下降的现象,是高维聚类的主要挑战
近似最近邻ANN (Approximate Nearest Neighbor)通过聚类索引加速的近邻搜索,是向量数据库的核心技术
度量学习Metric Learning从数据中学习一个距离度量(如马氏距离),使同类样本更近、异类更远
指标英文解释
Calinski-Harabasz 指数CH Index簇间方差与簇内方差之比,越大越好,计算快
Davies-Bouldin 指数DB Index簇内紧密度与簇间分离度之比,越小越好
调整兰德指数Adjusted Rand Index (ARI)有真实标签时,衡量聚类结果与真实标签的一致性,随机聚类时 ARI≈0
归一化互信息NMI (Normalized Mutual Information)有真实标签时,衡量聚类结果与真实标签的信息共享量,范围 [0, 1]
  • 划分式聚类谱系:K-means(Lloyd 1957 提出、MacQueen 1967 命名)→ K-means++(Arthur 2007,改进初始化)→ MiniBatchKMeans(Sculley 2010,大规模数据加速)→ K-medoids / PAM(用真实样本点而非均值作为中心,对异常值鲁棒)。
  • 层次聚类谱系:Agglomerative(自底向上合并,Ward 1963 / 单连接 / 全连接 / 平均连接)→ Divisive(自顶向下分裂,DIANA)→ BIRCH(大规模数据的层次聚类,用 CF 树加速)。
  • 密度聚类谱系:DBSCAN(Ester 1996,经典论文)→ OPTICS(Ankerst 1999,自动处理不同密度的簇)→ HDBSCAN(Campello 2013,层次化 DBSCAN,自动选最优簇)。
  • 模型式聚类:GMM + EM(Dempster, Laird, Rubin 1977,EM 算法经典论文)→ Dirichlet Process GMM(非参数贝叶斯,自动确定簇数)。概率图模型的更多内容见概率图模型与半监督学习。
  • 谱聚类:基于图论的聚类方法(Shi & Malik 2000,Normalized Cut;Ng, Jordan & Weiss 2002)。谱聚类与谱降维(Laplacian Eigenmaps)一脉相承,都是利用图拉普拉斯矩阵的特征分解。
  • 深度聚类:DEC(Xie, Girshick & Farhadi 2016,开创性的深度聚类工作)→ VaDE(Jiang et al. 2018,VAE+GMM)→ DeepCluster(Caron et al. 2018)→ 基于自监督预训练的方法(DINO、SCAN, 2020-2025)。
  • 主题建模与文本聚类:LDA(Blei, Ng & Jordan 2003,经典概率主题模型)→ BERTopic(Grootendorst 2022-2025,LLM embedding 时代的主题建模)→ Top2Vec(Angelov 2020,基于 embedding 的主题发现)。
  • 聚类与 LLM 结合的前沿:用 LLM embedding 替代传统文本表示做聚类(2023-2026 趋势),用 LLM 生成约束引导半监督聚类,用 LLM 自动生成聚类描述和解释。