加速度匹配:单细胞轨迹推断的二阶方法解析

📅 2026/8/27 5:45:53
加速度匹配:单细胞轨迹推断的二阶方法解析
这次我们来看一个偏算法的方法论题目Trajectory inference via Acceleration Matching中文可以理解为“基于加速度匹配的轨迹推断”。它解决的是单细胞转录组数据分析里最核心的问题之一——如何从一批静止的细胞表达谱中还原出连续的细胞发育轨迹。轨迹推断在单细胞领域已经有不少成熟工具比如 Monocle、PAGA、Slingshot、scVelo以及基于最优传输的 Waddington-OT 等。大多数方法的核心是“一阶信息”要么用表达相似性把细胞排成路径要么用 RNA velocity 估算细胞下一步的转录组变化方向。Acceleration Matching 的出发点是一阶速度信息不够用真正稳定可靠的轨迹应当同时满足“位置连续、速度连续、速度的变化也连续”这三个约束也就是把二阶加速度信息引入轨迹推断。这篇文章会从五个方面展开轨迹推断的问题定义以及为什么一阶方法存在系统性局限加速度匹配的数学直觉、损失函数设计与代码实现思路从 scRNA-seq 表达矩阵到轨迹推断的完整数据预处理流如何验证一条推断出的轨迹“靠不靠谱”实际运行时的资源占用、性能瓶颈与常见排错方法。面向的读者包括正在做单细胞数据分析的研究人员需要在自己数据集上复现并评估轨迹推断结果的算法工程师以及想在生物学场景里把轨迹模型落地成分析管线的同学。1. 核心概念速览在进入细节之前先把这个问题涉及到的各个模块列清楚。下面这张表可以帮助你快速判断这个方向与你的需求是否匹配。项目维度说明研究问题从单细胞表达数据推断细胞发育、分化、状态转变的连续轨迹输入数据scRNA-seq 表达矩阵常见格式为 cell × gene部分方法需要 spliced/unspliced 计数用于速度估计输出结果细胞伪时间排序、轨迹拓扑结构、分化分支方向、细胞状态转移路径一阶方法代表RNA velocityscVelo、Velocyto、图最短路径伪时间Monocle、PAGA、Slingshot二阶方法思想在轨迹拟合中同时约束位置、速度和加速度使轨迹不会出现“突然转向”或“虚假停滞”核心优势对噪声更鲁棒能更好区分真实的缓慢过渡与噪声造成的伪停滞减少轨迹“抄近路”问题核心难点加速度需要足够可靠的邻域图与速度估计作为前提超参数变多调参成本上升适用场景发育生物学、细胞重编程、肿瘤异质性演化、细胞命运决策研究这里需要先做一个重要说明轨迹推断方法本身的输入输出格式在不同实现中差异很大。本文讨论的是一种方法学思想公式和代码都属于“概念性实现”如果你在本地复现某个具体项目请以该项目官方仓库中的接口、模型配置和示例数据为准。2. 轨迹推断问题定义与加速度匹配的数学思想轨迹推断本质上是一个“从静态切片恢复动态过程”的问题。每个细胞的转录组状态可以看作一个高维空间里的点比如在 PCA 降维后的 d 维空间中细胞 i 的表达向量记作 x_i ∈ R^d。我们需要构造一条连续曲线γ: [0, T] → R^d其中 t 是伪时间参数γ(t) 表示伪时间 t 时刻的细胞状态。理想情况下每个细胞 i 都对应一个伪时间 t_i并且满足x_i ≈ γ(t_i) ε_i这里的 ε_i 是噪声。有了这条曲线我们就能回答三个问题细胞处于什么发育阶段、沿哪个方向发展、在分支点处走向哪条子路径。如果只要求“表达向量在曲线上”问题会退化成常见的降维排序随便一条穿过细胞云团的曲线都能满足。这也是很多伪时间方法的结果不够稳定的原因。为了让问题可解我们需要额外约束。一阶约束是速度约束。曲线对伪时间的导数γ(t) dγ/dt就是“沿轨迹方向的表达变化速率”。在单细胞数据中RNA velocity 会为每个细胞估计一个速度向量 v_i所以一种自然的做法是要求γ(t_i) ≈ v_i即细胞的表达变化方向要与速度方向一致。scVelo、Velocyto 以及很多基于最优传输的方法核心都围绕这一层约束展开。但一阶约束有一个内在缺陷它只保证“方向对”不保证“速度和状态的耦合关系对”。举个例子一个细胞从祖细胞状态 A 经中间状态 B 变为终末状态 C。在真实生物过程中细胞在 B 附近往往会经历一个“减速再加速”的过程而转录组噪声很容易制造出“在 B 附近速度恰好为零”的假象。一阶方法看到速度为零就会倾向于认为这里是端点或者稳定的终末状态于是轨迹推断被噪声带偏。这时候就需要加速度信息。加速度是曲线的二阶导数γ(t) d²γ/dt²加速度反映的是速度的变化率。在离散的数据中我们可以用伪时间相邻细胞之间的速度差来近似a_i ≈ (v_j - v_i) / Δt其中 j 是伪时间上位于细胞 i 前方的邻接细胞Δt 是两个细胞之间的伪时间差。更稳妥的做法是在邻域图上做加权平均a_i ≈ Σ_{j ∈ N(i)} w_ij (v_j - v_i)其中 N(i) 表示细胞 i 在邻接图中的近邻集合w_ij 是权重。这个式子读出来就是“如果我的邻居都跟我一样在加速那就是真实的加速如果只有我自己的速度出现突变那可能是噪声。”Acceleration Matching 的损失函数可以写成下面这种形式L Σ_i ||γ(t_i) - x_i||² λ₁ Σ_i ||γ(t_i) - a_i||² λ₂ ∫ ||γ(t)||² dt第一项是位置匹配要求轨迹曲线经过细胞状态附近第二项是加速度匹配要求曲线在细胞 i 处的加速度等于从邻域估计出的加速度第三项是对三阶导数也就是“急动度”的平滑惩罚用来保证轨迹不会出现剧烈的抖动。这个损失函数有直观的几何意义一条好的轨迹不会在细胞状态云团中“暴力转弯”不会在噪声产生的零速度区域“假装终点”而是会以平滑且自洽的方式通过所有细胞。3. 为什么现有方法不够一阶速度信息的局限要理解加速度匹配的价值得先看清现有方法在什么地方会失效。先看 RNA velocity。Velocyto 和 scVelo 的核心假设是基因的转录、剪接、降解过程可以用一组常微分方程描述。对于每个基因细胞中 pre-mRNA未剪接和 mRNA已剪接的丰度比例隐含了该基因当前是上调还是下调。把所有基因的速率合成一个向量就得到细胞的速度。这个思路很优雅但它的底层假设比较强。原始的 Velocyto 方法假设系统处于稳态即转录速率与降解速率长期平衡scVelo 的随机模型放宽了这个假设但仍然依赖 spliced/unspliced 计数的估计质量。真实数据中unspliced 计数非常稀疏基因选择、归一化方式和光滑化参数都会显著影响速度估计结果。如果速度本身有偏那么任何只拟合速度的方向的方法都会继承这个偏差。再看图方法。PAGA、Monocle 和 Slingshot 通常的做法是先构建细胞邻接图然后在图上计算伪时间或者用最小生成树确定轨迹骨架。这类方法的问题是“图的局部结构决定一切”。在样本量不足、细胞类型连续过渡、或者存在罕见中间态的场合最小生成树会倾向于直接连接两个高密度区域这就是经典的“抄近路”现象。从一阶信息看路径是连通的但从二阶信息看这条路径需要非常剧烈地改变速度方向是高度不自然的。最优传输方法是另一个重要流派。Waddington-OT 和 CellRank 通过匹配两个时间点的细胞分布来推断转移概率。它的优势是不需要知道具体速度但缺点是它本质上只能描述“从一个观测时间点到下一个观测时间点”的离散跳跃中间动态完全依赖插值或者马尔可夫链模拟连续性和二阶平滑性都不是它主动优化的对象。把这些局限放在一起可以看到一个共同的缺口现有方法都在优化“状态间的匹配”而不是“状态变化过程的连续性”。加速度匹配试图补上的正是这个缺口。它对速度场施加了一个额外的光滑性约束让轨迹推断从“找一条穿过所有细胞的路”变成“找一条所有细胞都能以合理加速度走完的路”。4. 输入数据与预处理从表达矩阵到邻接图不管加速度匹配的具体实现是什么它的输入输出大概率还是遵循单细胞分析的标准生态。下面给出一套通用预处理流程适用于绝大多数轨迹推断项目。4.1 表达矩阵与数据格式最常见的输入是 10x Genomics 输出的 gene-cell 计数矩阵读取之后建议统一转成 AnnData 或者 Seurat 对象。AnnData 是 Python 生态的标准格式后缀通常是 .h5ad里面同时保存表达矩阵、细胞元数据和基因元数据。import scanpy as sc import anndata as ad # 读取表达矩阵行是基因列是细胞 adata sc.read(expression_matrix.h5ad) # 基本质控过滤低质量细胞与低表达基因 sc.pp.filter_cells(adata, min_genes200) sc.pp.filter_genes(adata, min_cells3) # 查看关键统计量确认过滤没有过度 print(adata.shape) print(总细胞数:, adata.n_obs) print(总基因数:, adata.n_vars)质控标准要按数据实际情况调整。例如如果研究的是血小板等低 RNA 含量的细胞类型min_genes 就不能设太高否则会过滤掉目标细胞群。4.2 标准化、对数化与特征选择轨迹推断对数据变换敏感。标准的 scRNA-seq 预处理流程是先按每个细胞的测序深度标准化再做对数变换然后用高变基因进行降维。# 标准化与对数化 sc.pp.normalize_total(adata, target_sum1e4) sc.pp.log1p(adata) # 选择高变基因推荐先看基因数再决定阈值 sc.pp.highly_variable_genes(adata, n_top_genes2000) adata adata[:, adata.var[highly_variable]].copy() # 缩放并做 PCA 降维 sc.pp.scale(adata, max_value10) sc.tl.pca(adata, n_comps50) # 构建邻接图加速度估计依赖这个图的质量 sc.pp.neighbors(adata, n_neighbors15, n_pcs30)重点说邻接图。加速度是在邻域上计算的如果邻接图本身噪声很大第二步的加速度估计就会失真。n_neighbors 建议在 10 到 30 之间做一次小规模测试观察下游轨迹的稳定性。对于样本量很大的数据可以先用 50 维 PCA 再取前 30 个主成分构图这是最常见的组合。4.3 批量效应处理单细胞数据最常见的坑是批量效应。如果多个样本来自不同的测序批次、不同平台的文库或不同的病人表达矩阵里会混合“批次差异”和“真实生物学差异”。轨迹推断如果不处理批量效应很容易把批次差异识别成发育梯度从而画出一条假的轨迹。处理方式有三种如果只是少量已知批次可以用 harmony 做批次整合如果数据存在生物学梯度与批次梯度混杂可以用 scVI 这类深度生成模型学习去批次的隐空间如果目标是保守分析可以先用线性回归回归掉批次变量再做 PCA。需要特别提醒的是批次校正不能盲目使用。过度校正会抹掉真实的生物学差异导致轨迹拓扑被压平。建议校正前后各跑一次轨迹推断对比两条轨迹的拓扑和分支点再做选择。4.4 速度数据的准备如果加速度匹配实现中需要用到 RNA velocity 估计输入格式会要求 spliced 和 unspliced 两个计数矩阵。scVelo 的读取和处理方式可以复用import scvelo as scv # 读取带有 spliced/unspliced 信息的 loom 或 h5ad 文件 adata_velo scv.read(velocity_input.loom) # 过滤、标准化并估计速度 scv.pp.filter_and_normalize(adata_velo, min_shared_counts20, n_top_genes2000) scv.pp.moments(adata_velo, n_pcs30, n_neighbors30) scv.tl.velocity(adata_velo, modestochastic) scv.tl.velocity_graph(adata_velo)速度估计的质量直接决定加速度估计的质量。从实操角度看建议至少尝试 model 的“stochastic”和“dynamical”两种模式比较它们在下游轨迹推断上的差异。如果两种模式给出的轨迹拓扑明显不同优先检查基因筛选和邻域参数而不是急着换轨迹推断算法。5. 加速度匹配工作流设计与代码实现前面讲过Acceleration Matching 的核心是在传统轨迹损失中加入二阶项。下面从工程角度拆解一个可行的实现方案。5.1 整体流程一个完整的加速度匹配轨迹推断工作流分五个阶段预处理得到标准化的表达矩阵、PCA 降维结果和邻接图速度估计用 scVelo 或类似工具得到每个细胞的速度向量加速度估计在邻接图上用速度差分估算每个细胞的加速度轨迹拟合用一个参数化曲线或者神经网络优化位置、速度、加速度三项损失结果解释输出伪时间、分支标签、轨迹可视化。第 4 步是方法的核心。一个实用做法是把伪时间 t 作为输入用一个多层感知机或样条函数映射到 d 维表达空间然后用自动微分同时计算一阶导和二阶导来构造损失。5.2 损失函数与核心伪代码下面是一个基于 PyTorch 的概念性实现。它演示的是“如何构造一项加速度匹配损失”不是某个具体项目的完整代码。import torch def acceleration_matching_loss( gamma_t, # 当前伪时间对应的轨迹状态向量 gamma_t_plus, # 伪时间前进一步的状态 gamma_t_minus, # 伪时间后退一步的状态 x, # 细胞实际观测表达向量 a_pred, # 从邻域图估计出的加速度向量 dt, # 伪时间步长 lambda_acc1.0, lambda_smooth0.1 ): 概念性损失函数 1) 位置匹配轨迹状态与观测表达一致 2) 加速度匹配轨迹二阶导与邻域估计加速度一致 3) 平滑项速度场在轨迹上连续 # 一阶速度中心差分 velocity (gamma_t_plus - gamma_t_minus) / (2 * dt) # 二阶加速度二阶中心差分 acceleration (gamma_t_plus - 2 * gamma_t gamma_t_minus) / (dt ** 2) # 位置匹配 loss_position torch.mean((gamma_t - x) ** 2) # 加速度匹配 loss_acceleration torch.mean((acceleration - a_pred) ** 2) # 速度连续性相邻伪时间点的速度差 loss_smoothness torch.mean((velocity[1:] - velocity[:-1]) ** 2) total_loss ( loss_position lambda_acc * loss_acceleration lambda_smooth * loss_smoothness ) return total_loss, { position: loss_position.item(), acceleration: loss_acceleration.item(), smoothness: loss_smoothness.item() }这里有个关键点加速度 a_pred 是在训练前从数据中预先估计的还是训练过程中动态计算的两种方案各有取舍。预先估计计算快但会继承速度估计的误差动态计算能让轨迹拟合去“纠正”速度场但训练稳定性更差。建议在代码实现时提供 train_acceleration 开关先跑预估计版本确认管线正确再把开关打开看轨迹是否有明显改善。5.3 训练配置示例轨迹推断模型的超参数很多建议用配置文件管理。下面是一个 JSON 配置模板实际路径和参数需要按你的项目替换。{ data: { input_path: data/expression.h5ad, batch_key: donor_id, n_top_genes: 2000 }, preprocessing: { normalize_target: 10000, n_pcs: 30, n_neighbors: 15 }, velocity: { mode: stochastic, min_shared_counts: 20, n_pcs: 30 }, trajectory: { method: acceleration_matching, embedding_dim: 10, hidden_layers: [128, 128], n_epochs: 500, learning_rate: 0.001, lambda_acceleration: 1.0, lambda_smoothness: 0.1 }, evaluation: { metrics: [ spearman_pseudotime, velocity_consistency, topology_accuracy ], output_dir: results/ } }从工程化角度建议把数据读取、速度估计、轨迹拟合、评估四个模块解耦这样后续替换数据源或调整模型时不需要重写全流程。5.4 小规模数据集先跑通第一次运行时不要直接上全量数据。建议先抽一个包含 2000 到 5000 个细胞的子集跑通整个流程。这个子集应该覆盖你要研究的主要细胞类型包括至少一个已知的分支结构。跑通之后再逐步扩大样本量观察伪时间和分支点是否稳定。6. 效果验证与轨迹评估轨迹推断最大的风险是“看起来合理但实际是错的”。因为单细胞数据没有标准的伪时间标签最终轨迹结果很难用一个单一指标验证。建议从四个维度交叉验证。6.1 与已知时间点或发育阶段比对如果你的实验设计里包含多个采样时间点可以计算推断伪时间与实验时间的相关性。这通常用 Spearman 相关系数来评估。import numpy as np from scipy.stats import spearmanr # pseudotime: 轨迹推断输出的每个细胞的伪时间 # real_time: 实验设计中的采样时间点或已知发育阶段编码 pseudotime np.load(results/pseudotime.npy) real_time np.load(data/real_time.npy) rho, p_value spearmanr(pseudotime, real_time) print(fSpearman correlation: {rho:.3f}) print(fP-value: {p_value:.2e})需要注意的是实验时间点与伪时间不是线性对应的。细胞增殖、凋亡、异步发育都会导致伪时间相对真实时间发生扭曲所以相关性高是加分项相关性一般不代表方法错了。6.2 速度一致性检查一个好的轨迹应该与速度场高度一致。一个直观的检查方式是对每个细胞将伪时间递增方向的单位向量与速度向量做点积然后取平均值。这个值越接近 1说明轨迹方向与速度方向越一致。import numpy as np def velocity_consistency(pseudotime, velocity, neighbor_graph, k5): 计算轨迹方向与速度方向的一致性得分。 total_cos [] n_cells pseudotime.shape[0] for i in range(n_cells): # 找到伪时间上排在当前细胞前方、且在邻接图中的 k 个近邻 ahead np.argsort(pseudotime)[:k] # 计算从当前细胞指向这些近邻的平均方向 # 这里简化为取第一个前向近邻实际可按邻接图权重加权 forward_idx ahead[ahead ! i][0] traj_dir neighbor_graph[i] - neighbor_graph[forward_idx] norm np.linalg.norm(traj_dir) if norm 0: continue cos_sim np.dot(traj_dir / norm, velocity[i] / (np.linalg.norm(velocity[i]) 1e-9)) total_cos.append(cos_sim) return float(np.mean(total_cos))这个检查的意义在于如果轨迹推断与速度估计来自同一个数据速度一致性高说明轨迹是“动态合理”的。但要注意RNA velocity 并非真实速度它只是一种启发式估计一致性指标只能作为参考。6.3 轨迹拓扑稳定性轨迹拓扑稳定性是最容易被忽略的评估维度。具体做法是对数据做 bootstrap 重采样每次随机抽取 80% 的细胞重新跑轨迹推断比较五次结果中分支点数量和位置是否一致。如果分支点在每次运行中都在同一个细胞群附近出现说明轨迹拓扑是稳健的如果分支点飘忽不定优先怀疑中间态细胞数量不足。6.4 与已知标记基因比对这部分是最生物学、也最实用的验证方式。选定轨迹沿线的关键基因检查它们的表达是否沿伪时间出现符合预期的上升或下降模式。这不是严格意义上的定量评估但在实际研究里往往比相关系数更有说服力。7. 计算资源与性能观察轨迹推断的计算开销通常集中在两个方面邻接图构建与速度估计以及轨迹拟合阶段的迭代优化。邻接图构建的时间复杂度与细胞数 N 和近邻数 k 相关实现良好的库如 scanpy 和 scVelo 可以用近似最近邻算法把时间压缩到可接受范围。速度估计阶段scVelo 的 stochastic 模式在几万细胞规模下通常能在普通台式机上运行dynamical 模式因为要拟合动力学模型耗时明显更长。加速度匹配的轨迹拟合阶段如果采用神经网络参数化建议用 GPU 训练如果只是样条函数拟合CPU 就足够。显存和内存占用需要以实际数据规模和模型设计为准这里给一个通用观察方法。训练过程中可以监控两个指标内存占用数据加载、邻接图、速度矩阵都会常驻内存几万细胞、几千高变基因的矩阵大约在几 GB 量级GPU 利用率如果轨迹拟合用了神经网络建议把 batch size 从 256 开始调观察显存占用是否随 batch size 线性增长。降低资源占用的常用手段包括先用 PCA 降到 30 到 50 维而不是直接用基因空间拟合轨迹在保持拓扑信息的前提下对细胞做均匀抽样例如保留 60% 的细胞用于初步拟合再对全部细胞做插值邻接图的 n_neighbors 不要设得过大否则加速度估计矩阵会变得很稠密内存开销显著上升轨迹拟合阶段优先用样条等低参数模型只有表达模式高度非线性时才升级到深度网络。如果出现训练不收敛或损失震荡优先把学习率降到 1e-4 以下并把加速度损失权重 lambda_acceleration 从 1.0 降到 0.1观察损失曲线是否变平滑。这个现象在二阶项加入后尤其常见因为二阶中心差分会放大噪声。8. 常见问题与排查方法轨迹推断是典型的“上一步的误差会传递到下一步”的分析流程。下面按出现频率列出常见问题。问题现象可能原因排查方式解决方案推断轨迹明显穿过无关细胞群邻接图参数不当或批次效应未处理检查 UMAP 上邻接图连线是否跨群调整 n_neighbors 和 n_pcs增加批次校正伪时间与实验时间相关性很差基因筛选不合适、速度估计模式不匹配比较不同速度模型的伪时间结果切换速度模型检查高变基因是否覆盖谱系 marker分支点位置不稳定中间态细胞数量少、图结构稀疏bootstrap 重采样观察分支点频率增加样本量提高 n_neighbors或对中间态细胞做重采样增强加速度损失下降缓慢二阶中心差分放大噪声检查损失曲线是否有毛刺降低 lambda_acceleration增加平滑项权重速度一致性得分很低速度方向系统性偏差检查 scVelo 的 velocity 图是否与 UMAP 方向一致调整速度估计参数检查 spliced/unspliced 计数质量内存不足邻接图或速度矩阵过大观察内存占用趋势减少细胞抽样降低 n_neighbors使用稀疏矩阵存储训练过程 loss 震荡学习率过高或 batch size 过小记录每 10 轮的 loss将学习率降到 1e-4 以下增大 batch size结果中伪时间出现离散跳变轨迹参数化表达能力不足查看伪时间直方图是否存在多个峰增加嵌入维度或更换性能更强的轨迹拟合模型排查轨迹推断问题时一个核心原则是逐级二分定位先用固定速度估计结果测试轨迹拟合再用固定轨迹看速度估计的影响。不要同时调十个参数否则无法定位错误来源。9. 最佳实践与使用建议轨迹推断在实际应用中的表现很大程度取决于使用方式而不是算法本身。下面几条建议是从大量单细胞分析工程经验里沉淀下来的。第一先跑一个已知结论的小数据集。如果你研究的系统里有明确的 marker 基因和已知分化方向先用这个数据集验证整个管线。确认伪时间方向、分支点位置、marker 基因表达模式三项都符合预期后再上探索性数据。管线验证的价值要高于换一个更复杂算法的价值。第二给速度估计留出足够的验证空间。速度估计是加速度匹配的上游依赖速度一旦有偏后面的加速度估计和轨迹拟合都会继承误差。建议至少对比 scVelo 的 stochastic 与 dynamical 两种模式将速度方向投影到 UMAP 上人工检查再进入下游分析。如果速度图看起来杂乱不要开始轨迹推断。第三超参数记录与版本管理。轨迹推断涉及预处理参数、速度估计参数、轨迹拟合参数三组超参数任何一组变化都会影响最终轨迹。建议用配置文件统一记录用 git 管理代码与配置的版本变化。结果目录按“数据版本/分析版本”组织方便回溯。第四批量数据要谨慎合并。多批次数据合并时批量校正会显著影响轨迹结果。建议在合并前分别对每个批次跑一次轨迹推断观察各批次的轨迹拓扑是否一致。如果拓扑一致再合并后用批次校正对比合并前后轨迹是否稳定。第五涉及人体样本数据时必须严格遵守数据使用授权和隐私保护要求。单细胞转录组数据往往包含个体级信息公开数据也要看清使用协议。如果数据来自临床样本需要确认伦理审批和去标识化处理情况。结果发布时涉及患者隐私、人脸、声音或其他可识别信息的内容都必须经过授权审查。第六对轨迹分支做生物学验证。轨迹推断只是提出假设不是结论。分支点附近的关键基因、转录因子调控网络、染色质可及性证据都是在发布结论前必须补上的验证材料。算法输出只能作为候选不能代替湿实验验证和领域知识判断。10. 总结Acceleration Matching 给轨迹推断带来的核心变化是把“只对状态做匹配”升级成“对状态、速度、加速度做联合匹配”。这个升级不能解决单细胞分析的所有问题但它确实补齐了一阶方法在噪声、抄近路和伪停滞三个场景下的短板。如果你正在处理发育连续型数据、中间态难以界定、或者速度估计结果与其他方法不一致这个方向值得花时间研究。想验证这个思路建议从三个问题入手你数据里的速度场是否可靠你邻接图上的加速度能否稳定估计加入二阶约束后轨迹拓扑是否比一阶方法更稳定。这三个问题都得到确认后再做全量数据拟合把伪时间、分支点和 marker 基因的验证结果作为最终交付。单细胞轨迹推断没有标准答案但有一个通用的原则一个方法的“更好”必须在你自己数据上通过可量化的稳定性和生物学合理性来证明。先用小样本跑通再逐步扩大验证范围是最稳妥的落地路径。