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

相关推荐
zm-v-1593043398631 分钟前
ArcGIS 水文分析升级:基于深度学习的流域洪水演进过程模拟
人工智能·深度学习·arcgis
拓端研究室1 小时前
视频讲解|核密度估计朴素贝叶斯:业务数据分类—从理论到实践
人工智能·分类·数据挖掘
灵智工坊LingzhiAI2 小时前
人体坐姿检测系统项目教程(YOLO11+PyTorch+可视化)
人工智能·pytorch·python
昨日之日20062 小时前
Video Background Remover V3版 - AI视频一键抠像/视频换背景 支持50系显卡 一键整合包下载
人工智能·音视频
SHIPKING3932 小时前
【机器学习&深度学习】什么是下游任务模型?
人工智能·深度学习·机器学习
子燕若水6 小时前
Unreal Engine 5中的AI知识
人工智能
极限实验室7 小时前
Coco AI 实战(一):Coco Server Linux 平台部署
人工智能
杨过过儿8 小时前
【学习笔记】4.1 什么是 LLM
人工智能
巴伦是只猫8 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
大千AI助手8 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配