当前位置:   article > 正文

使用RDKit对分子进行聚类_rdkit结构相似性聚类

rdkit结构相似性聚类
  1. from rdkit import Chem
  2. from rdkit.Chem import AllChem
  3. def ClusterFps(fps,cutoff=0.2):
  4. from rdkit import DataStructs
  5. from rdkit.ML.Cluster import Butina
  6. # first generate the distance matrix:
  7. dists = []
  8. nfps = len(fps)
  9. for i in range(1,nfps):
  10. sims = DataStructs.BulkTanimotoSimilarity(fps[i],fps[:i])
  11. dists.extend([1-x for x in sims])
  12. # now cluster the data:
  13. cs = Butina.ClusterData(dists,nfps,cutoff,isDistData=True)
  14. return cs

RDKit实现了Butina聚类算法,基于文献 `Unsupervised Database Clustering Based on Daylight's Fingerprint and Tanimoto Similarity: A Fast and Automated Way to Cluster Small and Large Data Sets', JCICS, 39, 747-750 (1999)`

上面定义好了函数,接下来读取化合物。

  1. ms = [x for x in Chem.SDMolSupplier('ZINC_example.sdf')]
  2. print (len(ms))
  3. output: 10000

计算指纹并聚类,cutoff是指Tanimoto 相似度的阈值 ,差异度大于cutoff的化合物会被分到不同的类别中。

  1. fps = [AllChem.GetMorganFingerprintAsBitVect(x,2,1024) for x in ms
  2. clusters=ClusterFps(fps,cutoff=0.4)
  3. print(clusters[100])
  4. output: (553, 297, 547)
  5. from rdkit.Chem import Draw
  6. from rdkit.Chem.Draw import IPythonConsole
  7. m1 = ms[553]
  8. m2 = ms[297]
  9. m3 = ms[547]
  10. mols=(m1,m2,m3)
  11. Draw.MolsToGridImage(mols)

cluster[100] 中有三个分子,分别是553,297,547号。使用Draw函数绘制如下:

RDkit的聚类算法可以支持10万级别的化合物库,然而在内存为125 GB的服务器上测试20万分子的聚类时,可以看到随着聚类的时间增长,占用的内存也不停增加,最终在半个小时后,聚类20万分子由于内存溢出而崩溃。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/343697
推荐阅读
相关标签
  

闽ICP备14008679号