分子结构的数学表示
为了让计算机识别化学分子结构,我们需要设计一套转换规则,把分子的化学信息转为机器学习模型可以处理的数学对象。
对人来说,一个分子可以用结构式、球棍模型、分子式或名称表示;但对模型来说,输入通常只能是向量、矩阵、张量或图。因此分子表示的核心问题是:
如何把原子、化学键、空间构象和化学性质编码成数学数据?
常见表示方式可以分为三类:
| 表示方式 | 典型形式 | 适合模型 |
|---|---|---|
| 序列表示 | SMILES、SELFIES、InChI | RNN、Transformer、语言模型 |
| 二维图表示 | 节点特征、边索引、边特征 | GCN、GAT、GIN、MPNN |
| 三维结构表示 | 原子坐标、距离矩阵、空间图 | SchNet、DimeNet、EGNN |
分子数据中包含哪些信息
一个分子通常至少包含以下信息:
| 信息 | 示例 | 数学表示 |
|---|---|---|
| 原子类型 | C、N、O、Cl | one-hot 向量或整数编号 |
| 化学键 | 单键、双键、芳香键 | 边特征向量 |
| 连接关系 | 哪两个原子相连 | 邻接矩阵或边索引 |
| 原子属性 | 电荷、价态、杂化方式 | 节点特征 |
| 分子整体属性 | 分子量、LogP、TPSA | 全局特征 |
| 三维坐标 | 坐标矩阵 | |
| 构象信息 | 键长、键角、二面角 | 距离或几何特征 |
在分子性质预测任务中,模型的目标通常可以写成:
其中
序列表示
SMILES
序列表示把分子写成字符串。最常见的是SMILES,全称是 Simplified Molecular Input Line Entry System。它用一行字符串表示分子结构,例如:
| 分子 | SMILES |
|---|---|
| 甲烷 | C |
| 乙醇 | CCO |
| 苯 | c1ccccc1 |
| 乙酸 | CC(=O)O |
以乙醇 CCO 为例,其中每个字符表示原子,字符之间隐含化学键。:
C - C - OSMILES 可以被看作一个 token 序列,其中
然后可以将每个 token 映射成向量:
最终得到序列矩阵:
其中
SMILES 的优缺点
优点:
- 简洁,易于存储和传播。
- 可以直接用于 NLP 模型。
- 大量化学数据库都支持 SMILES。
缺点:
- 同一个分子可能有多个合法 SMILES。
- 字符串相似不一定代表分子结构相似。
- 三维构象信息通常缺失。
- 模型需要自己从序列中学习图结构。
例如乙醇可能写作:
CCO
OCC这两个 SMILES 表示同一个分子,但序列方向不同。
SELFIES
SELFIES 是一种更稳定的分子字符串表示。它的特点是生成的字符串更容易对应合法分子,因此常用于分子生成任务。
例如乙醇可以表示为:
[C][C][O]与 SMILES 相比,SELFIES 更适合生成模型,因为随机生成的 SELFIES 更可能被解析为有效分子。
分子指纹表示
分子指纹将分子转换为固定长度的二进制向量或数值向量。例如:
其中每一位表示某类子结构是否出现。
MACCS 指纹
MACCS 指纹通常为 166 位,每一位对应一个预定义的化学子结构。实际使用中不需要手动定义这些位,RDKit 可以自动计算。
Morgan 指纹
Morgan 指纹也叫 ECFP,是分子机器学习中非常常用的指纹。它是以每个原子为中心,逐层扩展邻域,提取局部子结构。
设第
第
最后把所有原子的局部结构哈希到固定长度向量中。
这种过程与 GNN 的消息传递很像:
| Morgan 指纹 | GNN |
|---|---|
| 逐层扩展原子邻域 | 逐层聚合邻居信息 |
| 哈希局部子结构 | MLP 学习消息表示 |
| 得到固定长度指纹 | 得到节点或图向量 |
指纹表示的优点是简单、高效、适合传统机器学习模型;缺点是表达能力依赖人工设计和哈希规则,难以端到端学习。
二维图表示
分子天然可以表示为图:
其中:CCO 可以表示为:
节点的描述
节点特征用于描述每个原子的化学属性。设分子有
其中第
常见原子特征:
| 特征 | 说明 | 表示方式 |
|---|---|---|
| 原子类型 | C、N、O、S、Cl 等 | one-hot |
| 原子序数 | 元素周期表编号 | 整数或归一化数值 |
| 度 | 与几个原子相连 | 整数 |
| 形式电荷 | formal charge | 整数 |
| 芳香性 | 是否芳香原子 | 0/1 |
| 杂化方式 | sp、sp2、sp3 | one-hot |
| 隐式氢数量 | 连接的 H 数量 | 整数 |
| 是否在环中 | ring membership | 0/1 |
例如只考虑原子类型:
ATOM_TYPES = [C, N, O, F]那么:
| 原子 | one-hot |
|---|---|
| C | [1, 0, 0, 0] |
| N | [0, 1, 0, 0] |
| O | [0, 0, 1, 0] |
| F | [0, 0, 0, 1] |
乙醇 CCO 的节点特征矩阵可以写成:
边的描述
邻接矩阵
如果分子有
其中:
乙醇有 3 个重原子,连接关系为:
0: C
1: C
2: O邻接矩阵为:
邻接矩阵直观,但对于大图比较浪费空间。因为大多数分子图很稀疏,矩阵中多数元素是 0。
邻接列表
在 PyTorch Geometric 中,更常用边索引 edge_index 表示图结构。对无向边,需要写成两个方向
edge_index = [
[0, 1, 1, 2],
[1, 0, 2, 1],
]第一行是源节点,第二行是目标节点。
边特征
边特征用于描述化学键属性。设图中有
常见边特征:
| 特征 | 说明 | 表示方式 |
|---|---|---|
| 键类型 | 单键、双键、三键、芳香键 | one-hot |
| 是否共轭 | conjugated | 0/1 |
| 是否在环中 | ring bond | 0/1 |
| 立体化学 | 顺反、楔线等 | one-hot |
| 键长 | 三维结构中的距离 | 数值 |
例如定义:
BOND_TYPES = [single, double, triple, aromatic]则:
| 键 | one-hot |
|---|---|
| 单键 | [1, 0, 0, 0] |
| 双键 | [0, 1, 0, 0] |
| 三键 | [0, 0, 1, 0] |
| 芳香键 | [0, 0, 0, 1] |
乙醇中两条化学键都是单键。因为无向边通常拆成双向边,所以边特征为:
图级特征
除了节点和边,分子还可以有整体特征:
常见图级特征:
| 特征 | 说明 |
|---|---|
| 分子量 | molecular weight |
| LogP | 脂水分配系数 |
| TPSA | 拓扑极性表面积 |
| HBD | 氢键供体数 |
| HBA | 氢键受体数 |
| Rotatable Bonds | 可旋转键数量 |
在 GNN 中,图级特征可以在读出阶段与图向量拼接(其中
三维结构表示
二维图只表示原子连接关系,但很多分子性质与三维结构密切相关。在三维结构中,每个原子有坐标:
整个分子的坐标矩阵为:
距离矩阵
由坐标可以计算任意两个原子的欧氏距离:
距离矩阵为:
距离矩阵有两个重要性质:
距离对平移和旋转不变,因此常用于三维分子模型。
键角
三个原子
键角能够描述局部几何形状。例如 sp、sp2、sp3 杂化对应不同的典型键角。
二面角
四个原子
设四个原子的坐标分别为:
先定义三条连续的键向量:
二面角可以理解为平面
如果只关心夹角大小,可以使用:
但在分子构象中,二面角通常需要保留正负方向,因此更常用带符号的计算公式:
其中
用角度表示时,对应范围为:
不同表示类型的选择
| 任务 | 推荐表示 |
|---|---|
| 小数据集性质预测 | Morgan 指纹 + 传统机器学习 |
| 大规模性质预测 | 分子图 + GNN |
| 分子生成 | SMILES、SELFIES、图生成模型 |
| 构象预测 | 三维坐标 + 等变模型 |
| 蛋白-配体结合 | 三维空间图、距离图 |
| 量子化学性质 | 三维结构、原子序数、距离 |
简单经验:
- 只关心二维连接关系时,使用分子图。
- 关心构象、空间距离、结合姿态时,使用三维表示。
- 需要快速基线模型时,使用分子指纹。
- 需要端到端学习时,使用 GNN 或 Transformer。