2. 分子描述符基础:从分子到数字的“翻译官”
说起来你可能不信,我刚开始做药物化学那会儿,面对一个分子只会盯着它的结构式发呆——这个环那个键,直觉上觉得它水溶,但说不清为什么。直到我接触了分子描述符,才明白原来分子可以“翻译”成一组数字,然后用数学说话。这章我们就聊聊这个“翻译官”到底是什么、有哪些类型、能用在哪儿。
2.1 什么是分子描述符?
分子描述符,说白了就是把分子的化学信息转化成数值。
一个分子,你可以用它的分子量、氢键供体数、LogP、指纹片段……这些数字就是描述符。它们就像身份证上的身高体重,虽然不能代表全部,但已经能帮你快速判断这个分子大概是什么“性格”。
举个我自己的例子。有一次我要筛选一批候选化合物,看它们能不能透过血脑屏障。如果一个个去合成再测,成本高得吓人。我用了几十个描述符(比如极性表面积、LogD、氢键数量)建了个简单模型,直接筛掉了80%的分子。后来实验验证,这个筛选准确率超过70%。嗯,这就是数字的力量。
2.2 常见描述符类型及应用场景
描述符按维度可以分成四大类,我整理了个表,方便你对照。
| 类型 | 典型描述符 | 物理化学意义 | 应用场景 |
|---|---|---|---|
| 拓扑描述符 | 分子量、原子数、键数、Zagreb指数、Wiener指数 | 反映分子大小、分支度、连接方式 | 骨架相似性搜索、分子柔性估计 |
| 电子描述符 | 部分电荷、HOMO-LUMO能隙、极化率、偶极矩 | 反映电荷分布、反应活性、轨道能量 | 反应性预测、pKa估算、分子间作用力分析 |
| 几何描述符 | 溶剂可及表面积(ASA)、分子体积、回转半径、三维形状矩 | 反映三维形状、表面特性、空间位阻 | 蛋白-配体对接打分、药效团匹配、构象筛选 |
| 疏水描述符 | LogP、LogD、水溶性(LogS)、疏水表面积 | 反映脂溶性、水分配倾向 | ADME预测(吸收、血脑屏障、毒性),是ADMET中最关键的描述符系列 |
2.3 描述符的计算工具
现在最常用的开源工具是RDKit和OpenBabel。我一般用RDKit,因为它Python接口友好,处理大批量分子也不慢。下面给个RDKit计算常见描述符的代码片段:
from rdkit import Chem
from rdkit.Chem import Descriptors, Lipinski, MolSurf
mol = Chem.MolFromSmiles('CC(C)C1=CC=C(C=C1)C(=O)O')
mw = Descriptors.ExactMolWt(mol)
logp = Descriptors.MolLogP(mol)
hbd = Lipinski.NumHDonors(mol)
hba = Lipinski.NumHAcceptors(mol)
tpsa = MolSurf.TPSA(mol)
print(f'MW: {mw:.2f} LogP: {logp:.2f} HBD: {hbd} HBA: {hba} TPSA: {tpsa:.2f}')
输出结果大致像这样:
MW: 164.10 LogP: 2.30 HBD: 1 HBA: 2 TPSA: 37.30 Ų
注意:同一个分子用不同软件算的TPSA可能有1-2 Ų的差异,这是正常的。我以前吃过这个亏,用RDKit算了一组,又用OpenBabel算了一组,混到一起建模结果乱套了。所以建议统一一个工具,贯穿整条工作流。
2.4 避坑指南:描述符选择与标准化
- 数量不是越多越好——我曾经一股脑算过1000多个描述符,结果模型过拟合得一塌糊涂。有效描述符通常20-50个就够。
- 关联性要警惕——比如分子量和LogP经常高度相关,两个都放进去等于在模型里重复投票。
- 数值尺度差异——分子量动辄几百,而氢键数只有0-10。不归一化的话,PCA或距离计算会被大数值描述符主导。我习惯所有描述符都标准化到均值为0、标准差为1。
- 缺失值处理——有些分子可能算不出某些描述符(比如含金属配合物),建议用中位数填充或直接删除该描述符。
2.5 描述符分类与应用流程图
下面这张图把分子结构到描述符再到应用场景的路径画了出来,帮你快速建立整体印象。
你看,整个链条其实很清晰。拿到一个分子,先根据问题选择重点描述符类型(比如做ADMET优先疏水和拓扑),然后计算、标准化,最后就可以交给PCA或机器学习模型了。下一节我们会详细讲如何用PCA对这些描述符做质控——也就是找到哪些描述符真正携带信息、哪些是噪音。