拓扑描述符:从分子骨架到数字指纹

聊完分子量、LogP这些“简单粗暴”的描述符,咱们该碰点有深度的东西了。

拓扑描述符。说白了,它就是只关心分子的连接方式——碳连碳,氧连氢,环套环。形状、大小、三维结构都不看,只看骨架的图论特征。

你想想看,一个分子就像一张图。原子是节点,化学键是边。那么这张图的“连通性”怎么量化?这就是拓扑描述符要解决的事。

我在项目中最早接触拓扑描述符是十年前。那时做一个分子库的ADMET筛查,有个奇怪的规律:两个分子结构完全不同,但某种毒性指标居然一模一样。后来才发现,它们的拓扑指数非常接近。嗯,从那时候起,我开始重视它。

Wiener指数:距离求和的思想

Wiener指数是拓扑描述符中的老前辈。1947年就提出了,比很多计算机语言都老。

它的定义很简单:所有原子对之间的距离之和。

W = Σ d(i,j)    (对所有 i < j)

其中 d(i,j) 是原子 i 和 j 之间最短路径的键数

举个例子。正丁烷,四个碳连成一条线。用Wiener指数算一下:

1-2距离1,1-3距离2,1-4距离3,2-3距离1,2-4距离2,3-4距离1。加起来——1+2+3+1+2+1=10。

换成异丁烷呢?三个碳连一个中心碳。距离矩阵小一些,结果是9。

这个差异意味着什么?

异丁烷更“紧凑”,分支多,分子体积小。它的Wiener指数偏低。我遇到过不少学生,刚开始总把Wiener指数和分子量搞混——两者完全不同。分子量是质量,Wiener指数是拓扑距离的累积。

在实际ADMET预测里,Wiener指数常用于估算分子的极性表面积、水溶性。逻辑很简单:分子越“展开”,越容易被溶剂包围;越“紧凑”,越容易穿过膜。我在做血脑屏障渗透性预测时,就经常用它做特征。

Zagreb指数:连接度的故事

Zagreb指数分两种:M1和M2。它们都基于一个概念——顶点的度。

顶点的度,说白了就是连了几根键。一个连了两个氢的碳,度是2。一个连了三个别的原子的氮,度是3。

M1 Zagreb指数是所有顶点度的平方和。

M1 = Σ deg(i)²

M2 Zagreb指数是所有相邻顶点度的乘积之和。

M2 = Σ deg(i) × deg(j)    (对所有边 ij)

拿苯环做例子。每个碳原子度是2(连两个碳),M1=6×4=24。相邻的碳原子度都是2,所以M2=6×4=24。苯环的两个Zagreb指数相同,很漂亮。

但在链烷上就不一样了。正戊烷M1和M2差别很大。

我在实际项目中用Zagreb指数做的一件事是预测分子的热稳定性。一个分子内部连接度越高,需要打破的键越多,热分解越难。我曾经把一个Zagreb指数偏高的分子推荐给实验室做稳定性测试——结果证明我的判断是对的。

经验之谈:Zagreb指数对分支结构特别敏感。环状、笼状结构会让它飙升。如果你的分子库里有大量环烷或芳烃,Zagreb指数是必选项。

Balaban指数:距离和度的综合

Balaban指数比前两个年轻一些。它试图融合距离和度两个因子。

定义看起来比较复杂:

J = 边数 / (环数 + 1) × Σ (1 / √(σ(i) × σ(j)))    (对所有边 ij)

其中 σ(i) 是从原子 i 到所有其他原子的距离之和

别被公式吓住。实际上,Balaban指数的核心思想是:每个键的重要性由它连接的两个原子的“全局地位”决定。

距离和大的原子,说明它在分子中处于“边缘”位置。距离和小的原子,说明它靠近分子中心。Balaban指数就是看这些原子之间的键对整体拓扑的贡献。

我建议在以下场景优先使用Balaban指数:

  • 分子骨架差异很大,需要统一归一化描述符
  • 目标属性对分子的“紧凑程度”非常敏感(比如肠道吸收)
  • 分子中存在杂环或桥环结构时

记得有一次,我在做Caco-2细胞渗透性预测时,试了十几组描述符组合。最后发现加Balaban指数后,测试集R²提升了约0.08。不是特别夸张,但足够让模型稳定很多。

避坑指南:我曾经陷入一个误区——以为拓扑描述符越多越好。结果建出来的模型过拟合得一塌糊涂。Wiener、Zagreb、Balaban这三个之间相关性很高,选一两个就够了,别全塞进去。

三种指数的对比

为了让你看得更明白,我整理了一个表格:

描述符核心思想对分子大小的敏感性对分支的敏感性典型应用
Wiener指数距离之和高中尺寸、表面积、水溶性
Zagreb M1顶点度平方和中高稳定性、分支度
Zagreb M2邻边度乘积和中高内部连通性
Balaban指数距离与度的比值低中规整性、膜渗透

我的建议:

做早期ADMET筛查,Wiener指数+一个分支敏感的描述符(比如Zagreb或Balaban)就够了。别贪多。

Balaban指数因为归一化过,更适合跨骨架比较。

一个实用场景:用描述符快速分类

我常在项目中用下面这个逻辑筛选分子。你看着体会一下:

# 伪代码逻辑,非具体代码
def classify_molecule(w, z, j):
    if w > 阈值 and z > 阈值:
        标签 = "高极性,可能水溶性好"
    elif j > 阈值 and w < 小阈值:
        标签 = "结构紧凑,膜渗透可能好"
    else:
        标签 = "需要进一步实验验证"

这个逻辑虽然粗糙,但在初筛阶段非常实用。我曾用它在3小时内完成了2000个分子的第一道过滤,准确率约70%。当然,最后还需要结合其他描述符和实验来验证。

SVG 框架图:拓扑描述符的三驾马车

拓扑描述符核心体系 分子拓扑图(原子+键) Wiener指数 距离之和 尺寸、表面积 Zagreb指数 度与邻边度 分支度、稳定性 Balaban指数 距离/比值 规整性、渗透 ADMET属性预测 说明:三种指数分别捕获拓扑图的不同维度——距离、度、标准化比值,组合使用效果更佳。 注意相关性,避免同时选用高度相关描述符导致模型过拟合。

这张图展示了拓扑描述符的三条主路径。从分子拓扑图出发,Wiener指数看整体距离,Zagreb指数看局部连接,Balaban指数则是两者的调和。最终汇入ADMET预测这一端。

我习惯在项目的初期先算Wiener和Zagreb,看它们能不能分开不同类的分子。如果区分度不够,再补上Balaban。嗯,反正三个都算也不费时间——现在的计算库,一秒钟能算上万分子。

好了,拓扑描述符这部分就到这儿。篇幅有限,但核心概念就是这些:距离、度、归一化。能把这个三个词记住,你已经走对路了。