“第一次把 RNA‑seq 高维矩阵拖进 UMAP,屏幕就像放烟花——杂乱无章的点忽然排成星座。”
0. 前言:在高维丛林里找路
在传统转录组数据里,我们面对的变量可能是几十或几百个基因,但在单细胞 RNA-seq 中,每个细胞就是一个高维样本,维度通常高达上万。这样的数据让我们“看不见摸不着”全局结构,因此需要用到**降维(Dimensionality Reduction)和聚类(Clustering)**这两个工具。
降维,是为了从高维空间中提取最具代表性的信息,让我们可以在二维或三维图中一眼识别出不同细胞群体;而聚类,是在降维后的空间中将相似细胞分组,为后续的细胞类型注释打下基础。
在本期中,我们将从概念讲起,结合 R 和 Python 的实操代码,帮助大家搞清楚:“什么是降维和聚类?常见的方法有哪些?如何根据数据选择合适的工具和参数?”
1. 降维篇
1.1 降维的意义和背景
高维数据常常面临“维度灾难”,也就是说,随着维度增加,数据点之间的距离逐渐趋同,传统的相似性度量(如欧几里得距离)逐渐失效。这会直接影响聚类、可视化等分析效果。
降维的目标就是在保留关键信息的同时,去除冗余或噪音维度,从而让数据在低维空间中更易处理、理解和呈现。

不同分析目标需要不同的降维程度:
-
可视化(Visualization):通常压缩成 2-3 维,便于绘图和直观观察。
-
特征提取 / 去噪(Feature Extraction):通常保留 10-50 个维度,兼顾计算效率和信息含量。
-
下游分析(如聚类、轨迹推断):依赖降维后的特征空间。
1.2 降维方法概览
目前常用的降维方法可以分为线性和非线性两大类:
| 类型 | 代表算法 | What‘s Cool | 什么时候上场 |
|---|---|---|---|
| 线性 | PCA / ICA | 快、可解释 | 预处理、快速扫雷 |
| 非线性 | t‑SNE / UMAP / PHATE | 保流形、成像好看 | 细胞亚群可视化、连续谱系 |
| 拓扑 | Diffusion Map | 拓扑稳定 | 发育轨迹、干细胞渐变 |
| 深度 | scVI / scANVI | 学习噪声、批次整合 | 海量样本、异构数据 |
🔍 名词解释:
-
PCA(主成分分析):通过线性变换找到最大方差方向,是最基础的降维工具。
-
t-SNE:专注保留局部结构,适合展示紧凑类群,但不太适合展示全局结构。
-
UMAP:兼顾局部与全局,速度快,几乎是目前 scRNA-seq 可视化的默认首选。
-
PHATE:能较好展示“发展轨迹”类结构,尤其适合时间序列或连续分化数据。
参考文献推荐:Frontiers in Genetics 2021 比较了10种降维算法(doi:10.3389/fgene.2021.646936),指出 UMAP 在运行效率和局部结构保真度上表现最优。
1.3 降维实战技巧
| 算法 | 必调参数 | 经验值 / 提醒 |
|---|---|---|
| PCA | n_components | 取累计解释方差 ≈ 80% 或拐点处 |
| t‑SNE | perplexity | 样本 1 k → 30;样本 10 k → 50 |
learning_rate | 通常 200–1000;过低易团成一坨 | |
| UMAP | n_neighbors | 15–50;越大越看全局 |
min_dist | 0.1–0.5;越小簇越紧 |
此外,还有一些评估降维效果的方法:
-
累计方差曲线(用于 PCA)
-
kNN 保留率:查看邻近结构是否在低维空间中仍得以保留
-
Trustworthiness / Continuity:量化高低维之间的一致性
📦 实操代码示例:
pbmc <- RunPCA(pbmc, npcs = 50)
pbmc <- RunUMAP(pbmc, dims = 1:30, n.neighbors = 30, min.dist = 0.3)
DimPlot(pbmc, reduction = "umap", group.by = "seurat_clusters")
sc.tl.pca(adata, svd_solver='arpack')
sc.pp.neighbors(adata, n_neighbors=30, n_pcs=30)
sc.tl.umap(adata, min_dist=0.3)
sc.pl.umap(adata, color='leiden')

2. 聚类篇
2.1 聚类的意义
聚类是指将一组数据分成多个“内部相似、外部差异”的子集,常用于识别不同细胞类型、状态或稀有亚群。在 scRNA-seq 分析中,聚类是细胞注释、差异分析、轨迹推断的关键前提。
值得注意的是,聚类是无监督的,意味着我们并不知道这些细胞应该怎么分组,算法是基于数据本身的相似性做出划分。
-
Who are you? 细胞类型 / 状态
-
Where is the rare one? 罕见亚群挖掘
-
How do they change? 动态节点与轨迹分支

2.2 聚类方法类型
| 范式 | 算法 | 脑洞原理 | 调参焦点 | 优点 vs. 坑 |
|---|---|---|---|---|
| 图‑社区 | Louvain / Leiden | kNN 图 + 模块度 | k, resolution | 快、可拆小簇;高分辨率易碎片 |
| 密度 | DBSCAN / HDBSCAN | “高人堆成团,僧少算孤” | eps, min_samples | 抓不规则形;稀疏难调 |
| 层次 | Ward | 不断合并最近邻 | linkage | dendrogram 直观;大数据慢 |
| 原型 | K‑means / GMM | 找中心 / 高斯混合 | k, init | 简单粗暴;球型假设 |
📌 推荐使用 Leiden 聚类,它是 Louvain 的改进版,分群更稳定,并且已在 Scanpy 和 Seurat 中广泛支持。

2.3 聚类实战
操作流程通常包括:
-
建邻居图:降维后
kNN,k = 8–30。 -
扫分辨率:
resolution连跑 0.2–2,看颗粒度。 -
评价优劣:Silhouette、Adjusted Rand、marker 基因一致性。
pbmc <- FindNeighbors(pbmc, dims = 1:30, k.param = 20)
pbmc <- FindClusters(pbmc, resolution = 0.5)
DimPlot(pbmc, reduction = "umap", label = TRUE)
sc.pp.neighbors(adata, n_neighbors=20, n_pcs=30)
sc.tl.leiden(adata, resolution=0.5)
sc.pl.umap(adata, color='leiden')
3. 实例:PBMC 3k 的降维与聚类
我们以经典的 PBMC(外周血单个核细胞)3k 数据集为例,跑一遍全流程:
-
下载数据:
SeuratData::InstallData("pbmc3k") -
执行标准流程:QC → 归一化 → 选择高变基因 → PCA → UMAP → Leiden 聚类
-
注释细胞类型:通过 marker gene(如 CD3D, MS4A1, NKG7)识别 T/B/NK 细胞
进阶玩法:
-
resolution 多档跑,选最稳定方案
-
对较大簇进行“子聚类”
-
清理线粒体比例过高的双细胞群体
4. 延伸阅读
-
降维新秀:scGLUE、DestVI、CELLBENDER
-
深度聚类:scDeepCluster, GraphSAGE
-
Benchmark 数据集:dynverse、scIB、Human Cell Atlas
5. 小结
降维和聚类,是单细胞分析中“化繁为简”的关键一环。它们让我们看清高维数据背后的生物逻辑,也为后续注释和下游分析奠定了坚实基础。
下一期我们将进入“单细胞注释”模块,欢迎继续关注!


2528

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



