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_fpi, 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 clustersnum_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 分钟前
WorkBuddy 保姆级教程开源了!600 多篇 Agent 资料一次性放出
人工智能
辰辉创聚4 分钟前
重组细胞因子全解析:定义、分类与应用指南
人工智能·eclipse·emacs·白细胞介素·重组蛋白·重组细胞因子
小小测试开发5 分钟前
RAG评测:把忠实度、检索命中率、噪声敏感度做成可回归的流水线
人工智能·数据挖掘·回归·kotlin
问天_观心8 分钟前
深入学习Transformer(一)
人工智能·python·深度学习·神经网络·学习·transformer
腾讯数据架构师10 分钟前
摩尔线程 GPU 怎么接入 Kubernetes 跑 DeepSeek?CubeStudio 摩尔线程(MUSA)适配实操
人工智能·云原生·容器·kubernetes·开源·mlops·maas
liliangcsdn12 分钟前
skewness收益偏度取负因子背后逻辑的探索
人工智能·算法·机器学习
yyxx41212313 分钟前
钉钉专属版一年多少钱?2026最新价格
大数据·人工智能·物联网
雷帝木木14 分钟前
DVC数据版本控制实战:让训练数据像代码一样可追溯
人工智能·python·深度学习·机器学习
楠楠子呀15 分钟前
号码验证技术解析:从原理到实践
运维·人工智能·ai·electron·自动化
AI棒棒牛16 分钟前
YOLO26最新创新改进系列:Dirichlet 分类证据 + DER 连续框不确定性,独家超强创新!
人工智能·分类·数据挖掘