化学分子 降维算法umap、聚类算法hdbscan和kmeans
参考:
https://github.com/iwatobipen/chemo_info/blob/master/chemicalspace2/HDBSCAN_Chemoinfo.ipynb
https://www.cnblogs.com/liulunyang/p/14275612.html
本文章主要方法:
1、通过umap获取分子的降维特征数据
2、再通过hdbscan或kmeans聚类方法聚类(hdbscan不支持指定最后聚类总数量,可能非常多;kmeans可以指定总的聚类数)
化学分子 降维算法umap、聚类算法hdbscan和kmeans
代码已经上传github:https://github.com/lonngxiang/molecular-clustering
安装
## 安装
1)pip install umap-learn -i https://pypi.douban.com/simple2)hdbscan pip安装报错:
ERROR: Failed building wheel for hdbscan
Failed to build hdbscan
ERROR: Could not build wheels for hdbscan, which is required to install pyproject.toml-based projects解决方法conda安装:conda install -c conda-forge hdbscanconda安装后调用报错:
__init__() got an unexpected keyword argument 'cachedir'解决方法joblib降级:
pip install joblib==1.1.0
代码:
##第一步 指纹获取,下来是2048维
from rdkit import Chem
from rdkit.Chem import DataStructs,AllChem, Draw
import numpy as npX = []
for sim in results["hits"]["hits"]:fragment = sim["_source"]["fragment"]mol = Chem.MolFromSmiles(fragment)arr = np.zeros((0,))fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)DataStructs.ConvertToNumpyArray(fp, arr)X.append(arr)
print('{} mols loaded'.format(len(X)))## 第二部 umap进行降维,默认是降维成2维,umap.UMAP里可以修改n_componentsimport umapdef tanimoto_dist(a,b):dotprod = np.dot(a,b)tc = dotprod / (np.sum(a) + np.sum(b) - dotprod)return 1.0-tcumap_X = umap.UMAP( metric=tanimoto_dist).fit_transform(X)## 第三部 对umap降维处理的数据再次用hdbscan进行降维
import hdbscan
from collections import Countercluster_umap = hdbscan.HDBSCAN(min_cluster_size=5, gen_min_span_tree=True)
cluster_umap.fit(umap_X)cluster_umap.labels_ ##(hdbscan降维后的聚类数)
Counter(cluster_umap.labels_).keys(),Counter(cluster_umap.labels_) ## 查看各聚类中心的数据量 ## 或kmeans进行聚类
from sklearn.cluster import KMeanskmeans=KMeans(n_clusters=10) ##指定10个聚类中心
kmeans.fit(umap_X)
kmeans.labels_
## 最终聚类效果
import seaborn as snspalette = sns.color_palette()
label_prob = zip(cluster_umap.labels_, cluster_umap.probabilities_)
plt.scatter(umap_X.T[0], umap_X.T[1], c = cluster_umap.labels_, cmap='plasma')
化学分子抽取同一聚类的数据查看
这是聚类0中心的数据展示;my_score函数参考这里(sa_score化合物合成难度打分):https://blog.csdn.net/weixin_42357472/article/details/127546269
cluster_umap_dict ={}
for index, value in enumerate(cluster_umap.labels_.tolist()):print("索引:" ,index, ", 值:" ,value)value =str(value)if value not in cluster_umap_dict:cluster_umap_dict[value] = [index]else:cluster_umap_dict[value].append(index)new_mols2 = []
sa_scores2 = []for ii in cluster_umap_dict["0"]: ##这是聚类0中心的数据展示sim = results["hits"]["hits"][ii] ##results["hits"]["hits"] 这是总共分子的原始数据fragment = sim["_source"]["fragment"]if Counter(fragment)["*"] ==1:# 统计词频new_fragment = ("N(C([C@H](N)CCCCN)=O)[C@H](C)C*" + fragment).replace("*","")# print(new_fragment)mol = Chem.MolFromSmiles(new_fragment)new_mols2.append(mol)sa_score = my_score(mol)sa_scores2.append(sa_score)Draw.MolsToGridImage(new_mols2,subImgSize=(300,300), molsPerRow=5,legends=["sa_score: "+str(ii)for ii in sa_scores2])
这是聚类20中心的数据展示
new_mols2 = []
sa_scores2 = []for ii in cluster_umap_dict["20"]:sim = results["hits"]["hits"][ii]fragment = sim["_source"]["fragment"]if Counter(fragment)["*"] ==1:# 统计词频new_fragment = ("N(C([C@H](N)CCCCN)=O)[C@H](C)C*" + fragment).replace("*","")# print(new_fragment)mol = Chem.MolFromSmiles(new_fragment)new_mols2.append(mol)sa_score = my_score(mol)sa_scores2.append(sa_score)Draw.MolsToGridImage(new_mols2,subImgSize=(300,300), molsPerRow=5,legends=["sa_score: "+str(ii)for ii in sa_scores2])
hdbscan预测新数据approximate_predict
参考:https://hdbscan.readthedocs.io/en/latest/prediction_tutorial.html
注意: hdbscan.HDBSCAN里prediction_data=True需要设置为True;二是hdbscan.approximate_predict预测里数据格式是array,如果是单条需要放列表里
import hdbscancluster_umap = hdbscan.HDBSCAN(min_cluster_size=5, gen_min_span_tree=True, prediction_data=True)
cluster_umap.fit(umap_X)##测试新数据cluster, prob = hdbscan.approximate_predict(cluster_umap,[[ 7.5436993 , 5.556767 ],[ 8.059909 , 1.9189416 ]])
cluster, prob
化学分子 降维算法umap、聚类算法hdbscan和kmeans相关推荐
- 图解机器学习算法(13) | 聚类算法详解(机器学习通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...
- AI中分类算法与聚类算法
学习数据挖掘的朋友,对分类算法和聚类算法都很熟悉.无论是分类算法还是聚类算法,都有许多具体的算法来实现具体的数据分析需求.很多时候,我们难以判断选择分类或者聚类的场合是什么.我们最直观的概念是,分类和 ...
- Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察
ML岗位面试:10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法.回归算法.聚类算法等细节考察 Interview:算法岗位 ...
- 《MATLAB智能算法30个案例》:第20章 基于遗传模拟退火算法的聚类算法
<MATLAB智能算法30个案例>:第20章 基于遗传模拟退火算法的聚类算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...
- 聚类算法--近邻聚类算法(C++实现)
聚类算法–近邻聚类算法(C++实现) 写在前面: 最近邻聚类算法,应该不是KNN,也不是K-means,就是一个特别基础的算法,但是在CSDN没有找到C++实现的这个算法,只有一个python写的 ...
- 单链聚类算法_聚类算法总结
1 什么是聚类算法? 聚类算法就是根据特定的规则,将数据进行分类.分类的输入项是数据的特征,输出项是分类标签,它是无监督的. 常见的聚类规则包括:1)基于原型的,例如有通过质心或中心点聚类, ...
- 聚类算法——层次聚类算法
每篇一句: You must strive to find your own voice. Because the longer you wait to begin, the less likely ...
- [学习笔记] [机器学习] 8. 聚类算法(聚类算法:K-means、K-means++;聚类算法评估;特征降维:特征选择(Pearson相关系数、Spearman相关系数)、PCA主成分分析)
视频链接 数据集下载地址:无需下载 1. 聚类算法简介 学习目标: 掌握聚类算法实现过程 知道 K-means 算法原理 知道聚类算法中的评估模型 说明 K-means 的优缺点 了解聚类中的算法优化 ...
- kmeans算法_KMeans聚类算法详解
1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...
最新文章
- TX2---ORB_SLAM2
- java统计 pv uv_统计PV、UV的新武器——Aviator
- MySql 查询同一字段多个结果合并到一行显示 GROUP_CONCAT
- python 生成payload_利用Python进行Payload分离免杀
- 论文浅尝 | Tree-to-sequence 学习知识问答
- bootstraptable导出excel独立使用_JavaWeb系列之-一小时搞定POI导出Excel
- 使软件可二次开发_RobotStudio二次开发:Smart组件I/O信号声明
- 通过JDK动态代理实现拦截器
- 10种用户友好的验证码
- python面向对象
- 中国最伟大的现实主义诗人:杜甫的一生
- 揭迷网络达人另类赚钱秘笈
- 计算机病毒结构及技术分析
- 车载蓝牙音乐主动获取播放进度(安富方案)
- 这不就是微信朋友圈屏蔽功能吗?推特现在才做出来未免太迟了吧
- 记一道字节跳动的算法面试题
- python行业中性化怎么做_1行代码完成去极值、标准化、行业与市值中性化---以pb因子为例...
- Quartz定时任务调度框架
- 线性递推数列_学习笔记
- 2020-12-18 Dataset之COCO数据集:COCO数据集的简介、下载