想象一个派出所要为城市里每个新社区建立户口档案。社区里有一栋栋房子(原子),房子之间由道路相连(化学键)。民警需要把每个社区的结构特征浓缩成一张“身份证”——既要足够简短便于存储,又要能反映社区的核心布局。这张身份证,就是化学世界里的“分子指纹”。 分子指纹把复杂的分子结构变成一串固定长度的 0 和 1,就像把浩瀚的城市信息压缩成几个身份证号码。不同的指纹方法,就是不同的“建档策略”:老民警喜欢用标准问卷表逐项打勾(MACCS);精明的新警员则偏爱挨家挨户走访邻居,一圈圈扩大视野,最后把观察到的社区环境编码归档(Morgan 与 ECFP)。今天,我们就走进这个“分子办证大厅”,把三种指纹方法的原理、差异和实战用法一次讲明白。

岗位关联

对 AI 从业者而言,分子指纹是连接化学空间与机器学习模型的“通用语言”,掌握它能让你在药物发现、分子生成等 AI+生命科学场景中快速上手,不必被复杂的三维结构计算困住。

目录
  1. 可视化演示
  2. 指纹概述:分子的“社区身份证”
  3. 表征基础:先画好社区地图
  4. MACCS 指纹:166 道标准问答题
  5. Morgan 算法:按邻居圈层走访
  6. ECFP 指纹:圆形视野的电子档案
  7. 对比与选型:粗筛与精查的分工
  8. 应用实战:从查户口到破案
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示Morgan、MACCS与ECFP分子指纹的生成原理、结构编码与相似度对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Morgan 原子 邻域 Mol→FP 扩展原子邻域生成指纹

指纹概述:分子的“社区身份证”

派出所要给新社区建档,最需要的是一个能写在档案袋上的“编号”。编号不能太短而丢失信息,也不能太长而浪费纸张。分子指纹承担的就是这种角色:它把包含几十个原子的分子结构,映射成一个固定长度的 0/1 位串。每一位的取值(0 或 1)代表分子是否拥有某种结构特征,相当于社区档案里的一栏:“该社区是否有医院?”“是否有学校?”

AI 算法最擅长处理规矩的向量输入。分子原本是以 SMILES 字符串或三维坐标存在的非结构化数据,直接喂给神经网络非常吃力;指纹把它们变成统一长度的二进制向量,既能计算分子之间的相似度,又能作为机器学习模型的特征输入。两个分子“像不像”,本质上就是两个社区档案编号的接近程度。

最经典的比较指标叫 Tanimoto 相似度,它把两个指纹想象成两个集合:

有了身份证编号,派出所比对两个社区只需要做数字运算。分子指纹让“分子画像”变得可计算、可存储、可检索,这正是后续所有指纹方法(包括 MACCS、Morgan、ECFP)共同服务的核心目标。

T(A,B)=ca+b−c\displaystyle T(A,B) = \frac{c}{a+b-c}
  1. 分子 c(共有位数)两个指纹位串中同时为 1 的位数。c 越大,说明两个社区共享的设施越多。
    c=∣A∩B∣\displaystyle c = \vert A \cap B \vert
  2. 分母 a+b-c(并集长度)a 是 A 指纹置位数,b 是 B 指纹置位数,减去重复计算的共有位,得到两个社区拥有的所有不同设施总数。
    ∣A∪B∣=a+b−c\displaystyle \vert A \cup B \vert = a + b - c
  3. 比值含义共有设施占比越高,T 越接近 1;完全不相似时 T 为 0。Tanimoto 值在 0 到 1 之间,是分子相似度检索的“统一度量衡”。
    T∈[0,1]\displaystyle T \in [0, 1]

表征基础:先画好社区地图

办身份证之前,民警得先拥有一张标准的“社区平面图”:哪里是房子,哪条路连接哪栋房子,楼高几层、用途是什么。没有这张图,任何档案系统都是空谈。化学世界里,这张“图”就是分子表征。

最常用的表征方式有两种。第一种是 SMILES 字符串,像“CC(=O)Oc1ccccc1C(=O)O“这样的一行文本,用字符表示原子与成键关系,相当于给社区写一个”邮寄地址“。第二种是分子图,它把原子看成节点、化学键看成边,是一张真正的拓扑地图。指纹算法几乎都从这张地图出发,因为”我的邻居是谁”这种问题只能在地图上回答,没法在地址字符串里直接看出来。

分子图可以用集合论严格描述为:

这张“平面地图”是所有指纹算法的基石。任何一个分子,只要能画出分子图,民警就能决定用哪种建档方案——是填问卷,还是挨家走访。这也是为什么化学信息学把“分子表征”放在一切方法的最前面。

G=(V,E)\displaystyle G = (V, E)
  1. 节点集合 V(原子)V 是图中所有节点的集合,每个节点对应分子中的一个原子,可以附带原子序数、电荷、氢原子数等属性。
    V={v1,v2,…,vn}\displaystyle V = \{v_1, v_2, \ldots, v_n\}
  2. 边集合 E(化学键)E 是边的集合,一条边表示两个原子之间存在化学键。边的属性可以是单键、双键、芳香键等。
    E={(vi,vj)∣vi 与 vj 成键}\displaystyle E = \{(v_i, v_j) \mid v_i \text{ 与 } v_j \text{ 成键}\}
  3. 标记函数为了区分不同类型的原子和键,还引入标记函数,让每个节点和边都携带自己的“标签”。
    ϕ(vi),ψ(eij)\displaystyle \phi(v_i), \quad \psi(e_{ij})

MACCS 指纹:166 道标准问答题

多年以前,社区档案室的老式做法是准备一份统一的问卷:一共 166 道“是/否”题目。问卷里的问题全部是预先写好的,比如“该社区是否有苯环?”“是否有羧基?”“是否有羰基?”民警拿着问卷逐项打勾,最后得到一长串对勾和叉号。这就是 MACCS 指纹的思路。

MACCS(Molecular ACCess System)指纹预定义了 166 个常见的子结构片段,它们用 SMARTS 模式描述。计算指纹时,程序把分子与每一道“题目”的子结构进行匹配:只要分子的某个局部与题目描述的片段完全一致,这位就记为 1,否则记为 0。由于每个子结构是固定的,整个过程完全可解释:任意一位为 1,你都能立即说出分子含有什么基因。这种确定性也让它极快,适合对海量分子做第一轮粗筛。

每一位的取值规则可以写成一个简洁的分段函数:

MACCS 就像一张老问卷,只回答“有没有”,不回答“长什么样”。两个都含苯环的分子在这一栏都是 1,可它们的苯环连接方式可能完全不同。这种粗粒度让它在广度检索上效率极高,但在精细区分上就力不从心了。

Fi={1,若子结构 Si⊆G0,否则,i=1,2,…,166\displaystyle F_i = \begin{cases} 1, & \text{若子结构 } S_i \subseteq G \\ 0, & \text{否则} \end{cases}, \quad i = 1, 2, \ldots, 166
  1. 子结构库166 个预定义的 SMARTS 模式构成模板库,作为“问卷题目清单”。
    {S1,S2,…,S166}\displaystyle \{S_1, S_2, \ldots, S_{166}\}
  2. 子图匹配判断对每个模板,检查分子图 G 中是否存在同构的子图。子图同构是化学结构检索的基本操作,本质是“分子里能不能找到与模板一模一样的局部”。
    Si⊆G\displaystyle S_i \subseteq G
  3. 按位赋值匹配成功置 1,失败置 0,最终得到 166 位二进制向量,也就是问卷的打勾结果。
    Fi∈{0,1},∣F∣=166\displaystyle F_i \in \{0, 1\}, \quad \vert F \vert = 166

Morgan 算法:按邻居圈层走访

老问卷总有盲区:它能看到“某类设施是否存在”,却看不出这些设施周围的环境。为了补足这个短板,新来的警员提出另一套思路——不预设题目,直接进社区,从每栋房子出发,一圈一圈地走访邻居,记录“这个房子周围的社区面貌”。这就是 Morgan 算法的灵魂。

Morgan 算法给每个原子分配一个初始“身份号码”,号码由原子自身的属性(原子序数、连接度、电荷等)哈希得到。然后进入迭代:每一轮,原子把自己的身份号码与所有邻居的身份号码合并,重新哈希,生成新的号码。迭代进行 r 轮之后,每个原子的号码就蕴含了它周围 r 层邻居的信息。这些号码的集合,就是著名的“环形指纹”(circular fingerprint)——因为每一轮的视野正如水面上扩散的涟漪,形成一个个同心圆。

迭代更新的核心公式如下:

走访轮数越多,警察对社区细节的掌握就越深,但走访成本也随之上升。Morgan 算法刻画的是原子周边的局部拓扑环境,比起问卷式“有没有”的粗粒度,已跨出一大步。不过它产出的标识符长度不固定、难以直接比较,于是后续研究者把它“标准化”,ECFP 应运而生。

Hv(t)=hash(Hv(t−1)+∑u∈N(v)Hu(t−1))\displaystyle H_v^{(t)} = \mathrm{hash}\left( H_v^{(t-1)} + \sum_{u \in N(v)} H_u^{(t-1)} \right)
  1. 初始身份号码原子 v 在第一轮前的号码由它自身的原子属性哈希产生,代表“这栋房子的户主信息”。
    Hv(0)=hash(原子序数,度数,电荷)\displaystyle H_v^{(0)} = \mathrm{hash}(\text{原子序数}, \text{度数}, \text{电荷})
  2. 邻居信息求和把原子 v 的所有直接邻居在上一轮的身份号码加总。这是“走访邻居”的数学表达,把邻居的社区面貌汇总起来。
    ∑u∈N(v)Hu(t−1)\displaystyle \sum_{u \in N(v)} H_u^{(t-1)}
  3. 合并自身与邻居将原子自身的上一轮号码与邻居求和结果合并,再用哈希函数压缩,得到本轮新号码。经过 r 轮,H_v 就描述了 v 周围 r 层内的局部环境。
    Hv(t)=hash(Hv(t−1)+∑u∈N(v)Hu(t−1))\displaystyle H_v^{(t)} = \mathrm{hash}\left( H_v^{(t-1)} + \sum_{u \in N(v)} H_u^{(t-1)} \right)

ECFP 指纹:圆形视野的电子档案

走访记录虽然细致,但每个社区走访出来的笔记格式五花八门,不好归档。于是办证处升级系统:改用统一的“圆形视野证件照”,每一户都从自家门口向外拍一张半径固定的全景照片,再把所有照片数字化压缩成一张总表。这就是 ECFP 的由来。

ECFP(Extended Connectivity Fingerprint,扩展连通性指纹)本质上就是用 Morgan 算法为每个原子生成整数标识符,再用哈希与折叠把标识符映射到固定长度的位串上。它有两个常用参数:直径(直径 = 2 × 半径)和位串长度。例如 ECFP4 表示考虑直径 4 个键范围内的原子环境(即半径 2 层),通常使用 1024 或 2048 位输出。RDKit 中的 GetMorganFingerprintAsBitVect(mol, radius, nBits) 就是它的标准实现,传入半径 2 等价于生成 ECFP4。

将每个原子环境编码成指纹位的核心是“哈希定位”:

ECFP 同时拥有了局部环境细节和固定长度两个优点,成为药物分子虚拟筛选的事实标准。它就像一张张圆形视野证件照合成的电子档案——既保留了每户邻居的样貌,又让档案库可以统一检索。

Fk=1,k=hash(Ei) mod L\displaystyle F_k = 1, \quad k = \mathrm{hash}(E_i) \bmod L
  1. 原子环境哈希先用 Morgan 迭代得到每个原子的环境标识符 $E_i$,再把 $E_i$ 输入哈希函数,得到一个大的整数。
    Ei=Hv(r),hi=hash(Ei)\displaystyle E_i = H_v^{(r)}, \quad h_i = \mathrm{hash}(E_i)
  2. 取模定位将哈希整数对指纹长度 L 取模,即可把任意大的环境编码“折”进制指纹的某个位置 k,这就是折叠(folding)。
    k=hi mod L\displaystyle k = h_i \bmod L
  3. 置位成指纹把位置 k 对应的位设为 1。所有原子的环境都完成置位后,就得到最终固定的 L 位指纹。不同原子环境可能落到同一位,这是折叠引入的哈希碰撞,属于正常代价。
    Fk=1,∣F∣=L\displaystyle F_k = 1, \quad \vert F \vert = L

对比与选型:粗筛与精查的分工

办证档案室里,三种方法各有绝活:老问卷(MACCS)答题快、答案稳定,但信息糙;新走访(Morgan/ECFP)细节足、区分度高,但耗时更长。老警察的经验是:先拿问卷把大方向锁定,再派走访去核实细节。分子指纹选型也是同样的道理。

从三个维度看,差异非常清晰。维度与复杂度:MACCS 固定 166 位,每一位都有明确的子结构定义;ECFP 常用 1024 或 2048 位,由哈希折叠产生,位与子结构无直接对应关系。表征效力:MACCS 记录全局子结构的存在性,是“全局粗粒度”;ECFP 记录每个原子周围的局部环境,是“局部细粒度”,对微小结构差异更敏感。计算速度:MACCS 的 166 次子图匹配非常快;ECFP 需要遍历每个原子并迭代多轮,开销明显更大。

选型时有一个直观指标——指纹密度,即指纹位串中被置为 1 的比例:

三种档案方法不是竞争关系,而是流水线分工。任务要求速度优先时,老问卷顶上;要求区分度优先时,走访记录里找出路。理解各自的“信息粒度”,是选对指纹的关键。

ρ=1L∑i=1LFi≈{0.3∼0.5,MACCS0.05∼0.2,ECFP\displaystyle \rho = \frac{1}{L}\sum_{i=1}^{L} F_i \approx \begin{cases} 0.3 \sim 0.5, & \text{MACCS} \\ 0.05 \sim 0.2, & \text{ECFP} \end{cases}
  1. 密度定义密度等于指纹中 1 的个数除以总位数,反映位串“稠密”还是“稀疏”。
    ρ=置位数L\displaystyle \rho = \frac{\text{置位数}}{L}
  2. 典型取值范围MACCS 的 166 位里常有 50 多位为 1,密度偏高;ECFP 的 2048 位通常只有几十到一两百位为 1,十分稀疏。
    ρMACCS≫ρECFP\displaystyle \rho_{\text{MACCS}} \gg \rho_{\text{ECFP}}
  3. 选型权衡密度高意味着每位信息含混、区分度低;密度太低则哈希碰撞影响大、对噪声敏感。因此 MACCS 适合大规模预筛选,ECFP 适合对候选分子精细排序。
    Lchoice=166(粗筛)    或    1024/2048(精查)\displaystyle L_{\text{choice}} = 166 \text{(粗筛)} \;\; \text{或} \;\; 1024/2048 \text{(精查)}

应用实战:从查户口到破案

档案建的再好,最终是为了破案——发现新的候选药物。在药物发现领域,分子指纹承担着两大核心任务:快速找出“长得像”的分子,以及给 AI 生成模型提供“长相指定”的条件。指纹的价值在这里体现得淋漓尽致。

虚拟筛选是经典应用:研究者有一个已知有活性的“线索分子”,希望从包含数百万化合物的数据库中捞出结构类似的候选分子。做法是把库中每个分子都编码成 ECFP4 指纹,与线索分子的指纹计算 Tanimoto 相似度,然后按分数从高到低排序,取前几百名送去做实验验证。整个过程在几分钟内完成,而传统实验筛选需要数月。另一个常用指标是 Dice 相似度,它给共有位更高的权重:

AI 分子生成是另一个前沿:在变分自编码器或扩散模型中,把目标分子的指纹作为条件向量输入生成器,模型就能“按图索骥”地生成具有相似结构骨架的新分子。指纹在这里就像嫌疑人的容貌描述词,引导生成器在化学空间的正确区域里搜索。从查户口到破案,分子指纹是化学空间与算法模型之间的那座桥。

D=2ca+b\displaystyle D = \frac{2c}{a+b}
  1. 共有位加倍把 c(两指纹共有置位数)乘以 2,强调共同特征的贡献。
    2c\displaystyle 2c
  2. 归一化分母分母是两指纹置位数之和,而不是并集,因此 D 通常大于 T。
    a+b\displaystyle a + b
  3. 与 Tanimoto 互算D 和 T 可以互相换算,实际系统中常按需求选一个排序。
    D=2T1+T\displaystyle D = \frac{2T}{1+T}

AI 应用场景

场景一:千万级化合物库的虚拟筛选

阶段:数据处理与候选生成

解决的问题:传统高通量筛选需要把数百万个化合物逐一做实验,成本以亿元计、周期以月计。用 ECFP4 指纹 + Tanimoto 相似度,只需几步位运算就能把化合物库压缩成按相似度排序的候选清单,把实验范围缩小到几十个分子。

具体案例:某药企想针对激酶靶点寻找新先导物,已知一个活性分子 PU-H71。研究员用 RDKit 计算其 ECFP4 指纹,对 ZINC 数据库的 300 万分子批量计算相似度,取 Top 100 进入实验,最终发现 3 个活性骨架——整个过程不过数小时。

场景二:AI 分子生成的条件控制

阶段:模型训练与推理控制

解决的问题:生成模型如果只看 SMILES 文本,生成的分子往往天马行空、难以成药。把目标分子的 MACCS 或 ECFP 指纹作为条件特征输入生成器,就能约束模型在特定化学子空间中采样,大幅提高生成分子的类药性。

具体案例:一个基于变分自编码器的分子生成项目,将已知活性分子的 ECFP4 指纹与潜变量拼接,重构时要求解码器同时还原指纹。结果生成的分子中 60% 保持原分子的核心药效团,而对照训练(无指纹条件)仅有 15%。

场景三:化合物专利库去重与聚类

阶段:数据清洗与知识发现

解决的问题:企业专利中经常出现大量结构相似、实为同一骨架的化合物,人工识别费时费力。用 MACCS 指纹对化合物做层次聚类,能秒级把上万分子分成若干骨架簇,快速判断专利覆盖范围。

具体案例:某知识产权团队分析竞品公司 5000 个化合物的专利清单,用 MACCS 指纹 + 层次聚类划出 120 个核心骨架簇,从中识别出 3 条未被覆盖的活性结构方向,直接指导了新药立项。

Python 演示

python41 行
from rdkit import Chemfrom rdkit.Chem import AllChem, MACCSkeysfrom rdkit.Chem import DataStructs  def demo_fingerprints():    smiles_list = [        "CC(=O)Oc1ccccc1C(=O)O",          # 阿司匹林        "CN1C=NC2=C1C(=O)N(C(=O)N2C)C",   # 咖啡因        "CCCO",                            # 1-丙醇    ]    mols = [Chem.MolFromSmiles(s) for s in smiles_list]    m1, m2 = mols[0], mols[1]     print("分子 1:", smiles_list[0])    print("分子 2:", smiles_list[1])     # 1) MACCS 166 位公钥指纹    mac1 = MACCSkeys.GenMACCSKeys(m1)    mac2 = MACCSkeys.GenMACCSKeys(m2)    print("\n[MACCS]")    print("  位串长度:", len(mac1))    print("  置位数:", mac1.GetNumOnBits())    print("  Tanimoto 相似度:", round(DataStructs.TanimotoSimilarity(mac1, mac2), 3))     # 2) ECFP4(Morgan 圆形指纹,直径=4,即半径=2)    ecfp1 = AllChem.GetMorganFingerprintAsBitVect(m1, 2, nBits=1024)    ecfp2 = AllChem.GetMorganFingerprintAsBitVect(m2, 2, nBits=1024)    print("\n[ECFP4]")    print("  位串长度:", len(ecfp1))    print("  置位数:", ecfp1.GetNumOnBits())    print("  Tanimoto 相似度:", round(DataStructs.TanimotoSimilarity(ecfp1, ecfp2), 3))     # 3) 同分子自比对应当等于 1    ecfp1_self = AllChem.GetMorganFingerprintAsBitVect(m1, 2, nBits=1024)    print("\n[自比对]")    print("  相同分子 ECFP4 相似度:", round(DataStructs.TanimotoSimilarity(ecfp1, ecfp1_self), 3))  if __name__ == "__main__":    demo_fingerprints()
目的:演示用 RDKit 计算 MACCS 与 ECFP4 两种分子指纹,并用 Tanimoto 系数比较阿司匹林与咖啡因的相似度。
  1. mols = [Chem.MolFromSmiles(s) for s in smiles_list]把 SMILES 字符串解析成分子对象,相当于把“邮寄地址”翻译成“社区平面图”。
  2. MACCSkeys.GenMACCSKeys(m1)生成 166 位的 MACCS 问卷档案,一键完成子结构匹配。
  3. AllChem.GetMorganFingerprintAsBitVect(m1, 2, nBits=1024)生成 ECFP4 指纹,半径参数 2 代表直径 4 个键,nBits 指定折叠长度。
  4. mac1.GetNumOnBits()统计置位数,即档案中打了多少个勾,反映指纹密度。
  5. DataStructs.TanimotoSimilarity(mac1, mac2)计算两个位串的 Tanimoto 相似度,是虚拟筛选的核心算子。
  6. if __name__ == "__main__":保证模块既可被导入也能独立运行,工程上必备的入口约定。

常见误区

误区我在文档里看到“Morgan 指纹”和“ECFP 指纹”两个名字,下意识以为是两条独立的技术路线,就像 MACCS 和 ECFP 那样毫无关系。

正解ECFP 恰恰是 Morgan 圆形算法的一种具体实现——它用 Morgan 的迭代哈希逻辑生成原子环境标识符,只是额外规定了直径参数(如 ECFP4)和位串折叠长度。打个比方:Morgan 是“走访邻居”的方法论,ECFP 是按这套方法论设计好的标准办案流程。

为何常见:名字差异容易让人联想为不同家族,加上教程常常分开讲解,忽略了 ECFP 文档中"based on Morgan algorithm"这一句关键出处。

误区我一直以为 ECFP4 是看原子周围 4 层邻居,半径越大信息越多,所以 ECFP4 比 ECFP6 看得更远。

正解ECFP 的参数是直径而非半径。ECFP4 的"4"代表直径 4 个键,即半径 2 层;ECFP6 则是直径 6 个键、半径 3 层。想象圆形视野的直径,而不是你在动画里看到的圈层数。

为何常见:日常说到“几层邻居”时习惯性理解成半径,加上许多入门资料直接翻译为“4 键范围”,未明确指出这是直径概念。

误区既然 ECFP 有 1024 位、2048 位的版本,那我无脑选 2048 位,信息越全越好,效果一定更好。

正解位数增加确实减少哈希碰撞,但指纹长度翻倍的同时,稀疏度上升,置位碰撞对相似度分数的影响也更敏感,存储和计算开销同步增大。实际使用中 1024 位 ECFP4 在大多虚拟筛选任务上表现足够好,2048 位只在超大库中体现微弱优势。选长度是性价比权衡,不是越大越优。

为何常见:直观上“更长 = 更多信息”符合直觉,但位串是由折叠产生的,长度只是存放哈希结果的容器,信息量取决于哈希函数的分配与碰撞率。

误区我在项目里同时算了 MACCS 和 ECFP 的 Tanimoto,两个都是 0.8,我宣布两对分子相似度相同。

正解两者的位串语义完全不同——MACCS 的相似度衡量“共享了多少种预定义子结构”,ECFP 的相似度衡量“局部原子环境有多像”。就好比两张问卷在比“都有没有医院学校”,另一组照片在比“街区布局是否一模一样”,数值不可同日而语。比较必须限定在同一指纹类型内部。

为何常见:Tanimoto 公式不区分输入指纹类型,给人“统一分数”的错觉,忽略了指纹编码语义这一前置条件。

误区我看到指纹就是一串 0/1,以为它唯一的用途就是算 Tanimoto,拿来做个相似度排序就完事了。

正解指纹的用途远超相似度:它可以作为机器学习分类器的特征向量;可以拼接到生成模型的条件表征中控制分子生成方向;还常用于分子聚类、专利去重、数据库索引与化学反应产物预测。它是一个通用的分子嵌入表示,串起整个化学信息学工作流。

为何常见:入门教程最常展示相似度检索这一个案例,容易让初学者把“最常用的功能”误当成“全部功能”。

面试题

Q1. MACCS 指纹的标准位数是多少?

单选题 · easy

  • A.128 位
  • B.166 位← 正确答案
  • C.256 位
  • D.1024 位

答案:B。MACCS 指纹定义了 166 个通用子结构,所以输出固定为 166 位。128 位、256 位是常见位长但不是 MACCS 标准;1024 位是 ECFP 的典型位长。牢记 166 是 MACCS 的身份证号。

Q2. ECFP4 中的数字"4"代表什么?

单选题 · easy

  • A.半径 4 个键
  • B.直径 4 个键← 正确答案
  • C.哈希函数的数量
  • D.指纹的总位数

答案:B。ECFP 的数值参数是直径,ECFP4 指直径 4 个键,相当于半径 2 层邻居视野。把它当半径是经典误区,选“半径 4 个键”就是中了这个圈套。

Q3. 分子指纹的本质是什么?

单选题 · easy

  • A.分子三维坐标
  • B.固定长度 0/1 位串← 正确答案
  • C.SMILES 字符串
  • D.分子量数值

答案:B。指纹把分子结构编码成固定长度的二进制位向量,每一位表示某种结构特征是否存在。三维坐标是构象信息,SMILES 是线性文本表示,分子量是单一标量,都不属于指纹。

Q4. 关于 Tanimoto 相似度,下列说法正确的有?

多选题 · easy

  • A.分子是两指纹共有位数← 正确答案
  • B.分母是两指纹并集长度← 正确答案
  • C.值域在 0 到 1 之间← 正确答案
  • D.值越大表示越不相似

答案:ABC。Tanimoto 公式为 c/(a+b-c),分子是共有位数,分母是并集长度,结果落在 [0,1],越接近 1 越相似。D 说反了,值越大越相似而非越不相似。

Q5. Morgan 算法迭代时,原子 ID 的更新主要依赖什么?

单选题 · mid

  • A.原子在字符串中的位置
  • B.自身与邻居上一轮 ID← 正确答案
  • C.分子带的整体电荷
  • D.指纹位串的总长度

答案:B。Morgan 迭代把原子自身上一轮 ID 与所有邻居上一轮 ID 合并再哈希,邻居信息逐层扩散。与 SMILES 中字符位置无关,也与分子总电荷、指纹长度无关,这是它“局部环境编码”的本质。

Q6. MACCS 指纹的主要局限性是什么?

单选题 · mid

  • A.位串太长难以存储
  • B.只记录 166 个子结构的有无← 正确答案
  • C.无法处理常见有机分子
  • D.需要量子化学计算

答案:B。MACCS 每位对应一个预定义子结构是否存在,是全局粗粒度编码,无法区分局部细微差异。166 位并不长,也不限制分子类型,更不涉及量子化学。

Q7. 若 A 指纹置位数 a=60,B 指纹置位数 b=80,共有置位数 c=30,Tanimoto 相似度为?

单选题 · mid

  • A.0.273← 正确答案
  • B.0.375
  • C.0.500
  • D.0.750

答案:A。代入公式 T = c/(a+b-c) = 30/(60+80-30) = 30/110 ≈ 0.273。选项 B 是 c/a+b=30/140 的错误约分结果,C 和 D 是直觉猜测值。计算时务必记得分母要减去重叠的 c。

Q8. ECFP 与 Morgan 算法的关系是?

单选题 · hard

  • A.完全不同的两种算法
  • B.ECFP 是 Morgan 圆形指纹的一种实现← 正确答案
  • C.Morgan 是 ECFP 的升级版本
  • D.两者之间没有数学联系

答案:B。ECFP 建立在 Morgan 算法之上,用其迭代哈希逻辑生成原子环境标识符,只是额外规定了直径参数和位串折叠方式。它是 Morgan 的标准化产物而非对立算法。

Q9. 分子指纹的常见应用包括哪些?

多选题 · hard

  • A.化合物库虚拟筛选← 正确答案
  • B.分子相似性计算← 正确答案
  • C.情感识别与文本分析
  • D.分子生成模型条件← 正确答案

答案:ABD。指纹广泛应用于虚拟筛选、相似度计算以及作为生成模型的条件特征。情感识别和文本分析属于自然语言处理领域,与分子结构编码无关,是干扰项。

Q10. 关于 MACCS 与 ECFP 的对比,正确的有?

多选题 · hard

  • A.MACCS 基于预定义子结构← 正确答案
  • B.ECFP 编码局部原子环境← 正确答案
  • C.MACCS 位串比 ECFP 更长
  • D.ECFP 对局部差异更敏感← 正确答案

答案:ABD。MACCS 用 166 个固定子结构做全局匹配,位串远短于 ECFP 的 1024/2048 位。ECFP 逐原子编码周围拓扑环境,因此对局部微小差异更敏感。C 弄反了位数长短关系。