使用HDBSCAN 算法对分子聚类

摘要:
对于分子的聚类分析,我们必须首先考虑其描述符的问题。分子描述符通常是非常高维的,因此我们必须减小它们的尺寸以继续后续分析,特别是当分子量特别大时。常见的降维方法包括PCA、TSNE和UMAP。首先,TSNE用于可视化。有许多聚类方法,如k均值和分层聚类。然而,一种需要定义k,另一种需要确定阈值。这样,使用试错法来合理设置两个量,这不是很方便。因此,我选择使用HDBSCAN,另一种基于数据加密

对分子进行聚类分析,首先必须要考虑的是其描述符的问题,分子描述符通常是非常高维的,必须对其进行降维才好继续后面的分析,特别分子量特别大的时候。常用的降维手段有PCA,TSNEUMAP.一说,TSNE用于可视化.

聚类的方法有许多,比如k-means,层次聚类. 但是这两个一个需要定义k,一个需要定义阈值,这样需要试错法合理进行着两个量的设置,不是很方便. 因而,我选择使用HDBSCAN,一个基于数据密度的聚类算法,参考文献如下:

https://link.springer.com/chapter/10.1007%2F978-3-642-37456-2_14

我选择使用 HDBSCAN.

先导入所需要的各种库. 后面还会使用到 mlinsght 库.

%matplotlib inline
import os
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from rdkit import Chem, DataStructs
from rdkit.Chem import AllChem, Draw
from rdkit import RDLogger
from sklearn.model_selection import train_test_split
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.manifold import TSNE
from mlinsights.mlmodel import PredictableTSNE
from hdbscan import HDBSCAN
 
sns.set_context('poster')
sns.set_style('white')
sns.set_color_codes()
plot_kwds = {'alpha' : 0.5, 's' : 80, 'linewidths':0}
RDLogger.DisableLog('rdApp.*')
seed = 794

HDBSCAN需要接受一个衡量分子间距离或者相似度的参数,可以自定义,这里我定义了tanimoto-dist函数,使用方法如下面的代码所示:

使用的时候发现自定义的tanimoto速度太慢了。。。。

oxrs = [("CHEMBL3098111", "Merck" ),  ("CHEMBL3867477", "Merck" ),  ("CHEMBL2380240", "Rottapharm" ),
             ("CHEMBL3352684", "Merck" ),  ("CHEMBL3769367", "Merck" ),  ("CHEMBL3526050", "Actelion" ),
             ("CHEMBL3112474", "Actelion" ),  ("CHEMBL3739366", "Heptares" ),  ("CHEMBL3739395", "Actelion" ), 
             ("CHEMBL3351489", "Eisai" )]
 
fps = []
docs = []
companies = []
mol_list = []
for cid, company in oxrs:
    sdf_file = os.path.join("data", cid + ".sdf")
    mols = Chem.SDMolSupplier(sdf_file)
    for mol in mols:
        if mol is not None:
            mol_list.append(mol)
            fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
            arr = np.zeros((1,))
            DataStructs.ConvertToNumpyArray(fp, arr)
            docs.append(cid)
            companies.append(company)
            fps.append(arr)
fps = np.array(fps)
companies = np.array(companies)

def tanimoto_dist(ar1, ar2): # 接收两个numpy 数组
    a = np.dot(ar1, ar2)
    b = ar1 + ar2 - ar1*ar2
    return 1 - a/np.sum(b)

# 实例化HDBSCAN类 
clusterer = HDBSCAN(algorithm='best', 
                    min_samples=5, 
                    metric='pyfunc', 
                    func=tanimoto_dist)
clusterer.fit(fps)
docs = np.array(docs)
 
trainIDX, testIDX = train_test_split(range(len(fps)), random_state=seed)

接下来我们来对数据进行可视化,使用到了tsne技术,下面两图的分子分别以company作为颜色标签和HDBSACA聚类结果作为颜色标签.

tsne = TSNE(random_state=seed)
res = tsne.fit_transform(fps)
plt.clf()
plt.figure(figsize=(12, 6))
sns.scatterplot(res[:,0], res[:,1], hue=companies, **plot_kwds)
 
plt.clf()
plt.figure(figsize=(12, 6))
palette = sns.color_palette()
cluster_colors = [sns.desaturate(palette[col], sat)
                 if col >= 0 else (0.5, 0.5, 0.5) for col, sat in zip(clusterer.labels_, clusterer.probabilities_)]
plt.scatter(res[:,0], res[:,1], c=cluster_colors, **plot_kwds)

img

coloured with company name

img

coloured with hdbscan label.

图中灰色的是没有标签的数据。结果表明HDBSCAN还是聚的不错的。

映射新化合物到已定义的化学空间

下一个主题是如何在预定的化学空间中绘制新化合物。 从理论上讲,PCAtSNE不能将新数据添加到预定义的潜在分布空间。 如果用户想添加新数据,则需要重新计算。 但是我们想将新设计的化合物映射到当前的化学空间。 嗯... 怎么做?

答案是: mlinghts. 这个库包含 PredictableTSNE 类.从名字上就不难看出它是干啥的了。 这个类接收一个TSNE实例和一个用于预测的估计器.

在下面的例子中,我们使用 random forestGP回归器.

trainFP = [fps[i] for i in trainIDX]
train_mol = [mol_list[i] for i in trainIDX]
 
testFP = [fps[i] for i in testIDX]
test_mol = [mol_list[i] for i in testIDX]
allFP = trainFP + testFP
tsne_ref = TSNE(random_state=seed)
res = tsne_ref.fit_transform(allFP)
plt.clf()
plt.figure(figsize=(12, 6))
sns.scatterplot(res[:,0], 
                res[:,1], 
                hue=['train' for i in range(len(trainFP))] + ['test' for i in range(len(testFP))])

img

蓝色的是训练数据,橙色是测试数据.

使用predictiveTSNE 可以预测新化合物在化学空间的所在.下面的例子分别为RFGP.

rfr = RandomForestRegressor(random_state=seed)
tsne1 = TSNE(random_state=seed)
pred_tsne_rfr = PredictableTSNE(transformer=tsne1, 
                                estimator=rfr, 
                                keep_tsne_outputs=True)
pred_tsne_rfr.fit(trainFP, list(range(len(trainFP))))
 
 
pred1 = pred_tsne_rfr.transform(testFP)
plt.clf()
plt.figure(figsize=(12, 6))
plt.scatter(pred_tsne_rfr.tsne_outputs_[:,0], 
            pred_tsne_rfr.tsne_outputs_[:,1], 
            c='blue', 
            alpha=0.5)

plt.scatter(pred1[:,0], 
            pred1[:,1], 
            c='red', 
            alpha=0.5)
 
 
gbr = GaussianProcessRegressor(random_state=seed)
tsne2 = TSNE(random_state=seed)
pred_tsne_gbr = PredictableTSNE(transformer=tsne2, estimator=gbr, keep_tsne_outputs=True)
pred_tsne_gbr.fit(trainFP, list(range(len(trainFP)))pred2 = pred_tsne_gbr.transform(testFP)
plt.clf()
plt.figure(figsize=(12, 6))
plt.scatter(pred_tsne_gbr.tsne_outputs_[:,0], pred_tsne_gbr.tsne_outputs_[:,1], c='blue', alpha=0.5)
plt.scatter(pred2[:,0], pred2[:,1], c='red', alpha=0.5))

img

RF

img

GP

看起来RF的效果要好些.

预测算法对TSNE的性能有很大的影响。 这对于绘制新数据很有用,但存在设计误导的风险。

最后,检查一下聚类标签和preditiveTSNE 预测数据.

allmol = train_mol + test_mol
fps2 = []
clusterer2 = HDBSCAN(algorithm='best',
                     min_samples=5, 
                     metric='pyfunc', 
                     func=tanimoto_dist)
# calc fp
for mol in allmol:
    fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
    arr = np.zeros((1,))
    DataStructs.ConvertToNumpyArray(fp, arr)
    fps2.append(arr)
fps2 = np.array(fps2)

# cluster
clusterer2.fit(fps2)

# plot
plt.clf()
plt.figure(figsize=(12, 6))

plt.scatter(pred_tsne_rfr.tsne_outputs_[:,0], 
            pred_tsne_rfr.tsne_outputs_[:,1],
            c=clusterer2.labels_[:len(trainFP)], 
            alpha=0.5, 
            marker='x')

plt.scatter(pred1[:,0], 
            pred1[:,1],
            c=clusterer2.labels_[len(trainFP):], 
            alpha=0.5, marker='o')

img

x是训练数据, o为测试数据, 颜色 :类别标签.

不仅训练数据而且具有相同颜色的测试数据也出现在几乎相同的区域中。 这表明该方法在这种情况下效果很好。

免责声明:文章转载自《使用HDBSCAN 算法对分子聚类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot2.X自定义参数拦截器,同一请求被拦截两次处理方法, redis在拦截器中无法加载的问题typora文件云同步下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标

原文链接:http://tecdat.cn/?p=16881 灰色关联分析包括两个重要功能。第一项功能:灰色关联度,与correlation系数相似,如果要评估某些单位,在使用此功能之前转置数据。第二个功能:灰色聚类,如层次聚类。  灰色关联度 灰色关联度有两种用法。该算法用于测量两个变量的相似性,就像`cor`一样。如果要评估某些单位,可以转置数据集。...

转载自:【聚类算法】谱聚类(Spectral Clustering)

转载自:【聚类算法】谱聚类(Spectral Clustering) 1、问题描述   谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图(sub-Graph),使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目的。   对于图的相关定义如下: 对于无向图G =...

聚类算法

一、聚类算法简介 聚类是无监督学习的典型算法,不需要标记结果。试图探索和发现一定的模式,用于发现共同的群体,按照内在相似性将数据划分为多个类别使得内内相似性大,内间相似性小。有时候作为监督学习中稀疏特征的预处理(类似于降维,变成K类后,假设有6类,则每一行都可以表示为类似于000100、010000)。有时候可以作为异常值检测(反欺诈中有用)。 应用场景:...

机器学习概念性知识总结

6,正则化: http://blog.csdn.net/zouxy09/article/details/24971995 5,Loss Function http://luowei828.blog.163.com/blog/static/310312042013101401524824/ 4,中英文: 感知器:perceptron 线性回归:linear...

用MATLAB做聚类分析

用MATLAB做聚类分析 近期工作关系用到Matlab做聚类分析。所谓聚类分析,其目的在于将研究的数据样本划分为不同类别。Matlab的统计工具箱提供了相应的分析工具。相关概念在网上可以找到不少资料,这里推荐两个博客供大家参考。 pluskid的漫谈 Clustering 系列:http://blog.pluskid.org/?page_id=78...

R学习之R层次聚类方法(tm包)

1、距离计算  ## method for class 'TermDocumentMatrix' dissimilarity(x, y = NULL, method) ## method for class 'PlainTextDocument' dissimilarity(x, y = NULL, method) 参数说明:    x:文档-词矩阵或...