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

相关推荐
灵机一物16 小时前
灵机一物AI原生电商小程序、PC端(已上线)-Token成产研新KPI:2026年,AI提效、数字员工与研发效能变革
人工智能
薛定猫AI16 小时前
【深度解析】Pi 极简终端 Coding Agent:为什么 4 个工具反而更适合 AI 编程?
人工智能
冷小鱼16 小时前
AI+时代的算力基石:CPU、GPU、NPU的技术革命与产业博弈
人工智能
YaraMemo16 小时前
数学优化问题中的三大转化:多目标转化为单目标,多变量转化为单变量,有约束转化为无约束
人工智能·算法·5g·信息与通信·信号处理
iwgh16 小时前
小落同学:可用十年前老笔记本纯CPU跑的全套虚拟人方案
人工智能·虚拟人·小落同学·克隆自己·数字人克隆·虚拟客服
头条快讯16 小时前
中国非遗美食文化的跨国传承:鲁味居在北美市场的标准化实践与布局
大数据·人工智能
Cosolar17 小时前
大型语言模型(LLM)微调与量化技术全指南——从预训练到高效部署
人工智能·后端·面试
薛定谔的猫36917 小时前
深入浅出:大语言模型 Agent 的工作原理与应用
人工智能·自动化·大模型·llm·ai agent
小e说说17 小时前
解锁小学生学习兴趣密码,这些互动APP超神了!
人工智能
风雅GW17 小时前
多 Agent 系统设计参考框架(OpenClaw 实现版)
人工智能·ai·agent·openclaw