2、虚拟筛选简介:原理、流程与常用方法归纳总结
虚拟筛选,说白了就是用计算机从海量化合物里"淘金"。你想想看,传统实验筛几千个化合物可能要折腾好几个月,而虚拟筛选几天就能跑完一轮。我2018年做一个激酶项目时,化合物库里有300万个分子,实验筛一轮的成本高得吓人。后来用虚拟筛选先过滤一遍,把候选范围压缩到3000个,再用实验验证。最终命中率比随机筛选高了将近10倍。
它的原理其实不复杂。简单来说,就是利用计算模型模拟分子与靶点之间的相互作用,从中挑出最可能结合、活性最好的那些分子。就像你找钥匙不用一把一把试,而是先看锁芯的形状再挑可能匹配的钥匙。嗯,道理就是这么直接。
2.1 虚拟筛选的核心思想
虚拟筛选能跑通,依赖一个基本假设:分子的结构决定了它的性质和功能。如果我们知道靶点的三维结构,或者手里有一批已知的活性分子,就能建立一个预测模型,从化合物库里快速找出潜力股。
我把它的核心逻辑拆成三步:
- 表征——把分子和靶点用计算机能理解的方式表示出来(比如指纹、图结构、3D坐标)。
- 预测——用模型估算分子与靶点的结合强度或活性概率。
- 排序——把所有分子按预测得分排队,挑出头部候选做实验验证。
一组真实数据对比:某制药公司的内部统计显示,虚拟筛选可以将实验筛选的命中率从0.1%~1%提升到5%~30%,前期成本降低约80%。但注意,这只是"提升概率",不是"保证成功"。
我刚开始做虚拟筛选时,总觉得把化合物往软件里一丢就能出结果。后来被现实狠狠教育了一顿——模型预测的"高活性"分子,到了实验台上可能一点反应都没有。为什么?因为你用的表征方式可能丢掉了关键信息,或者训练数据本身就有偏差。嗯,这个坑我后面会细说。
2.2 核心流程:从靶点到候选分子
一个完整的虚拟筛选流程长什么样?我习惯把它画成下面这张图。你看一眼就能明白,它不是单个步骤,而是一条环环相扣的流水线。
每个步骤都有自己的"坑",我捡几个重点说说:
- 靶点准备:PDB 里的蛋白结构经常缺氢、有异构问题,甚至活性位点附近的水分子位置都不对。我之前直接拿原始结构做对接,筛选出来的分子在实验里全都没活性。后来才查出来,是几个关键水分子没处理,氢键网络完全错了。
- 化合物库过滤:一定要做类药性过滤(比如 Lipinski 五规则)。200 万分子里有一半可能根本不适合做药,先砍掉它们能省大量算力。
- ADMET 预测:很多新手只看结合能,忽略毒性。我见过一个项目,候选分子对接得分特别高,但肝毒性预测一塌糊涂,最后只能全部放弃。
2.3 常用方法:两大阵营
虚拟筛选的方法分两大类:基于配体的(LBVS)和基于结构的(SBVS)。它们的出发点完全不一样。
| 维度 | 基于配体的虚拟筛选 (LBVS) | 基于结构的虚拟筛选 (SBVS) |
|---|---|---|
| 核心原理 | 从已知活性分子提取规律,预测新分子 | 直接模拟分子与靶点的空间结合 |
| 需要什么 | 一批已知活性/非活性分子 | 靶点的三维结构(晶体或计算模型) |
| 常用技术 | 药效团模型、QSAR、分子相似性搜索 | 分子对接、从头设计、分子动力学 |
| 优势 | 不需要靶点结构,计算快 | 能发现全新骨架,可解释性强 |
| 劣势 | 容易受训练数据偏差影响,难以发现新骨架 | 依赖靶点结构质量,计算成本高 |
| 典型场景 | 已知靶点有大量活性数据,做先导化合物优化 | 新靶点或孤儿靶点,想找全新苗头化合物 |
我个人习惯的做法是:先用 LBVS 做初筛,把千万级化合物快速压缩到万级;再用 SBVS 做精细筛选,用分子对接逐个评估。这样既省时间,又保精度。你想想看,如果一上来就直接对 300 万个分子做对接,算力成本一下子就上去了。
对了,分子对接的命令行长什么样?给你看一个 AutoDock Vina 的典型调用:
vina --receptor protein.pdbqt \
--ligand ligand.pdbqt \
--center_x 10.0 --center_y 20.0 --center_z 30.0 \
--size_x 20 --size_y 20 --size_z 20 \
--exhaustiveness 8 \
--num_modes 9 \
--out docking_results.pdbqt
这里 --center_x/y/z 是活性位点中心,--size 是搜索盒尺寸,--exhaustiveness 是搜索精度。我一般设成 8 到 12,再高收益就不明显了。
2.4 分子特征学习:虚拟筛选的"引擎升级"
传统方法有个天花板:特征需要人工设计。比如做 QSAR,你得绞尽脑汁想用什么描述符——是算分子量、LogP、氢键供体数目,还是用摩根指纹、MACCS 键?选什么样的特征,直接决定了模型的上限。
分子特征学习就不一样了。它让模型自己从数据里"学"出有用的特征表示。你不用手写分子描述符,而是把分子结构喂给模型,让它自动提取对预测活性最关键的模式。
拿 RDKit 举个例子,传统做法是先算指纹:
from rdkit import Chem
from rdkit.Chem import AllChem
smiles_list = ["CC(=O)Oc1ccccc1C(=O)O",
"c1ccccc1",
"CCN(CC)CC"]
mols = [Chem.MolFromSmiles(s) for s in smiles_list]
# 计算2048位摩根指纹
fps = []
for mol in mols:
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)
fps.append(fp)
print(f"生成了 {len(fps)} 个分子指纹")
print(f"指纹长度: {len(fps[0])} 位")
这种指纹是固定规则算出来的,不会根据任务自适应调整。而分子特征学习模型——比如图神经网络——会把分子看成一张图(原子是节点,键是边),在训练过程中自动学到对活性预测最有区分力的结构模式。
我的一点经验:在做虚拟筛选时,别急着上复杂模型。先用 RDKit 指纹 + 随机森林跑一个 baseline,跑通了再换成图神经网络。这样你能快速验证数据质量,也能给后续的"黑盒"模型提供一个对比基准。
2.5 实战中容易踩的坑
做虚拟筛选这几年,我踩过的坑少说也有七八个。挑三个最常见的提醒你:
坑一:蛋白准备不充分
我曾经因为活性位点附近的水分子没处理,氢键网络完全错了,筛出来的分子在实验里全都没活性。后来每做一个项目,都会手动检查:加氢、优化侧链取向、确认质子化状态。这一步偷懒,后面全是白干。
坑二:训练数据分布偏差
用 LBVS 时,如果已知活性分子全是某个化学骨架的类似物,模型学到的"活性规律"其实只是"长得像某个骨架"。换一个全新的骨架,预测就完全失灵了。我建议训练数据里尽量覆盖多样化的骨架,或者用聚类方法做数据增强。
坑三:过分相信打分函数
分子对接的打分函数有很多近似假设,比如忽略溶剂效应、忽略蛋白柔性。打分高的分子不一定真能结合,打分低的也不一定没活性。我现在的做法是:不只看绝对分数,而是看排序一致性——如果同一个分子在不同对接软件里都排在前列,那它才是真正值得关注的候选。
虚拟筛选不是"一键出药"的魔法,它是一个用计算缩小搜索范围的工具。工具用得好,能大幅提升研发效率;用得不好,就是"垃圾进,垃圾出"。嗯,关键还是理解它背后的原理和局限。
这一章我把虚拟筛选的原理、流程和主流方法过了一遍。从靶点准备到候选化合物验证,每一步都有大量细节可以深挖。后面几章我们会聚焦在分子特征学习这个方向,看看它怎么从底层改变虚拟筛选的效率和精度。