马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
利用 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, 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
|