RMSD 与 lDDT 结构比较指南:手上有 5 个预测模型,怎么挑出最优
2026/9/11 6:59:03 网站建设 项目流程

RMSD 与 lDDT 结构比较指南:手上有 5 个预测模型,怎么挑出最优

【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold

跑完 AlphaFold 常输出多个候选模型。如何量化判断哪个离实验结构更近?本文用三个问题回答“RMSD 与 lDDT 选谁”,也讲没有参考结构时的质量判断。适合构建评估流水线的开发者。

第一个问题:有没有实验参考结构

选指标前先回答一个分岔口:你手上有没有这条蛋白的实验结构(PDB 或 mmCIF)?它把所有指标劈成两个阵营——有参考的做“比较”,没参考的做“自评”。

“有参考”一支是本文主线,“没参考”一支放在后面单独讲。

RMSD 计算步骤:质心、Kabsch 对齐、再算数

RMSD(均方根偏差)一句话解释:把两个结构“贴”到最接近之后,对应原子的平均偏离距离。关键词是“贴”——必须先找到最优旋转加平移,否则一个只是在空间里平移了一下的分子会算出离谱的大数。

核心公式:

$$\mathrm{RMSD}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}\left|\mathbf{p}_i^{*}-\mathbf{t}_i\right|^2}$$

其中 $\mathbf{p}_i^{*}$ 是预测结构第 $i$ 个原子经过最优刚体变换后的坐标,$N$ 是参与原子数。最优变换通常用 SVD 解出(Kabsch 算法)。完整实现不长:

def ca_rmsd(pred_ca, true_ca): """pred_ca / true_ca: [N, 3] 的 Cα 坐标,返回 Kabsch 对齐后的 RMSD""" p = pred_ca - pred_ca.mean(axis=0) # 1) 质心平移到原点 t = true_ca - true_ca.mean(axis=0) u, _, vh = np.linalg.svd(t.T @ p) # 2) SVD 解最优旋转 r = u @ vh if np.linalg.det(r) < 0: # 3) 剔除反射,保证真旋转 u[:, -1] *= -1 r = u @ vh return float(np.sqrt(np.mean(np.sum((p @ r - t) ** 2, axis=1))))

三个容易踩的点:

  • 数字要配原子集一起报。惯例只用 Cα(AlphaFold 的 37 原子坐标数组里 Cα 在索引 1,排序见 alphafold/common/residue_constants.py);换成全原子,数值量级就变了,跨报告不可比。
  • 长度不匹配是前提问题:残基数不同时,先做序列比对建立残基对应,再喂坐标,不要直接硬比。
  • 对离群点敏感:一段 loop 偏了 10 Å 就能把全局 RMSD 拉高,而蛋白质其余部分可能完美。这就是“RMSD 看着不差、肉眼却不对劲”的根源之一——它把一切平均掉了。

一个有意思的细节:AlphaFold 仓库里 RMSD 出现在 relax 流程 alphafold/relax/relax.py,那里算的是力场最小化前后结构的“漂移量”,而且不做任何对齐——它回答的是“力场把结构拉动了多少”,不是“与参考多像”。所以别看见 RMSD 三个字就代入“与参考的相似度”,数字的含义由使用场景定义。

同一对结构为什么算出两个 RMSD

看到同对结构的两个数对不上,按顺序核对:Cα 还是全原子?Kabsch 对齐还是未对齐?掩掉了哪段残基?三件事对齐之后,数字就对上了。

lDDT 选型建议:免对齐的局部评分

RMSD 是“全分子一个数”,lDDT(局部距离差异测试)是“逐残基打分”。思路一句话:不看绝对坐标,只看“每两个点之间的距离”——预测结构的距离矩阵若和实验的相近,说明局部折叠是对的。由此白拿两个好处:免对齐(距离对平移旋转天然不变),且天然可拆到残基。

实现在 alphafold/model/lddt.py,评分规则非常直白:取实验结构里距离小于 cutoff(默认 15 Å)的原子对,比较预测与实验的距离差,按 0.5 / 1 / 2 / 4 Å 四档计分再平均:

$$\mathrm{lDDT}=\frac{1}{|\mathcal{P}|}\sum_{(i,j)\in\mathcal{P}}\frac{1}{4}\Big[\mathbb{1}\big(|\Delta d_{ij}|<0.5\big)+\mathbb{1}\big(|\Delta d_{ij}|<1\big)+\mathbb{1}\big(|\Delta d_{ij}|<2\big)+\mathbb{1}\big(|\Delta d_{ij}|<4\big)\Big]$$

其中 $\mathcal{P}$ 是待评分点对集合,$\Delta d_{ij}$ 为预测与实验的距离差。每档记 0.25,所以得分落在 0–1。

实际使用只需要两个[1, N, 3]坐标数组(Cα 即可)和一个掩码:

import jax.numpy as jnp from alphafold.model.lddt import lddt pred = jnp.asarray(pred_ca)[None, ...] # [1, N, 3] true = jnp.asarray(true_ca)[None, ...] # [1, N, 3] mask = jnp.ones((1, N, 1)) # 1 表示该原子存在 per_res = lddt(pred, true, mask, cutoff=15., per_residue=True) overall = lddt(pred, true, mask, cutoff=15., per_residue=False)

分值的非线性一眼看清

官方测试 alphafold/model/lddt_test.py 里的几个用例值得背下来:距离差约 1 Å 时得分 0.75,约 2 Å 时 0.5,约 4 Å 时 0.25,达到 5 Å 直接归零——误差翻倍,得分不是线性衰减,而是在档位边界上跳变。

两个容易被忽略的实现细节:

  • 这是“近似 lDDT”。源码 docstring 明说省略了原始 lDDT 的物理可行性校正项(键长违反等),所以数字适合同口径相对比较,别拿它和别人工具输出的绝对 lDDT 对表。
  • 没有可评点对的残基按满分算:某个残基 15 Å 内若没有成对原子,它的分数是 1。序列里舒展、无序区域越多,全局分被“抬”得越明显,读数时要回看逐残基输出。
  • 复杂度 O(N²):两张距离矩阵。几百残基的单体无压力,长链多聚体注意显存。

还有一个身份值得知道:在 AlphaFold 里lddt()不是评估工具,而是训练信号——alphafold/model/modules.py 中置信度头以逐残基 Cα lDDT(做了 stop_gradient)为回归目标。因此 pLDDT 可以理解为“模型提前预测自己会有多接近参考的 lDDT”。

无参考结构:pLDDT 与 ptM 判断预测质量

绝大多数蛋白没有实验结构,只能信模型的自评分。

单链看pLDDT:alphafold/common/confidence.py 的compute_plddt对每个残基输出 0–100 的置信度,仓库同时给出四档分类:

区间档位常见解读
90–100H局部结构大概率可靠
70–90M可用,建议交叉验证
50–70L低置信
<50D很可能无序或高柔性

置信不等于正确

pLDDT 是局部置信:高分说明局部距离网络大概率对,不保证全局摆放对——某个结构域方向放错时,域内每个残基的 pLDDT 照样很高。所以多聚体要看ptM / ipTM:alphafold/common/confidence.py 的predicted_tm_score给出整体 TM 分与仅针对界面的 ipTM,后者专门回答“界面摆得对不对”,预测结果里也带 ptm / iptm 字段(见 run_alphafold.py 的多聚体分支)。

常见坑:RMSD 与 lDDT 打架时怎么看

两个指标并排放一张表,当选型速查卡用:

对比项RMSDlDDT
对齐要求必须 Kabsch,否则数字无意义免对齐(距离不变性)
输出形态单个全局数全局 + 逐残基
数值范围Å,越小越好0–1,越大越好
最敏感于全局摆放错、局部离群点局部距离漂移
计算开销O(N)O(N²) 距离矩阵
典型用途整体折叠比较、聚类、漂移监控局部质量、逐残基定位

两种典型的“打架”场景:

  1. RMSD 大、逐残基 lDDT 普遍高:多半是全局摆放错位(域朝向、链配对),局部折叠其实没错。先修对齐,再下结论。
  2. RMSD 小、逐残基 lDDT 局部掉坑:核心叠得好,一段 loop 或尾部构象不同,全局数被“平均”掉了。此时逐残基输出是唯一能帮你定位的证据。

所以默认报告姿势:全局数(RMSD 或 lDDT)+ 逐残基 lDDT,前者下结论,后者找问题。长蛋白建议先按结构域分段看一眼——600 残基的全局单数字,信息量很有限。

快速上手清单 📋

  • 数字必须配“原子集 + 对齐方式”一起报:“Cα、Kabsch 对齐”或“未对齐”,否则数字不可复现。
  • 有参考结构:Cα RMSD 下全局结论,逐残基 lDDT 定位局部问题,两个一起报。
  • 无参考结构:单链看 pLDDT(D/L/M/H),多聚体界面看 ipTM,别用 pLDDT 代替整体判断。
  • ⚠️用 lDDT 前检查掩码与 cutoff:缺失原子靠 mask 排除,无成对残基按满分计,会抬高全局分。
  • 🔍怀疑预测有坑时先看逐残基曲线:多数局部错误在逐残基 lDDT 上一目了然,全局数经常把真相抹平。

延伸阅读:alphafold/model/lddt_test.py 里的官方测试用例是最紧凑的 lDDT 文档,每个用例对应一个距离差场景,值得逐条读一遍。

【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询