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–100 | H | 局部结构大概率可靠 |
| 70–90 | M | 可用,建议交叉验证 |
| 50–70 | L | 低置信 |
| <50 | D | 很可能无序或高柔性 |
置信不等于正确
pLDDT 是局部置信:高分说明局部距离网络大概率对,不保证全局摆放对——某个结构域方向放错时,域内每个残基的 pLDDT 照样很高。所以多聚体要看ptM / ipTM:alphafold/common/confidence.py 的predicted_tm_score给出整体 TM 分与仅针对界面的 ipTM,后者专门回答“界面摆得对不对”,预测结果里也带 ptm / iptm 字段(见 run_alphafold.py 的多聚体分支)。
常见坑:RMSD 与 lDDT 打架时怎么看
两个指标并排放一张表,当选型速查卡用:
| 对比项 | RMSD | lDDT |
|---|---|---|
| 对齐要求 | 必须 Kabsch,否则数字无意义 | 免对齐(距离不变性) |
| 输出形态 | 单个全局数 | 全局 + 逐残基 |
| 数值范围 | Å,越小越好 | 0–1,越大越好 |
| 最敏感于 | 全局摆放错、局部离群点 | 局部距离漂移 |
| 计算开销 | O(N) | O(N²) 距离矩阵 |
| 典型用途 | 整体折叠比较、聚类、漂移监控 | 局部质量、逐残基定位 |
两种典型的“打架”场景:
- RMSD 大、逐残基 lDDT 普遍高:多半是全局摆放错位(域朝向、链配对),局部折叠其实没错。先修对齐,再下结论。
- 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),仅供参考