AIDD - 人工智能药物设计 -使用 Butina 模块对相似化合物进行聚类

使用 Butina 模块对相似化合物进行聚类

RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 Butina 模块的聚类算法,它可以通过准备化合物之间的

距离矩阵来对相似的化合物进行分类。

RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 Butina 模块的聚类算法,它可以通过准备化合物之间的

距离矩阵来对相似的化合物进行分类。

01 环境

  • 窗户 11
  • Python 3.8.8 版
  • RDKit 2021.09.4

**

**

02 准备

我们将讨论 Asinex 的构建块。

首先,加载 pickle 文件。

  1. from rdkit import DataStructs
  2. from rdkit.Chem import AllChem, Draw
  3. from rdkit.ML.Cluster import Butina
  4. import numpy as np
  5. import pandas as pd
  6. import time
  7. import matplotlib.pyplot as plt
  8. import collections
  9. df = pd.read_pickle("Asinex_Building_Blocks.pkl")

从加载的分子中创建 Morgan 指纹图谱。

  1. mols = df['ROMol']
  2. morgan_fp = [AllChem.GetMorganFingerprintAsBitVect(x, 2, 2048) for x in mols]

03 计算距离

接下来,根据您之前创建的指纹计算谷本之间的距离。

但是,距离矩阵应以三角矩阵的形式计算,其内容应以列表形式排列。

  1. t1 = time.time()
  2. dis_matrix = []
  3. for i in range(1, len(morgan_fp)):
  4. similarities = DataStructs.BulkTanimotoSimilarity(morgan_fp[i], morgan_fp[:i],
  5. returnDistance = True)
  6. dis_matrix.extend(similarities)
  7. t2 = time.time()
  8. print('t2 - t1:', t2 - t1)

计算 22,525 种化合物的距离矩阵大约需要 1 分钟。

由于元素数量大且内存消耗显著,因此在使用以下 Butina 模块后删除

dis_matrix变量可能是可以的。

04 聚类分析

使用 Butina.ClusterData 函数进行聚类分析。

  1. cutoff = 0.5
  2. t3 = time.time()
  3. clusters = Butina.ClusterData(dis_matrix, len(morgan_fp), cutoff, isDistData = True)
  4. t4 = time.time()
  5. print('t4 - t3:', t4 - t3)

使用此功能时,以下参数是主要参数:

有关更多信息,请参阅 rdkit.ML.Cluster.Butina 模块的官方文档。 )

  • 用于聚类的距离矩阵
  • 要聚类的分子数
  • 您希望在多大的复合距离上聚集在一起?
  • isDistData 暂时指定 True(默认为 False)

在这种情况下,我们指定了 cutoff = 0.5,因此形成了一个 Tanimoto 距离为 0.5 或更小的集群。

例如,如果该值设置为 0.2,则 Tanimoto 距离为 0.2 或更小的分子将被聚类。

较小的值将导致更细分且高度相似的分子组,而较大的值将导致相似度较低

但元素数量的簇。

Butina.ClusterData 函数的返回值是包含复合编号的元组。

通过使用存储的化合物编号,可以按如下方式提取内部的分子。让我们执行以下三行来说明合适集群的内容。(然而,许多簇是存储分子计数为 1 的小簇。)

  1. num_cluster_random = np.random.randint(0, len(clusters))
  2. cluster_random = [mols[x] for x in clusters[num_cluster_random]]
  3. Draw.MolsToGridImage(cluster_random, molsPerRow = 5)

(如果 num_cluster_random = 260)

您可以直观地看到相似的化合物被聚集。

我们来检查一下有多少个大小的集群。

您可以看到,大多数集群的元素计数为 1。

  1. clusters_count = collections.Counter(len(x) for x in clusters)
  2. left = [x for x in clusters_count.keys()]
  3. height = [x for x in clusters_count.values()]
  4. plt.xlabel('Number of clusters', fontsize=20)
  5. plt.ylabel('Number of molecules', fontsize=20)
  6. plt.bar(left, height)
  7. plt.show()

我们还来看看每个簇中存储了多少分子。

  1. fig = plt.figure(1, figsize=(10, 4))
  2. plt1 = plt.subplot(111)
  3. plt.axis([0, len(clusters), 0, len(clusters[0])+1])
  4. plt.xlabel('Cluster index', fontsize=20)
  5. plt.ylabel('Number of molecules', fontsize=20)
  6. plt.tick_params(labelsize=16)
  7. plt1.bar(range(1, len(clusters)), [len© for c in clusters[:len(clusters)-1]], lw=0)
  8. plt.show()

仅收集具有大量元素的集群在以后可能会很有用。

让我们尝试只收集具有 100 个或更多元素的聚类(例如,作为其他聚类方法的教材)。

  1. large_clusters = [x for x in clusters if len(x) >= 100]

这一次,我们根据从 Morgan 指纹计算出的 Tanimoto 距离进行聚类,但如果您根据其他索引准备距离矩阵,则可以使用相同的方法进行聚类。

如果可以对相似的化合物进行聚类,则可以通过从每个簇中选择具有代表性的分子来构建一个包含各种偏倚较小的分子的文库。

/ 原文链接:使用 Butina 模块 #chemoinformatics 对相似化合物进行聚类 - Qiita

相关推荐
掘金安东尼1 分钟前
如何为 AI 编码代理配置 Next.js 项目
人工智能
aircrushin22 分钟前
轻量化大模型架构演进
人工智能·架构
文心快码BaiduComate1 小时前
百度云与光本位签署战略合作:用AI Agent 重构芯片研发流程
前端·人工智能·架构
风象南2 小时前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
Mintopia3 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮3 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬3 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia4 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区4 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两7 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent