AlphaFold 结构比较实战:RMSD 和 lDDT 一次讲清怎么算、怎么读(附可跑代码)
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
你盯着查看器里叠在一起的两条骨架,几乎重合;可一算数字就翻车——同一对结构,你得到 Cα-RMSD 1.1 Å,同事给出 2.4 Å,差了一倍还多。先别怀疑代码,这不是算错,而是在 AlphaFold 里做结构比较绕不开的坎:RMSD(Root Mean Square Deviation,均方根偏差)和 lDDT(local Distance Difference Test,局部距离差异测试)这两把尺子,量的根本不是同一样东西。
两把尺子:结构比较常用的 RMSD 和 lDDT 在量什么
先弄清两把尺子各自在量什么,后面的数字才读得明白。📏
RMSD:先把结构摞齐,再量原子离原位多远
RMSD 的逻辑很直白:把预测结构经过平移和旋转,尽可能摞到实验结构上,再量对应原子离原位有多远。
公式不长,逐个变量说人话:
RMSD = sqrt( (1/N) · Σ [ (x_i − x'_i)² + (y_i − y'_i)² + (z_i − z'_i)² ] )
- N:参与计算的原子个数;
- x_i、y_i、z_i:预测结构里第 i 个原子的三维坐标;
- x'_i、y'_i、z'_i:实验结构里同一个位置原子的坐标;
- Σ 里那一大坨:每个原子三个方向偏离距离的平方和,开根号取平均,单位是 Å。
盲区也在"摞齐"这一步:对齐方式不同,数字就不同(开头 1.1 对 2.4 就是这么来的)。而且它对少数远端残基特别敏感,一条乱飞的末端 loop 就能把全局数顶上去。
lDDT:不动位置,只比"谁挨着谁"
lDDT 换了个思路:两个结构各待在自己的坐标系里,先把两两原子间的距离各算一张矩阵,再比矩阵差多少。刚体平移和旋转不改变结构内部距离,所以它天生不用对齐。
评分规则也简单(仓库实现里是四个档位):对应点对的距离差小于 0.5 Å 记 1 分,小于 1 Å 记 0.75,小于 2 Å 记 0.5,小于 4 Å 记 0.25,再大记 0 分;只统计实验结构里 15 Å 以内的点对。盲区是它只保"局部接触关系",而且距离矩阵要 O(N²),长序列跑起来比 RMSD 慢一档。
| 对比项 | RMSD | lDDT |
|---|---|---|
| 它量的是什么 | 对齐后对应原子的空间距离偏差 | 原子对距离差是否落在容差档位里 |
| 输出长什么样 | 一个 Å 数值,越小越像 | 0–1 分,越大越像 |
| 要不要先对齐 | 要,且对齐方式直接改变结果 | 不用,刚体变换不改内部距离 |
| 哪儿容易翻车 | 末端 loop、远端残基拖高全局数 | 距离矩阵 O(N²),长序列变慢 |
| 跑起来快不快 | 快,一次 SVD 出结果 | 慢一档,两两算距离 |
| 在项目里一般干啥用 | relax.py 里量化能量最小化前后挪动多少 | modules.py 里逐残基监督置信度头 |
3步算出 Cα-RMSD(含 Kabsch 旋转)
那这两个数到底怎么从坐标数组里算出来?
AlphaFold 内部把原子坐标存成 (残基数, 37, 3) 的数组,37 列对应residue_constants.atom_types里那张固定的原子表,CA 在第 1 列。RMSD 一般只用 Cα:既代表主链,又省掉一大半原子。分三步:
- 选原子:从 37 列里抠出 CA 列;
- 对齐:质心平移到原点,Kabsch 求最优旋转;
- 算分:对应原子偏差平方和取均值再开根号。
这段代码解决的是:给两组 Cα 坐标,自动完成平移、Kabsch 旋转,输出 Cα-RMSD。
import numpy as np from alphafold.common import residue_constants ca_idx = residue_constants.atom_order['CA'] # CA 在 37 列原子表里的列号,是 1 pred_ca = pred_pos[:, ca_idx, :] # pred_pos 形状 (残基数, 37, 3) def ca_rmsd(p, t): """p、t 均为 (残基数, 3) 的 Cα 坐标,返回 Cα-RMSD(Å)。""" # 先把两个结构都挪到原点,方便后面算旋转 p_c = p - p.mean(axis=0) t_c = t - t.mean(axis=0) # Kabsch 算法:对交叉协方差矩阵做 SVD,得到最优旋转 u, _, vh = np.linalg.svd(p_c.T @ t_c) rot = vh.T @ u.T # ⚠【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考