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

相关推荐
Wnq100722 小时前
世界模型 AI:认知跃迁的可行性与本质性挑战
人工智能
穷人小水滴2 小时前
科幻 「备用肉身虫」 系列设定集 (AI 摘要)
人工智能·aigc·科幻·未来·小说·设定
老赵聊算法、大模型备案2 小时前
北京市生成式人工智能服务已备案信息公告(2025年12月11日)
人工智能·算法·安全·aigc
咬人喵喵2 小时前
上下文窗口:AI 的“大脑容量”
人工智能
workflower2 小时前
时序数据获取事件
开发语言·人工智能·python·深度学习·机器学习·结对编程
weixin_446122462 小时前
一个案例验证 LLM大模型编码能力哪家强
人工智能
老蒋新思维3 小时前
创客匠人峰会深度解析:知识变现的 “信任 - 效率” 双闭环 —— 从 “单次交易” 到 “终身复购” 的增长密码
大数据·网络·人工智能·tcp/ip·重构·数据挖掘·创客匠人
大刘讲IT3 小时前
面向中小企业的企业AI Agent未来3年构建蓝图规划
人工智能·经验分享·ai·开源·制造
yzx9910133 小时前
深度学习的进化之路:从感知机到通用智能的曙光
人工智能·深度学习
是开心的栗子呀3 小时前
阿里云天池:预测二手车交易价格的机器学习项目-高效实现MAE低于500分
人工智能·机器学习·阿里云·ai·云计算