ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RDKit SimilarityMaps 分子相似性图谱完全指南:从指纹贡献到 ML 模型解释

RDKit SimilarityMaps 分子相似性图谱完全指南:从指纹贡献到 ML 模型解释 科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相似性图谱Similarity Map是 RDKit 提供的可视化分子局部相似性与原子级贡献的核心工具它把分子 A 与参考分子 B 有多相似分解到每个原子并以彩色等高线叠加在 2D 结构图上。本文基于 RDKit 官方文档中rdkit.Chem.Draw.SimilarityMaps模块源码及其在 GettingStartedInPython.rst 中的实操示例系统讲解指纹型相似性图谱、任意原子权重图谱、以及基于 ML 模型的解释性图谱的完整用法读完你即可在自己的项目中直接复现全部示例并理解其底层实现原理。output_image/output_image一、相似性图谱是什么把分子相似度分解到每个原子相似性图谱是一种将分子-分子相似性拆解为原子级贡献并可视化的方法其方法论详见文献Riniker Landrum,J. Cheminform., 2013。核心思想是对探针分子probeMol计算完整指纹得到与参考分子refMol的基准相似度baseSimilarity逐个剔除探针分子中每个原子的指纹贡献重新计算相似度每个原子的权重 baseSimilarity - 剔除该原子后的相似度将这些权重以高斯函数叠加成等高线contour覆盖在分子的 2D 结构上。权重为正的原子对该原子而言探针与参考分子更相似剔除它会让相似度下降权重为负的原子探针在该原子处与参考分子有差异剔除它反而提高相似度权重绝对值越大该原子对整体相似性的贡献越关键。从源码看模块由 Sereina Riniker 于 2013 年创建位于 rdkit/Chem/Draw/SimilarityMaps.py依赖rdkit.Chem.Draw的ContourAndDrawGaussians底层绘制函数完成等高线渲染。官方 API 文档入口即 rdkit.Chem.Draw.SimilarityMaps.rst通过 Sphinxautomodule自动提取文档字符串。二、环境准备与模块导入相似性图谱依赖两个可选/必要组件matplotlib仅在提供 matplotlib 颜色图colormap时需要默认使用模块内置的自定义 PiWG 颜色图不强制安装。源码中import matplotlib失败或抛出RuntimeError时会将cm置为None见 SimilarityMaps.py 第 37-44 行。Cairo/2D 绘图后端官方示例使用MolDraw2DCairoPNG 输出测试中使用MolDraw2DSVGSVG 输出。你的 RDKit 安装需启用相应绘图后端。导入方式from rdkit import Chem, DataStructs from rdkit.Chem import Draw from rdkit.Chem.Draw import SimilarityMaps三、用指纹生成相似性图谱核心用法官方文档GettingStartedInPython.rst 第 2294-2360 行演示的完整流程如下。3.1 准备参考分子与探针分子 from rdkit import Chem mol Chem.MolFromSmiles(COc1cccc2cc(C(O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21) refmol Chem.MolFromSmiles(CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1)其中mol是探针分子被绘制、被分解贡献的对象refmol是参考分子。3.2 支持的指纹类型模块支持三种分子指纹各有三种或两种变体源码第 315-384 行指纹函数可用 fpType默认参数Atom Pairs 原子对GetAPFingerprint(mol, atomId-1, fpTypenormal, nBits2048, minLength1, maxLength30, nBitsPerEntry4, **kwargs)normal默认、hashed、bv路径长度 1–30默认完整非哈希指纹Topological Torsions 拓扑扭转GetTTFingerprint(mol, atomId-1, fpTypenormal, nBits2048, targetSize4, nBitsPerEntry4, **kwargs)normal默认、hashed、bv片段大小 4Morgan 指纹GetMorganFingerprint(mol, atomId-1, radius2, fpTypebv, nBits2048, useFeaturesFalse, **kwargs)bv默认、count半径 2位向量原子对与拓扑扭转的类型为normal默认、hashed、bvnBits仅对bv生效Morgan 的类型为bv默认和count这些函数都可以直接当作fpFunction使用atomId-1时返回整分子指纹也可用lambda包装以传额外参数。快速获取三种指纹 fp SimilarityMaps.GetAPFingerprint(mol, fpTypenormal) fp SimilarityMaps.GetTTFingerprint(mol, fpTypenormal) fp SimilarityMaps.GetMorganFingerprint(mol, fpTypebv)3.3 一键生成图谱GetSimilarityMapForFingerprintGetSimilarityMapForFingerprint(refMol, probeMol, fpFunction, draw2d, metricDataStructs.DiceSimilarity, **kwargs)是最高层的便捷入口源码第 213-230 行它内部依次调用GetAtomicWeightsForFingerprint计算原子权重、GetStandardizedWeights归一化、GetSimilarityMapFromWeights绘制并返回(draw2d, maxWeight)——第二个返回值是归一化前的最大绝对权重。使用全部默认参数Morgan 半径 2、位向量、Dice 相似度 d2d Draw.MolDraw2DCairo(400, 400) _, maxweight SimilarityMaps.GetSimilarityMapForFingerprint(refmol, mol, SimilarityMaps.GetMorganFingerprint, d2d)产出下图绿色区域为正贡献、紫色半透明区域为负贡献强度与原子贡献成正比output_image/output_image更换为 count 型 Morgan、半径 1、并用 Tanimoto 相似度 from rdkit import DataStructs _, maxweight SimilarityMaps.GetSimilarityMapForFingerprint( ... refmol, mol, ... lambda m, idx: SimilarityMaps.GetMorganFingerprint(m, atomIdidx, radius1, fpTypecount), ... d2d, metricDataStructs.TanimotoSimilarity)要点fpFunction必须接受(mol, atomId)两个参数当需要修改半径、fpType、includeChirality等参数时务必用lambda m, idx: SimilarityMaps.GetMorganFingerprint(m, atomIdidx, radius1, fpTypecount)这种形式包装。3.4 归一化与最大权重GetSimilarityMapForFingerprint内部会调用GetStandardizedWeights源码第 115-128 行将所有权重除以最大绝对权重使绝对值最大为 1.0因此返回的maxweight是归一化前找到的最大权重 print(maxweight) 0.05747...3.5 跳过归一化分步计算如果不希望自动归一化可以手动分两步走权重保持原始量纲 weights SimilarityMaps.GetAtomicWeightsForFingerprint(refmol, mol, SimilarityMaps.GetMorganFingerprint) print([%.2f % w for w in weights]) [0.05 , ... _ SimilarityMaps.GetSimilarityMapFromWeights(mol, weights, d2d)产出下图output_image/output_image四、原子权重计算的底层原理源码级解析4.1 基于 fpFunction 的权重计算GetAtomicWeightsForFingerprint(refMol, probeMol, fpFunction, metricDataStructs.DiceSimilarity)源码第 60-88 行的核心逻辑refFP fpFunction(refMol, -1) # 参考分子完整指纹 baseSimilarity metric(refFP, fpFunction(probeMol, -1)) # 基准相似度 weights [baseSimilarity - metric(refFP, fpFunction(probeMol, atomId)) for atomId in range(probeMol.GetNumAtoms())]即对每个原子用剔除该原子贡献后的探针指纹与参考指纹算相似度与基准相减即为该原子的贡献权重。函数首尾会删除分子上缓存的_fpInfo属性避免残留状态干扰。4.2 剔除原子贡献的实现三种指纹各有巧妙处fpFunction收到atomId 0时返回剔除了该原子的指纹实现方式如下源码第 325-493 行MorganGetMorganFingerprint首次调用时通过bitInfo构建每个原子贡献了哪些位的 bitmapmol._fpInfo。位向量型用异或molFp ^ bitmap[atomId]剔除count 型则深拷贝后逐位减 1。对半径 0 的环境会先用Chem.FindAtomEnvironmentOfRadiusN找到环境路径再用Chem.PathToSubmol把环境内所有原子都标记为该位的贡献者。Atom PairsGetAPFingerprint通过ignoreAtoms[atomId]参数让底层的rdMolDescriptors.GetAtomPairFingerprint系列函数在计算时忽略该原子。Topological TorsionsGetTTFingerprint同理通过ignoreAtoms[atomId]忽略该原子参与的扭转。RDKit 指纹GetRDKFingerprint首次调用时从Chem.RDKFingerprint(..., atomBitsinfo)拿到每原子对应的位集合剔除时用molFp.UnSetBitsFromList(info[atomId])。4.3 基于指纹生成器FingerprintGenerator的现代实现对应当前推荐的rdFingerprintGeneratorAPI模块提供GetAtomicWeightsForFingerprintGenerator(refMol, probeMol, fpg, useCountsFalse, metricDataStructs.DiceSimilarity)与GetSimilarityMapForFingerprintGenerator(...)源码第 233-294 行。它利用rdFingerprintGenerator.AdditionalOutput().AllocateAtomsPerBit()一次性拿到每个位对应的原子集合再对每个原子深拷贝指纹并UnSetBit或 count 型减 1避免了逐原子重算指纹的开销性能更优。五、用任意原子权重绘制图谱GetSimilarityMapFromWeights相似性图谱并不局限于分子指纹——任何能分解为每个原子一个数值的贡献都能可视化。核心绘制函数GetSimilarityMapFromWeights(mol, weights, draw2d, **kwargs)源码第 131-210 行接受原始权重列表。5.1 完整参数表参数类型/默认值含义molROMol待绘制分子原子数 ≥ 2否则抛ValueError(too few atoms)weightslist[float]每个原子的权重长度须等于原子数draw2dMolDraw2DRDKit 绘图对象必需None会抛ValueErrorcolorMap自定义颜色图默认内置 PiWG可为 matplotlib 颜色图对象如cm.PiYG、颜色图名字符串如coolwarm、jet或三段颜色列表[(r,g,b,a), (r,g,b), (r,g,b,a)]scalefloat默认 -1缩放系数 0 时用最大绝对权重作为最大标度 0 时为固定最大标度sizetuple默认 (250, 250)图形尺寸已被 draw2d 尺寸取代保留兼容sigmafloat默认 None高斯函数标准差None 时自动按首键长度的 0.3 计算并四舍五入到 2 位小数coordScalefloat默认 1.5坐标缩放因子stepfloat默认 0.01高斯函数计算的步长colorsstr默认 k等高线颜色contourLinesint 或 list默认 10整数 N画 N 条等高线列表在指定数值处画等高线alphafloat默认 0.5等高线的 alpha 混合值gridResolutionfloat默认 0.1网格分辨率extraGridPaddingfloat默认 0.5网格额外边距useFillThresholdbool默认 False是否用幅度阈值决定网格是否填充fillThresholdfloat默认 0.01网格填充的幅度阈值fillThresholdIsFractionbool默认 TrueTrue 时fillThreshold是数据范围的分数kwargs—传递给底层绘制函数的额外参数绘制流程源码可查先PrepareMolForDrawing预处理分子若无 2D 构象则rdDepictor.Compute2DCoords生成随后把所有原子坐标转为Geometry.Point2D配置Draw.ContourParamsfillGridTrue、网格分辨率、填充阈值等调用Draw.ContourAndDrawGaussians(draw2d, locs, weights, sigmas, nContourscontourLines, paramsps)画等高线最后再叠画分子结构。5.2 颜色图参数详解含回归测试佐证colorMap支持三种输入源码第 195-205 行测试用例 UnitTestSimilarityMaps.py 中均有覆盖# 1) matplotlib 颜色图对象 from matplotlib import cm _, maxWeight SimilarityMaps.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: SimilarityMaps.GetMorganFingerprint(m, i, radius2, fpTypebv), draw2dd, colorMapcm.PiYG) # 2) 颜色图名字符串需要 matplotlib _, maxWeight SimilarityMaps.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: SimilarityMaps.GetMorganFingerprint(m, i, radius2, fpTypebv), draw2dd, colorMapcoolwarm) # 3) 三段颜色列表不依赖 matplotlib colors [(0, 1, 0, 0.5), (1, 1, 1), (0, 0, 1, 0.5)] _, maxWeight SimilarityMaps.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: SimilarityMaps.GetMorganFingerprint(m, i, radius2, fpTypebv), draw2dd, colorMapcolors)列表形式的语义为三个 RGBA 元组分别对应权重最小值如绿色、中间值白色、最大值蓝色的颜色。该列表形式是 GitHub issue #2904 引入的能力在 UnitTestSimilarityMaps.py 第 172-195 行 有对应测试。5.3 官方示例可视化 Gasteiger 电荷相似性图谱可用于可视化可分解为原子贡献的描述符。例如 Gasteiger 部分电荷colorMapjet、contourLines10 from rdkit.Chem import AllChem AllChem.ComputeGasteigerCharges(mol) contribs [mol.GetAtomWithIdx(i).GetDoubleProp(_GasteigerCharge) ... for i in range(mol.GetNumAtoms())] d2d Draw.MolDraw2DCairo(400, 400) _ SimilarityMaps.GetSimilarityMapFromWeights(mol, contribs, d2d, colorMapjet, contourLines10)产出下图output_image/output_image5.4 官方示例可视化 Crippen logP 贡献同理Crippen 原子贡献logP 的原子分解来自rdMolDescriptors._CalcCrippenContribs from rdkit.Chem import rdMolDescriptors contribs rdMolDescriptors._CalcCrippenContribs(mol) _ SimilarityMaps.GetSimilarityMapFromWeights(mol, [x for x, y in contribs], d2d, colorMapjet, contourLines10)产出下图output_image/output_image六、基于 ML 模型的图谱GetSimilarityMapForModel相似性图谱同样可以解释机器学习模型——回答模型为什么把某个分子判为活性/阳性这一问题。这在 RDKit Cookbook日语版收录于 RDKit_cookbook_jp.rst对应原版 Cookbook 的 Generating Similarity Maps Using ML Models 一节中有完整演示。6.1 思路与 APIGetAtomicWeightsForModel(probeMol, fpFunction, predictionFunction)源码第 91-112 行将基准相似度换成基准模型预测值baseProba predictionFunction(fpFunction(probeMol, -1)) weights [baseProba - predictionFunction(fpFunction(probeMol, atomId)) for atomId in range(probeMol.GetNumAtoms())]GetSimilarityMapForModel(probeMol, fpFunction, predictionFunction, draw2d, **kwargs)源码第 297-312 行则完成权重计算、归一化与绘制。6.2 Cookbook 完整示例随机森林模型以 scikit-learn 随机森林为例训练部分从略对预测函数做包装——因为predict_proba返回二维数组需要取出阳性类的概率from rdkit.Chem.Draw import SimilarityMaps # 辅助函数取出 (fp,) 对应预测结果的第 1 类概率 def getProba(fp, predictionFunction): return predictionFunction((fp,))[0][1] m5 Chem.MolFromSmiles(c1ccccc1OH) fig, maxweight SimilarityMaps.GetSimilarityMapForModel( m5, SimilarityMaps.GetMorganFingerprint, lambda x: getProba(x, rf.predict_proba))产出下图红色区域表示该原子对模型判为活性的预测贡献最大output_image/output_image这套流程可推广到任何predictionFunction只需保证它接受一个指纹、返回一个标量概率或得分即可例如梯度提升树、支持向量机决策函数或神经网络。七、测试与验证模块自带单元测试 rdkit/Chem/Draw/UnitTestSimilarityMaps.py可用来验证环境配置与理解权重语义testSimilarityMap用苯环c1ccccc1与吡啶c1ccncc1对比断言各种指纹Morgan/AP/TT/RDK的原子权重精确值。例如 Morgan 半径 2 位向量下权重为[0.5, 0.5, 0.5, -0.5, 0.5, 0.5]——氮原子位置的权重为负正对应该原子处两分子不同归一化后变为[1.0, 1.0, 1.0, -1.0, 1.0, 1.0]最大权重 0.5。testSimilarityMapKWArgs通过includeChirality验证手性信息对原子对/扭转/Morgan 指纹的贡献原子对与扭转需配合原子对指纹摩根用useChirality可验证手性中心原子的贡献在手性开启后下降。testSimilarityMapsMolDraw2D冒烟测试 SVG 输出覆盖三种colorMap输入方式。testGithub4763回归测试字符串颜色图coolwarm渲染不出现背景填充残留色。这些测试同时印证了文档中的关键结论Dice 是默认度量、归一化后最大绝对权重为 1、负权重对应两分子存在差异的原子。八、常见问题与使用建议fpFunction报参数错误该函数签名必须为(mol, atomId)。需要带额外参数半径、fpType、手性标志等时用lambda包装且atomId必须以关键字形式传给内部函数。metric的选择默认 Dice官方示例还演示了DataStructs.TanimotoSimilarity。两者对分母的定义不同会直接影响权重数值但对图谱的定性解读影响不大。maxweight的含义GetSimilarityMapForFingerprint/GetSimilarityMapForModel返回的第二个值是归一化前的最大绝对权重见测试中断言maxWeight 0.5可用于跨分子比较相似性强度。无 matplotlib 环境默认 PiWG 颜色图不依赖 matplotlib使用字符串或 matplotlib 颜色图对象时才需要安装 matplotlib缺省会抛ValueError。单原子分子GetSimilarityMapFromWeights要求原子数 ≥ 2否则抛出ValueError。新代码优先使用 FingerprintGenerator 版本GetSimilarityMapForFingerprintGenerator通过AtomsPerBit一次性建立原子-位映射避免逐原子重算对大型分子更高效。总结RDKit 的SimilarityMaps模块用一套统一的权重计算 → 归一化 → 等高线渲染管线覆盖了三种场景指纹相似性分解GetSimilarityMapForFingerprint、任意原子属性/描述符可视化GetSimilarityMapFromWeights以及机器学习模型预测的解释GetSimilarityMapForModel。无论你是在做 SAR 分析、分子筛选后的差异定位还是模型可解释性研究都可以用同一套 API 快速生成哪个原子、贡献多大、正贡献还是负贡献的直观答案。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit PostgreSQL Cartridge 完全指南在 PostgreSQL 中直接存储分子、指纹并执行相似性检索与 GiST 索引加速RDKit PostgreSQL Cartridge 完全指南在 PostgreSQL 中直接存储分子、指纹并执行相似性检索与 GiST 索引加速 RDKit科学计算科研机器学习RDKit 原子对指纹工具模块解析AtomPairs.Utils 的原子编码位域与相似度度量RDKit 原子对指纹工具模块解析AtomPairs.Utils 的原子编码位域与相似度度量 导读 本文围绕 RDKit 官方文档页 rdkit.Chem.A科学计算科研机器学习如何为RDKit贡献代码从入门到精通的完整指南如何为RDKit贡献代码从入门到精通的完整指南 RDKit是一个开源的化学信息学工具包提供了丰富的分子处理和分析功能。本指南将详细介绍如何参与RDKit项目科学计算科研机器学习上一篇Reka UIRadix Vue组件样式定制完全指南从 CSS 到 Tailwind 的无样式组件架构下一篇如何快速掌握B站视频下载DownKyi完整使用指南与5个高效技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表