4. 聚类基础概念:图聚类、Louvain算法与分辨率参数
做单细胞测序数据分析,绕不开一个核心问题:如何把几万个细胞,根据它们的基因表达模式,自动分成有生物学意义的群?
这就涉及到聚类。但你可别把它想简单了,不是随便一个K-means就能糊弄过去的。单细胞数据噪声大、维度高、稀疏性强,传统的欧氏距离聚类方法很快就不灵了。
我这里就讲讲图聚类、Louvain算法和分辨率参数。这是后面动手调优的理论基石,也是实际项目中最常用的组合。
4.1 什么是图?从细胞到节点,从相似度到边
咱们先聊聊“图”这个概念。你想想看,什么是图?
在计算机科学里,图(Graph)是由 节点(Node) 和 边(Edge) 组成的结构。就像是社交网络:人是节点,好友关系是边。
在单细胞分析里,也是一样的道理:
- 节点:每个细胞。
- 边:两个细胞之间的相似程度。非常相似的细胞,它们之间的连接权重就高;没那么相似,权重就低,甚至没有连接。
为什么要这样搞?因为构建图之后,我们不再用细胞在高维空间里的原始坐标做计算,而是用“谁和谁关系紧密”来推断它们的亲缘关系。这种方式对稀疏数据和高维噪声天然鲁棒,计算效率也更高。
4.2 Louvain算法:贪心自下而上的社区发现
图建好了,接下来怎么从图里把细胞群找出来?
Louvain算法就是目前最主流的社区发现算法之一。它是一种自下而上的贪心算法,专门用来优化“模块度(Modularity)”。模块度可以理解为:衡量“社区内部的连接密度”和“社区之间的连接稀疏度”的指标。
算法执行过程中,会先尝试将每个节点独自视为一个社区,把节点移动到邻居社区中,看是否能增加模块度。能增加,就移过去;不能,就留下。这个过程反复迭代,直到整个网络的模块度不再发生变化。
我刚开始接触单细胞数据时,就直接调了 Seurat::FindClusters(),没太在意背后的算法。后来有次遇到一个非常大的数据集,K-means彻底跑不动,而用Louvain则几分钟就出了结果。嗯,才真正体会到它的优势——速度快、内存占用低、结果稳定。
具体来说,它有两大特性让我特别喜欢:
- 无监督:不需要预先指定聚类个数。它能根据图的结构自动“发现”社区。
- 多分辨率:支持通过一个分辨率参数(resolution)来控制社区分裂的粒度。这是后面调参的关键。
小提示
Louvain算法在Seurat中的底层实现用C++编写,调用方式就是一行代码。你不需要懂它的推导公式,但要理解它的输出与“模块度”和“分割粒度”之间的关系。
4.3 分辨率参数:控制聚类粒度的齿轮
分辨率参数(resolution),本质上控制着“社区合并”的阈值。在Louvain算法的优化过程中,它会用来调整模块度公式中连接密度的期望强度。
你可以这么理解:分辨率就像一个放大镜的旋钮。
- 分辨率越高:放大镜推得越近,能看到的局部细节越多,意味着会把许多小的、稀疏的、甚至可能有些边缘的细胞群单独分出来。容易产生很多小类群。
- 分辨率越低:放大镜拉得远,只能看到大的、结构稳固的社区。会把许多细胞合并到少数几个大类群中。
我常遇到的情况是,有人直接用默认分辨率(通常是 resolution = 0.8),结果发现分出来的群太细,把同一类细胞的过渡态给切成了几个独立群。这就是分辨率用得过高导致的“过分割”。
相反,如果分辨率太低,可能把两个本来表达谱差异很大的亚型当成一个群,错过关键差异。
| 分辨率值 | 模块度 | 社区数量 | 特点 |
|---|---|---|---|
| 0.1 - 0.3 | 高 | 少(通常3-8个) | 粗粒度,适合识别主要细胞类型 |
| 0.5 - 1.0 | 中等 | 中(10-20个) | 默认范围,平衡粒度与可解释性 |
| 1.2 - 2.0+ | 较低 | 多(20+个) | 极小细胞亚群可能被分离,注意过分割 |
关键结论
分辨率参数没有绝对正确的值。在实践中,建议从低到高扫一遍,结合生物学标记基因和可视化结果来确定最优值。
4.4 实际项目中的应用经验
我在做一个外周血单核细胞(PBMC)的项目时,遇到过一件印象深刻的事。当时我为了把一群罕见的浆细胞样树突状细胞(pDC)分离出来,把分辨率从0.8调到了2.0。结果确实把pDC分出来了,但同时也把一个均匀的CD8+ T细胞群切成了四五个碎片。
这就是分辨率过高带来的“假阳性”问题。用过高分辨率,就像用显微镜看自己的手,看到了毛孔里的小坑洼,却把手掌给忽略了。
所以,我个人的习惯是:
- 先用低分辨率(0.2-0.4)跑一次,确认主要细胞类型轮廓。
- 在目标群已知的前提下,逐步提高分辨率,观察新分裂的群是否具备生物学上合理的分子标记。
- 如果新分裂出的群无法解释其基因表达谱或功能,就说明分辨率可能过高了。
这里也引出了另一个概念:模块度和分辨率是负相关的。分辨率越高,模块度的值往往会下降,因为社区更小了,内部连接密度下降,外部连接变少。所以,单纯追求高模块度不一定得到最佳生物学解释。
避坑指南
我曾经尝试用高分辨率直接处理一个包含16000个细胞的数据集,结果出现了30多个小群,逐个验证标记基因花了两天时间。后来发现,很多小群只是细胞周期的不同阶段,并没有真正的生物学差异。结论是:高分辨率不等于高价值,务必基于标记基因验证。
4.5 小结:用图理解结构,用分辨率把握粒度
图聚类,说白了就是把细胞之间的“关系网络”当做结构来处理。Louvain算法则是用贪心策略,最大化模块度来划分社区。分辨率参数,负责调节这个划分的精细程度。
你只要记住三件事:
- 建图是第一步,用什么距离、用多少个近邻(k值),都很重要。
- Louvain算法速度快、效果好,但输出受分辨率影响极大。
- 分辨率不是调节得越高越好,而是找到“能把目标群分清楚又不产生虚假碎片”的那个点。