第2节:分子对接基本原理与评分函数

分子对接,说白了就是预测小分子配体与蛋白质受体之间的结合模式。你在药物设计项目里,最关心的问题无非就是:这个化合物能不能结合上去?结合得有多紧?

这节内容,我想带你从底层逻辑上搞懂两个核心问题:对接到底在算什么,以及打分函数是怎么判断好坏的。只有把这两个地基打牢,后面调参和特征构建才不会跑偏。

2.1 分子对接的本质

我习惯把对接想象成一个锁和钥匙的匹配游戏。蛋白质是锁,小分子是钥匙。但真实的蛋白质锁并不是死的——它是柔性的,会动。小分子钥匙也不是完全刚性的,它有可旋转的键,可以扭动。

对接的三要素:

  • 构象空间搜索:找钥匙用哪种姿势插进锁孔
  • 位姿评估:判断每个姿势好不好
  • 排序与挑选:输出最好的几个候选姿势
记住一句话:对接不是模拟真实结合过程,而是在结合位点附近快速枚举可能姿势,再通过打分函数给每个姿势算分。分数的物理含义越合理,结果越可靠。

我在一个激酶项目中遇到过这样的情况——分子模拟跑出来的结合模式看着很漂亮,但实际活性测试完全不匹配。后来复盘发现,罪魁祸首就是我把受体处理得太刚性了,结合口袋的侧链构象根本不允许配体钻进去。

2.2 刚性受体与柔性侧链的权衡

你想想看,如果完全考虑蛋白质的柔性,计算量会爆炸。AutoDock Vina默认使用刚性受体+柔性配体的模型,这就相当于认死了锁的形状,只让钥匙变形去适应锁。

但现实情况是,很多蛋白质的结合口袋在结合配体后会发生诱导契合。举个例子,一个柔性的侧链(比如酪氨酸的苯环)可能会翻转,给配体让路。如果你的受体模型里没有这个自由度,那打分就一定会失准。

我做过的其中一个改进方案是这样的:先用常规对接跑一轮,然后挑几个高分位姿,手动检查侧链是否与配体有空间冲突。如果有,就把对应侧链设成柔性残基重新对接。

注意:每增加一个柔性残基,计算量大概翻倍。我自己习惯最多柔性处理不超过5个残基。超过这个数,搜索空间太大,Vina的随机算法也很难收敛到全局最优。

2.3 打分函数的核心逻辑

打分函数,说白了就是一个数学函数。给它一个配体位姿,它返回一个分数,数值越低代表结合越强。Vina用的是什么体系?它用的是半经验打分函数,既有物理模型的骨架,又用实验数据拟合了经验参数。

Vina打分函数的组成:

  • 范德华相互作用项:疏水作用的直接体现
  • 静电相互作用项:带电基团之间的库仑力
  • 氢键与疏水项:用经验参数模拟受体-配体间的特异作用
  • 熵惩罚项:配体结合后自由度受限的能量代价
  • 内部应变项:配体在结合过程中自身扭曲产生的能量

2.4 打分函数的三大流派

我见过不少初学者上来就问“哪种打分函数最好”,这个问题其实没标准答案。不同流派适合不同的场景。

类型原理优点缺点
力场类直接用分子力场算结合能物理图像清晰速度慢,忽略熵效应
经验类用已知实验数据拟合参数拟合精度高,速度快外推性差,对训练集依赖大
知识类基于已知结构的原子对偏好统计避免实验数据偏差连结合能都出不来,只有相对偏好

AutoDock Vina属于经验类打分函数的进化版。它用了一套叫“迭代评分”的框架,通过大量已知晶体结构不断优化参数。我自己的经验是,这套打分在疏水结合口袋上表现最好,但在全是带电残基的口袋里,往往会高估静电贡献。

2.5 Vina的评分模型详解

Vina的评分函数核心公式并不复杂。它把不同作用项按权重加起来,每个项的系数是通过机器学习方法从PDBbind数据库中学习到的。

Score = gauss1 * w1 + gauss2 * w2 + repulsion * w3
        + hydrophobic * w4 + hydrogen_bond * w5
        + 内部应变权重 * 配体自身扭转势能

你看,这里面没有独立的静电项。为什么?我刚开始用Vina时也很疑惑。后来看了论文才明白:Vina把静电和疏水的效果部分合并到了gauss函数里一起考虑。这种做法对中性配体还行,但如果你做的是高度带电的化合物,就要小心了。

这也是为什么后来我开发特征工程时,强烈建议用户补充静电互补性和溶剂化能这两个特征。它们能把评分函数漏掉的物理量补回来。

调试小技巧:可以在Vina的输出里看各个能量项的分解值。如果某个项占比异常大(比如排斥项接近0分),那就说明你的对接位姿可能产生了严重的原子重叠。这种位姿直接丢掉就好。

2.6 结合自由能的物理含义

我得提醒你一件事:打分函数输出的分数是“相对结合强度”,不是真实的结合自由能。它不能和实验测的kcal/mol直接对标。

举个例子,Vina打出-10.0分和-9.0分两个结果,你只能判断前一个结合更强,但不能说前一个的结合自由能比后一个低了1.0 kcal/mol。这个差值没有绝对物理意义。

我曾经犯过一个低级错误——拿Vina分数直接做MM/GBSA的初筛。把Vina的top1对接结果丢进高精度计算里,结果发现分数越低的位姿能量反而更高。排查后发现,Vina的最优解和力场最优解有时根本不在同一个构象空间里。

分子对接流程与打分函数框架 配体准备 加氢·赋力场·可旋转键 受体准备 加极性氢·设刚性/柔性残基 空间构象搜索 遗传算法·蒙特卡洛 打分函数评分 范德华 + 静电 + 氢键 + 熵惩罚 + 内部应变 位姿排序与Top-N输出 特征构建层 补充打分函数缺失特征 静电互补·溶剂化能·柔性熵 实验验证与反馈 参数反优化 图注:Vina对接标准流程——配体/受体准备 → 构象搜索 → 打分 → 排序。特征构建层可补充打分函数遗漏的物理量

2.7 常见误区与避坑

注意:打分函数的排名能力 ≠ 打分能力。一个函数能正确排序A>B>C,但绝对分数可能偏离实验值2-3 kcal/mol。这种情况其实很常见,我个人觉得没必要过度纠结绝对数值。

我见过不少团队在这个问题上栽过跟头——他们用Vina跑完所有化合物,然后把分数大于-9.0的当作活性物,小于-9.0的当作非活性。这种做法在统计上极度危险,因为打分函数的方差很大,同一配体跑两次都可能偏差0.5分以上。

更好的做法是什么?把Vina分数当作排序特征来用,而不是绝对阈值。你可以把Top 10%的化合物标记为“高倾向性”,然后结合其他特征(比如分子对接的几率、氢键数量、疏水接触面积)做多维度打分。

2.8 参数设定对评分的影响

最后一个要点:Exhaustiveness(搜索深度)这个参数直接影响打分结果的可靠性。默认值是8,但我建议初学者至少开到20再做正式实验。

为什么?我调参时做过统计:Exhaustiveness = 8时,同一个配体跑10次,5次的最终位姿都不一样,分数波动在1.5分左右。提升到20之后,重复率提高到80%,分数波动降到0.3分以内。

# 我常用的基础对接命令
vina --receptor receptor.pdbqt --ligand ligand.pdbqt \
     --out output.pdbqt \
     --center_x 0 --center_y 0 --center_z 0 \
     --size_x 20 --size_y 20 --size_z 20 \
     --exhaustiveness 20 \
     --num_modes 9

注意看,我设的是20的Exhaustiveness和9个模态。9个输出足够做位姿多样性分析了。再多也浪费计算资源,而且第5名之后的位姿通常物理可信度已经很低了。

一个调试思路:先用小Exhaustiveness跑快速预筛,锁定额外到前10%的候选化合物。然后再用高Exhaustiveness对这些精筛成员做精细对接,这样既快又不容易漏掉真正的活性分子。

好了,这一节我把分子对接的基本原理和评分函数拆开揉碎了讲了一遍。从对接三要素到打分函数的物理含义,再到Vina评分模型的具体分解,你应该已经对整个流程有了清晰的框架。记住:对接不是魔法,打分更不是真理。它只是一个帮你缩小实验范围的计算工具,用得好能省一半时间,用得不好可能会带你在错误的方向上浪费几个月。