4. 分子描述符计算

在QSAR建模中,分子描述符是把“化学结构”翻译成“数值向量”的桥梁。模型看到的从来不是苯环、羟基或氢键受体,而是一列列数字。因此,描述符计算的质量直接决定了后续特征选择、模型训练和活性预测的可解释性。本节围绕四类最常用的描述符——理化性质、拓扑描述符、分子指纹,以及RDKit与PaDEL两套实操工具展开,目标是让读者能够独立完成一次“从SMILES到描述符矩阵”的完整计算。

一、四类描述符的定位与差异

理化性质描述符直接对应分子的宏观物理化学行为,例如分子量(MolWt)、脂水分配系数(MolLogP)、拓扑极性表面积(TPSA)、氢键供体/受体数(NumHDonors/NumHAcceptors)、可旋转键数(NumRotatableBonds)等。它们数值连续、物理意义明确,是ADMET性质预测和类药性规则(如Lipinski五规则)的基础。

拓扑描述符从分子图的连接关系出发,不依赖三维构象。常见的有Wiener指数、Balaban指数、Kappa形状指数、Chi系列(如Chi0v、Chi1v)以及价连接性指数。它们对分子大小、分支程度和环结构敏感,适合刻画结构骨架差异。

分子指纹则是把结构编码为定长或变长的位串。MACCS Keys为166位,Morgan/ECFP为圆形指纹,通过半径参数控制邻域范围,RDKit指纹为路径型。指纹适合相似性搜索、聚类和基于片段的活性分类,但单独用于回归时解释性较弱。

三类描述符并非互斥。实际建模中常将理化性质与拓扑描述符拼接为连续特征,再与指纹或指纹降维结果组合,形成混合特征矩阵。

从SMILES到描述符矩阵的计算链路 输入 SMILES / SDF 分子解析 RDKit Mol对象 理化性质描述符 拓扑描述符 分子指纹 MolWt, LogP TPSA, HBD/HBA Chi, Kappa Wiener, Balaban MACCS, Morgan RDKit FP RDKit(Python) • Descriptors.MolWt / MolLogP / TPSA • rdMolDescriptors.CalcNumHBD / CalcTPSA • AllChem.GetMorganFingerprintAsBitVect PaDEL-Descriptor(Java) • 命令行批量计算 1D/2D 描述符 • 支持 SDF / SMILES 输入 • 输出 CSV 描述符矩阵 特征矩阵 X(n × p) 行=分子,列=描述符,用于QSAR建模

二、RDKit实操:从SMILES到描述符

RDKit是Python生态中最常用的化学信息学工具。以下示例以阿司匹林(乙酰水杨酸)的SMILES为例,演示如何计算理化性质与Morgan指纹。示例参数与输出为教学演示,实际数值以运行环境为准。

from rdkit import Chem
from rdkit.Chem import Descriptors, rdMolDescriptors, AllChem

smi = "CC(=O)Oc1ccccc1C(=O)O"
mol = Chem.MolFromSmiles(smi)

# 理化性质
mw   = Descriptors.MolWt(mol)          # 分子量
logp = Descriptors.MolLogP(mol)        # 脂水分配系数
tpsa = rdMolDescriptors.CalcTPSA(mol)  # 拓扑极性表面积
hbd  = rdMolDescriptors.CalcNumHBD(mol)
hba  = rdMolDescriptors.CalcNumHBA(mol)
rotb = rdMolDescriptors.CalcNumRotatableBonds(mol)

# Morgan指纹(半径2,2048位)
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
bits = fp.ToBitString()
print(mw, logp, tpsa, hbd, hba, rotb)
print("指纹非零位数:", fp.GetNumOnBits())

运行后应得到一组连续数值和一条2048位指纹。判断计算是否正常,可检查:分子量是否在合理范围(阿司匹林约180)、TPSA是否为正、指纹非零位数是否远小于2048(稀疏性正常)。若MolFromSmiles返回None,说明SMILES不合法,需先清洗输入。

三、PaDEL实操:批量计算与命令行

当分子数量达到数百至数万时,PaDEL-Descriptor的批量能力更高效。它基于Java,支持SDF或SMILES列表输入,输出CSV格式的描述符矩阵。典型命令如下:

java -jar PaDEL-Descriptor.jar \
  -removesalt -standardizenitro -detectaromaticity \
  -descriptortypes descriptors.xml \
  -dir ./molecules \
  -file ./output/descriptors.csv

其中-removesalt去除盐离子,-standardizenitro标准化硝基,-detectaromaticity检测芳香性。输出CSV第一列为分子名,后续每列为一个描述符。PaDEL默认计算约1800个1D/2D描述符,包括理化性质、拓扑指数和指纹类特征。使用时需注意:PaDEL对输入分子的价态和芳香性判断较敏感,建议先用RDKit统一标准化后再送入PaDEL。

四、描述符计算中的常见问题与判断

第一,缺失值与无穷值。部分拓扑描述符在特定结构下可能返回NaN或Inf,需在建模前用numpy.nan_to_num或中位数填充处理。第二,量纲差异。分子量在百量级,而某些指数可能达到数千,标准化(Z-score或Min-Max)是必要步骤。第三,指纹与连续描述符的拼接。指纹位串为0/1,连续描述符为实数,直接拼接会导致尺度失衡,建议先对连续部分标准化,再与指纹合并。第四,可复现性。RDKit与PaDEL版本不同可能产生细微数值差异,应在项目中固定版本并记录参数。

计算完成后,建议先做一次描述符矩阵的快速体检:检查行数是否等于分子数、列数是否稳定、是否存在全零列或常数方差列。全零列对模型无贡献,应剔除;常数方差列同样应移除。这一步能避免后续建模中的大量无效计算。

五、实操检查清单

检查项判断标准处理方式
SMILES解析成功率≥95%清洗非法SMILES,记录失败列表
描述符缺失率单列缺失<5%中位数填充或剔除该列
无穷值0个替换为NaN后统一填充
常数方差列0列直接删除
指纹非零位比例5%~30%过低可减小nBits,过高可增大半径
版本记录RDKit/PaDEL版本明确写入项目README

完成本节后,读者应能独立完成一次从SMILES到描述符CSV的完整计算,并对结果做基本质量判断。描述符矩阵是QSAR工程的第一份“数据资产”,它的规范性会直接影响后续特征选择、模型训练与活性预测的可靠性。