1. 药物相似性概述:定义、应用场景与挑战
做药物研发的朋友应该都有体会:一个新药从靶点发现到上市,动辄十年,烧掉十几亿美元。这中间90%的候选分子都在临床阶段失败了。那有没有办法在早期就筛选掉那些“注定失败”的结构?
药物相似性计算,说白了就是回答一个问题:两个分子有多像? 这个“像”的程度,可以用来做很多事情——找替代化合物、预测药效、排除毒性结构,甚至是判断一个分子有没有“成药性”。我最早接触这个领域还是在五年前做虚拟筛选的时候,当时导师丢给我一句:“这个lead结构活性不好,你找个相似的改改。” 一开始觉得挺简单,向量化算个距离就行,后来才发现里面的坑深着呢。
1.1 药物相似性的定义
先下个定义。药物相似性(Molecular Similarity)测量的是两个化学结构在特征空间中的接近程度。用数学语言讲:
- 把每个分子映射到一个特征向量(指纹、描述符或隐空间表示)
- 在两个向量之间定义一个距离或相似度度量
- 数值越高,说明两个分子越相似
举个最基础、最常用的例子——Tanimoto系数,也叫Jaccard系数。假设我们把分子编码成一个二值向量(bit vector),每个bit代表一个子结构是否存在。
分子A的指纹: 1 0 1 0 0 1 1 0
分子B的指纹: 1 1 1 0 0 0 1 0
Tanimoto(A,B) = AB_bits / (A_bits + B_bits - AB_bits)
= 3 / (4 + 3 - 3)
= 0.75
这么简单的公式,在真实的药物筛选场景中,依旧是指纹引擎的标配。你想想看,一个企业级数据库里可能有上亿个分子,如果不用这种计算量可控的系数,根本跑不动。
当然,特征工程本身也在不断演进。早期只有MACCS指纹(166个预定义结构键),后来有了ECFP(Extended-Connectivity Fingerprints)自动提取局部环境,再到今天图神经网络直接从分子图学习特征——相似性的“定义”越来越深了。
1.2 核心技术与挑战
聊几个我在项目中踩过的坑。
相似性 ≠ 活性相似性
结构相似的分子,活性可能差好几个数量级——这就是所谓“活性悬崖”(Activity Cliff)。很多初学者用Tanimoto > 0.85筛选出来的分子,拿去测活性发现完全不行。我建议你在实际项目中,一定不要把相似性度量当成预测活性的唯一标准。
指纹的选择直接影响结果。不同指纹捕捉的化学信息不同:
| 指纹类型 | 编码方式 | 维度 | 典型应用 |
|---|---|---|---|
| MACCS | 预定义子结构字典 | 166 bits | 快速初筛 |
| ECFP(4/6) | 圆形拓扑环境哈希 | 1024–4096 bits | 活性相似性、聚类 |
| FCFP | 功能团圆形环境 | 同上 | 药效团匹配 |
| Graph Isomorphism | WL子图核 | 变长 | 小数据集精细比较 |
我之前接过一个项目,用MACCS指纹做库筛选,召回率始终上不去。后来换成ECFP6,同样的Tanimoto阈值,命中率直接翻了一倍。所以这里有一个经验:ECFP系列是当前分子相似性计算的“黄金标准”。
计算效率是大规模应用的瓶颈。如果你手里有100万分子,两两计算相似度就是10^12次操作——按每秒10万次对比也要好几个月。解决方案一般是:
- 索引+近似最近邻搜索(ANN):用LSH(局部敏感哈希)或者HNSW图索引把候选集缩小。
- 碎片化+预计算:比如先按骨架聚类,再在族内做细粒度比较。
- 库-库相似性矩阵的稀疏化:只保留Top-K近邻。
提示:RDKit自带的GetSimilarityMatrix在分子数超过5万时会爆内存。我一般用BulkTanimotoSimilarity分块计算,配合numpy的矩阵运算,能压到几秒内搞定。
1.3 主要应用场景
- 虚拟筛选中的先导化合物发现
已知一个活性参考分子,用相似性检索从文库中挑出类似结构。这个场景在工业界的平均命中率(active rate)比随机库高出3–5倍。
- 毒性预测与脱靶效应评估
如果一个候选分子跟已知毒性骨架相似,大概率需要额外关注。我个人习惯在进入ADMET实验前先做一层相似性过滤,排除掉结构警示要素(Structural Alerts)频繁出现的分子。
- 骨架跃迁(Scaffold Hopping)
注意,这里要的不是“高度相似”,而是“活性相似但结构不同”。这就需要用到药效团相似性甚至图神经网络的隐空间。骨架跃迁是打破专利壁垒的常用手段,我们在项目中也常碰到。
- 化学库多样性分析
构建化合物库时,要保证库内的结构多样性,避免“都是小变化”的冗余结构。这时候需要计算所有针对之间的相似性矩阵,取平均或使用最大公共子结构相似度来做多样性评估。
1.4 当前面临的主要挑战
我把我团队去年遇到的一个典型案例分享给你:我们拿到了一组ChEMBL数据,结构相似度在0.9以上的分子有一大批,但活性从nM到μM不等。这暴露了一个核心问题——结构相似性不绝对等价于功能相似性。
具体来说:
- 活性悬崖——微小的结构修饰(如甲基位移)可能导致活性突变,传统指纹很难捕捉这种“边界效应”。
- 三维构象差异——二维指纹完全一样,分子在蛋白口袋中的姿态却天差地别。这也是为什么说“配体相似性”要结合蛋白结构和结合模式来分析。
- 属性过少或过多——指纹太短会丢失鉴别信息,太长则带来噪声和稀疏性问题。比如MACCS的166位已经不够用了,而ECFP的4096位又容易导致“维度灾难”。
- 评估标准不统一——不同论文用不同的相似度阈值、不同的测试集、不同的活性检测方法,实验结果很难直接横向对比。
我曾经在做一个跨库相似性分析时,发现同样的ECFP4指纹,用Tanimoto算出来A和B相似度0.7,换成Dice系数(另一种适用于二值向量的相似度),直接变成0.82。你看,连度量方式的选择都会影响结论。所以在实际建模中,一定要明确你们团队的标准相似度度量“是什么”,然后所有人固定下来。
1.5 本章知识体系概览
为了让整体脉络更清楚,我画了一张结构图,把药物相似性计算的核心要素、面临的主要挑战以及典型的应用方向串起来。你可以把它当作本章乃至整个课程的知识骨架。
注意事项:本章知识体系图中将“定义 & 度量”、“核心挑战”、“应用场景”列为三大支柱。进入后续章节前,建议你先理解这三种维度之间的关联逻辑——定义的细节直接决定了你会遇到什么挑战,而挑战又影响你如何落地应用。不要孤立地学指纹或算法。
嗯,这一章我们主要把“药物相似性计算”是什么、用在哪儿、难在哪梳理了一遍。从定义出发,我强调了结构相似 ≠ 活性相似,这是很多人入坑后容易忽视的基础认知。有了这个基础,接下来的指纹工程、图特征提取、大规模检索和实操代码才有了落地的意义。