AIDD - 人工智能药物设计 -使用 Butina 模块对相似化合物进行聚类
使用 Butina 模块对相似化合物进行聚类
RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 Butina 模块的聚类算法,它可以通过准备化合物之间的
距离矩阵来对相似的化合物进行分类。
RDKit 提供了一个基于化合物相似性的聚类模块。其中一种是名为 Butina 模块的聚类算法,它可以通过准备化合物之间的
距离矩阵来对相似的化合物进行分类。
01 环境
- 窗户 11
- Python 3.8.8 版
- RDKit 2021.09.4
**
**
02 准备
我们将讨论 Asinex 的构建块。
首先,加载 pickle 文件。
- from rdkit import DataStructs
- from rdkit.Chem import AllChem, Draw
- from rdkit.ML.Cluster import Butina
- import numpy as np
- import pandas as pd
- import time
- import matplotlib.pyplot as plt
- import collections
- df = pd.read_pickle(“Asinex_Building_Blocks.pkl”)
从加载的分子中创建 Morgan 指纹图谱。
- mols = df[‘ROMol’]
- morgan_fp = [AllChem.GetMorganFingerprintAsBitVect(x, 2, 2048) for x in mols]
03 计算距离
接下来,根据您之前创建的指纹计算谷本之间的距离。
但是,距离矩阵应以三角矩阵的形式计算,其内容应以列表形式排列。
- t1 = time.time()
- dis_matrix = []
- for i in range(1, len(morgan_fp)):
- similarities = DataStructs.BulkTanimotoSimilarity(morgan_fp[i], morgan_fp[:i],
- returnDistance = True)
- dis_matrix.extend(similarities)
- t2 = time.time()
- print(‘t2 - t1:’, t2 - t1)
计算 22,525 种化合物的距离矩阵大约需要 1 分钟。
由于元素数量大且内存消耗显著,因此在使用以下 Butina 模块后删除
dis_matrix变量可能是可以的。
04 聚类分析
使用 Butina.ClusterData 函数进行聚类分析。
- cutoff = 0.5
- t3 = time.time()
- clusters = Butina.ClusterData(dis_matrix, len(morgan_fp), cutoff, isDistData = True)
- t4 = time.time()
- 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 的小簇。)
- num_cluster_random = np.random.randint(0, len(clusters))
- cluster_random = [mols[x] for x in clusters[num_cluster_random]]
- Draw.MolsToGridImage(cluster_random, molsPerRow = 5)
(如果 num_cluster_random = 260)
您可以直观地看到相似的化合物被聚集。
我们来检查一下有多少个大小的集群。
您可以看到,大多数集群的元素计数为 1。
- clusters_count = collections.Counter(len(x) for x in clusters)
- left = [x for x in clusters_count.keys()]
- height = [x for x in clusters_count.values()]
- plt.xlabel(‘Number of clusters’, fontsize=20)
- plt.ylabel(‘Number of molecules’, fontsize=20)
- plt.bar(left, height)
- plt.show()
我们还来看看每个簇中存储了多少分子。
- fig = plt.figure(1, figsize=(10, 4))
- plt1 = plt.subplot(111)
- plt.axis([0, len(clusters), 0, len(clusters[0])+1])
- plt.xlabel(‘Cluster index’, fontsize=20)
- plt.ylabel(‘Number of molecules’, fontsize=20)
- plt.tick_params(labelsize=16)
- plt1.bar(range(1, len(clusters)), [len© for c in clusters[:len(clusters)-1]], lw=0)
- plt.show()
仅收集具有大量元素的集群在以后可能会很有用。
让我们尝试只收集具有 100 个或更多元素的聚类(例如,作为其他聚类方法的教材)。
- large_clusters = [x for x in clusters if len(x) >= 100]
这一次,我们根据从 Morgan 指纹计算出的 Tanimoto 距离进行聚类,但如果您根据其他索引准备距离矩阵,则可以使用相同的方法进行聚类。
如果可以对相似的化合物进行聚类,则可以通过从每个簇中选择具有代表性的分子来构建一个包含各种偏倚较小的分子的文库。
/ 原文链接:使用 Butina 模块 #chemoinformatics 对相似化合物进行聚类 - Qiita