PaCMAP(Pairwise Controlled Manifold Approximation)是一种用于可视化与降维的技术,目标是在降维结果中同时保留原始数据的局部结构和全局结构。该项目由 YingfanWang 维护,源代码托管于 GitHub。
用途与背景 以往降维技术通常侧重局部结构(如 t-SNE、LargeVis、UMAP)或全局结构(如 TriMAP),难以兼顾两者,需要谨慎调节算法中控制全局与局部平衡的参数。PaCMAP 不通过增加近邻数量来保留全局结构,而是动态使用一类特殊点对——中近点对(mid-near pairs),先捕捉全局结构再细化局部结构,从而同时保留两者。该方法发表于 Journal of Machine Learning Research (JMLR),并获得 John M. Chambers Statistical Software Award 以及美国统计协会统计计算分会与统计编程和分析分会颁发的统计编程与分析创新奖。
主要能力 PaCMAP 通过三种点对优化低维嵌入:近邻点对(pair_neighbors)、中近点对(pair_MN)和远点对(pair_FP)。项目还发布了后续工作:NeurIPS 2024 接受的参数化降维方法 ParamRepulsor(基于 Parametric PaCMAP,支持 PyTorch GPU,面向在线学习与动态数据集);以及 AAAI 2025 接受的 LocalMAP(Pairwise Controlled Manifold Approximation with Local Adjusted Graph),通过在最终阶段动态、局部地调整图结构,使真实聚类更易识别和分离,该方法将很快并入 PaCMAP 包。
使用方式 安装:可通过 conda 或 mamba 从 conda-forge 渠道安装,也可通过 pip 从 PyPI 安装 pacmap。基础安装包含 FAISS 作为默认 KNN 后端,也支持可选 KNN 后端(annoy、faiss、voyager)。安装遇到问题时可尝试用 conda 或 mamba 安装依赖,部分情况下建议使用 numba >= 0.57。 Python 使用:pacmap 包接口与 scikit-learn 兼容,与 sklearn.manifold 模块函数类似。支持 fit、fit_transform 和 transform 方法,当前支持 numpy.ndarray 格式输入(pandas DataFrame 需转换为 ndarray)。 R 使用:可通过 reticulate 包在 R 中调用,提供示例 R notebook,并提供 Seurat Integration 以集成 Seurat 对象用于单细胞基因组学。 Rust 使用:由 @hadronzoo 发布了 Rust 实现,不依赖 Python 运行时或环境。
关键参数 n_components(输出维度,默认 2);n_neighbors(KNN 图中的近邻数,默认 10,可设为 None 自动选择:样本量小于 10000 时为 10,样本量大于 10000 时为 10 + 15 * (log10(n) - 4));MN_ratio(中近点对与近邻数之比,n_MN = n_neighbors * MN_ratio,默认 0.5);FP_ratio(远点对与近邻数之比,n_FP = n_neighbors * FP_ratio,默认 2);init(低维嵌入初始化,可选 "pca" 或 "random" 或用户提供的形状为 (N, 2) 的 numpy 数组,默认 "pca")。其他参数包括 num_iters(默认 450)、pair_neighbors/pair_MN/pair_FP(允许用户使用自己的图,默认 None)、verbose(默认 False)、lr(AdaGrad 优化器学习率,默认 1)、apply_pca(是否在构建 KNN 图前对数据应用 PCA)、intermediate(是否输出优化中间阶段结果,为 True 时输出形状 (n, n_components, 13) 的数组,对应步数 [0, 10, 30, 60, 100, 120, 140, 170, 200, 250, 300, 350, 450])、nn_backend(KNN 后端,可选 "annoy"、"faiss"、"voyager",默认 "faiss")、low_dist_thres(仅 LocalMAP 使用,默认 10)。
适用场景与限制 PaCMAP 适用于高维数据的降维可视化,示例包括 MNIST(n=70,000, d=784)、Mammoth(n=10,000, d=3)、COIL-20、COIL-100、FMNIST、Mouse 单细胞 RNA 序列等数据集,并可用于生物数据集(如单细胞基因组学)。版本 0.4 起支持用户指定近邻以映射大规模数据集。项目提供复现实验代码(data、experiments、evaluation 三个文件夹),并提供测试套件,在 pull request 和 master 分支提交时运行。开发推荐使用 UV 进行依赖管理,也可使用传统 pip 工作流。引用需参考项目提供的 bibtex。具体功能细节、收费或价格信息暂未提供。