通过缩小Fingeprint的尺寸来可视化复合空间

2019年10月26日

让我们使用对公众开放的化合物数据集,根据化学结构可视化化合物空间(化学空间)。

动机

复合空间的可视化
-数据集中是否有任何独特的化合物?
・所含化合物的种类和数量
它将帮助您理解。 在为QSAR和机器学习创建预测模型时,您可以大致确定数据是否具有推断。

如何

指纹计算

通过为每种化合物生成指纹并减小尺寸,可以在平面上进行绘制。 根据Johnson和Maggiora的相似性质的原理,“相似的化合物具有相似的性质”,具有相似结构和性质的化合物应在平面上彼此靠近分布。

对于用于可视化的指纹,请尝试使用Morgan指纹和RDkit指纹。

参考:RDkit 中可用的指纹

降维方法

为了降低尺寸,请尝试使用主成分分析(PCA)和UMAP。 PCA是最常用的方法,但它会根据数据的线性度压缩到较低维度的空间中,因此它可能不适用于0-1等数据,例如指纹。
另一方面,UMAP是考虑非线性分量的降维方法之一。像相同方法的标准t-SNE一样,降维速度可以快几倍完成,因此可以用于大型数据集。

使用kmeans方法和“光谱聚类”进行聚类。
kmeans方法通过重复一系列操作进行聚类:(XNUMX)随机安装聚类;(XNUMX)添加附近的数据点以更新重心的位置;(XNUMX)使用更新的数据在附近重新找到重心重心。 众所周知,诸如Moon和Swiss roll之类的非线性数据无法很好地分类,但是Spectral Clustering似乎能够处理此类数据。 如果kmeans方法不起作用,即使是scikit学习备忘单也是一种选择。

我想将它们与假定正态分布和线性数据的“ PCA x kmeans方法”以及支持非线性数据的“ UMAP x光谱聚类”相结合。

顺便说一句,还有一种方法是基于tanimoto系数对化合物进行聚类(两个化合物之间的相似性用2到0表示。与1相同的结构),通常用作化合物相似性的指标,但是这次我尝试了。不是...

参考:高维数据的降维和二维绘图技术
   光谱聚类(聚类分析)

让我们可视化复合空间

对数据集使用分子网的亲脂性。大约4200种化合物包含其各自的SMILES和实验logP(疏水性指数:辛醇/水分配系数)。

另请参见:化合物数据集列表

#软件包import pandas as pd import numpy ass from sklearn.cluster import KMeans from sklearn.decomposition import PCan from sklearn.cluster import SpectralClustering import umap from rdkit import Chem from rdkit.Chem import AllChem import matplotlib.pyplot as plt%matplotlib inline #读取数据集df = pd.read_csv('Lipophilicity.csv')打印(df.info())df.head(5)


RangeIndex:4200个条目,0到4199
数据列(共3列):
CMPD_CHEMBLID 4200非空对象
exp 4200非空float64
微笑4200非空对象
dtypes:float64(1),对象(2)内存使用量:98.5+ KB无

logP数据集

 

#Morgan和RDkit获取指纹摩尔数= [Chem.MolFromSmiles(x)for x in df.smiles] morgan_fps = [AllChem.GetMorganFingerprintAsBitVect(x,2,1024)for x in mols] rdkit_fps = [Chem.RDKFingerprint(x,fpSize = 1024)for x in mols]#将指纹存储在DF中df_morgan_fps = pd.DataFrame(np.array(morgan_fps))df_rdkit_fps = pd.DataFrame(np.array(rdkit_fps))

摩根指纹计算从原子到设定半径范围内的子结构。 一种类似于ECFP(扩展连接指纹)指纹的算法,其中Morgan的半径2对应于ECFP4。在这里,我们计算半径= 2位的指纹。
RDkit指纹根据键长而不是原子的半径对部分结构进行计数。这类似于“日光”指纹。默认情况下,最小路径长度:1个连接–最大路径长度:考虑7个连接。

获得的指纹是由于无法用类似的对象原样执行后续处理,因此请将其校正为数据帧。
 

#kmeans聚类kmeans = KMeans(n_clusters = 8,n_jobs = -1)kmeans.fit(df_morgan_fps)#使用PCA减少尺寸pca = PCA(n_components = 2)decomp = pca.fit_transform(df_morgan_fps)x =反压缩[:,0 ] y =反压缩[:,1] #Visualization plt.figure(figsize =(15,5))#由kmeans plt.subplot(1,2,1)plt.scatter(x,y)获得的颜色编码聚类, c = kmeans.labels_,alpha = 0.7)plt.title(“ PCA:morgan_fps,群集”)plt.colorbar()#用logP编码的颜色plt.subplot(1,2,2)plt.scatter(x,y, c = df.exp,alpha = 0.7,cmap =“ spring”)plt.title(“ PCA:morgan_fps,logP”)plt.colorbar()

使用RDkit指纹可视化复合空间的结果。

同样,将df_morgan_fps部分更改为df_rdkit_fps,并使用RDkit指纹将其可视化。不知何故,RDkit指纹的投影效果更佳↓

#通过“ UMAP x光谱群集”可视化的RDkit指纹sc = SpectralClustering(n_clusters = 50,亲和力=“ nearest_neighbors”,n_jobs = -1)sc.fit(df_rdkit_fps)嵌入= umap.UMAP(n_neighbors = 50,n_components = 2, min_dist = 0.5).fit_transform(df_rdkit_fps)x =嵌入[:,0] y =嵌入[:,1]图=图数字(figsize =(15,5))图子图(1,2,1)) plt.scatter(x,y,c = sc.labels_,alpha = 0.7)plt.title(“ rdkit_fps,SpectralCluster”)plt.colorbar()plt.subplot(1,2,2)plt.scatter(x,y ,c = df.exp,alpha = 0.7,cmap ='spring')plt.title(“ rdkit_fps,logP”)plt.colorbar()

我觉得“ UMAP x光谱聚类”比“ PCA x kmeans”更密集地填充有相似的化合物,但是任何一个都可以。

关于logP,平面上的位置与物理性质值之间的关系是微妙的。自动编码器或监督学习对于与化合物的物理性质和活性值相关的二维空间绘图似乎更好,所以我想尽快尝试一下。