Seurat链接 Leidenalg实现 & Louvain.vs.leiden 速度测试

简介: 本文记录了在Win10平台通过Rstudio使用reticulate为 Seurat::FindClusters 链接Python环境下的Leidenalg算法进行聚类的实现过程。并对Louvain和Leiden算法的运算速度在不同平台进行比较,相关结果以供参考学习

本文记录了在Win10平台通过Rstudio使用reticulate为 Seurat::FindClusters 链接Python环境下的Leidenalg算法进行聚类的实现过程Leidenalg error · Issue #2512 · satijalab/seurat (github.com)。同时,在Seurat和Scanpy流程框架下,对Louvain和Leiden算法在处理10万个细胞样本量的虚拟表达矩阵时的速度表现进行了测试。测试结果表明,声称比Louvain算法有计算速度提升的Leiden算法并没有表现出宣称的速度优势。在大型数据集的搜索速度上,Louvain算法会领先Leiden算法几倍的时间。

1、配置win10 Python环境 + Seurat::FindClusters 中链接 Leidenalg

背景: Leiden 在2018年被提出,算法相比 Louvain 优化了社区分割策略,可以产生更高质量的连通社区。在计算速度上也比较 Louvain 更快。Louvain 算法作者也曾表示推荐使用 Leiden algorithm 替代Louvain 进行大规模的社区识别。

$\,\,\,\,\,$安装好conda之后,可以根据需求配置conda channel, 参考 :python版本管理神器miniconda使用指南

**参考 config.json**
            {
                "colorScheme": "Tango Dark",
                "commandline": "cmd.exe /K C:\Users\<user_name>\anaconda3\Scripts\activate.bat,
                "cursorShape": "filledBox",
                "experimental.retroTerminalEffect": false,
                "guid": "{XXXX-XXXX}",
                "hidden": false,
                "icon": "C:\Users\<user_name>\anaconda3\Menu\anaconda-navigator.ico",
                "name": "Anaconda Prompt",
                "scrollbarState": "hidden",
                "startingDirectory": "%USERPROFILE%",
                "useAcrylic": true
            },
  • 第三步,安装好Anaconda之后,在Anaconda Prompt 中创建conda环境和安装scanpy系列软件:

conda create -n scRNA python=3.9
conda activate scRAN
conda install -c conda-forge scanpy python-igraph leidenalg
pip install scanpy
  • 第四步,在Rstudio中调用 reticulate 配置python解释器:

参考:Seurat 4 R包源码解析 22: step10 细胞聚类 FindClusters() | 社群发现

reticulate::use_python("C:\\Users\\<user>\\anaconda3\\envs\\scRNA\\python.exe") ### Windows中的 python为.exe
reticulate::py_module_available("leidenalg") ### 检查leiden是否可用,显示为 True 即代表正确链接到刚刚配置的 scRNA conda环境

Linux conda环境下配置python 代码示例: reticulate::use_python(system("which python", intern = T))

NOTE: Windows系统下每次打开R会话加载 Seurat之前,必须首先通过以上代码配置 python解释器,然后再跑 Seurat::FindClusters(),不然会无法正确链接到环境Linux 系统不存在此问题
  • 第五步,在Rstudio中使用 Seurat::FindClusters() 调用 leiden 算法:

pacman::p_load(Seurat,dplyr)
pbmc_small %>% FindClusters(algorithm = 4,resolution = 0.5)

r-miniconda 题外话:
关于r-miniconda 环境的存在,如果系统不存在conda环境,reticulate 将提供安装基于Miniconda的轻量级R语言环境 r-miniconda环境服务,存在于用户的 "C:/Users//AppData/Local/r-miniconda" 目录下。如果不需要使用,可以简单通过以下命令快速卸载: reticulate::miniconda_uninstall(path = reticulate::miniconda_path()), 这样在 Anaconda Prompt 通过 "conda env list"查询环境的时候就不会显示 r-miniconda内建立的环境了。

2、Louvain vs Leiden 算法速度表现测试

2.1 Seurat 测试5w随机细胞数下 Louvain vs Leiden 聚类速度

虽然 Leiden 是 Louvain的优化版本,但 不建议在R平台下链接python的 Leiden ,实测使用 5w细胞数时该算法会抛出异常 long vectors not supported yet: ../../src/include/Rinlinedfuns.h:537

测试代码

### Prepare env
pacman::p_load(Seurat,dplyr)
reticulate::use_python(system("which python", intern = T))
reticulate::py_module_available("leidenalg")

### PrePare Test OBT
C_50k <- Matrix::Matrix(ncol = 5e4, data = rpois((1e4) * (5e4),lambda = 0.3), sparse = TRUE)
rownames(C_50k) <- paste0("g.",1:nrow(C_50k)); colnames(C_50k) <- paste0("c.",1:ncol(C_50k))
C_50k <- CreateSeuratObject(counts = C_50k) %>%  
    NormalizeData(verbose = 0) %>% FindVariableFeatures(verbose = 0) %>% 
    ScaleData(verbose = 0) %>% RunPCA(verbose = 0) %>% 
    FindNeighbors(dims = 1:30)

### Test Clustering Algorithm
###############################################################################################################
Louvain_.time <- system.time({cur_seu %>% FindClusters(resolution = 1,algorithm = 1,verbose = 0)})[["elapsed"]] # 1 = original Louvain algorithm; 
LouvainM.time <- system.time({cur_seu %>% FindClusters(resolution = 1,algorithm = 2,verbose = 0)})[["elapsed"]] # 2 = Louvain algorithm with multilevel refinement;
SLM_____.time <- system.time({cur_seu %>% FindClusters(resolution = 1,algorithm = 3,verbose = 0)})[["elapsed"]] # 3 = SLM algorithm; 
Leiden__.time <- system.time({cur_seu %>% FindClusters(resolution = 1,algorithm = 4,verbose = 0)})[["elapsed"]] # 4 = Leiden algorithm

2.2 Scanpy 测试10w随机细胞数下 Louvain vs Leiden 聚类速度

在面对10万个细胞的数据集时,本测试发现在Sanpy中使用Louvain聚类的耗时最短,仅为8秒。相比之下,同样在该平台下使用Leiden算法的速度表现略显逊色,用时接近1分钟,并没有宣传中提到的速度优化表现。受到R语言本身特性的影响,Seurat中同样使用Louvain进行聚类的耗时高达30分钟,相比Python平台差了100余倍。

测试代码

{r}
pacman::p_load(Seurat,dplyr)
#### PrePare Test OBT
C_100k <- Matrix::Matrix(ncol = 1e5, data = rpois((1e4) * (1e5),lambda = 0.3), sparse = TRUE)
rownames(C_100k) <- paste0("g.",1:nrow(C_100k)); colnames(C_100k) <- paste0("c.",1:ncol(C_100k))

Seurat_100k <- CreateSeuratObject(counts = C_100k) %>%  
    NormalizeData(verbose = 0) %>% FindVariableFeatures(verbose = 0) %>% 
    ScaleData(verbose = 0) %>% RunPCA(verbose = 0) %>% 
    FindNeighbors(dims = 1:30)

system.time({Seurat_100k %>% FindClusters(resolution = 1,algorithm = 1,verbose = 0)})[["elapsed"]]

#### Format Seurat to H5
dior::write_h5(Seurat_100k,file = "Seurat_100k.h5")
Switch to Python -------------------------------------------------
{py}
import scanpy as sc
import diopy
import h5py

### Format H5 to Adata
h5 = h5py.File('Seurat_100k.h5', 'r')
adata = diopy.input.h5_to_adata(h5 = h5, assay_name='RNA')
h5.close()
### Add SNN key_dict that was missing when dior was written out h5
adata.uns['neighbors'] = {'connectivities_key': 'connectivities','distances_key': 'distances','params': {'n_neighbors': 20, 'method': 'umap', 'random_state': 0, 'metric': 'euclidean'}}

#__________________________________________
from timeit import default_timer as timer
start = timer()
sc.tl.leiden(adata, resolution = 1, key_added = "leiden_cluster")
print("leiden Time Elaped: ",timer() - start)
#__________________________________________
from timeit import default_timer as timer
start = timer()
sc.tl.louvain(adata, resolution = 1, key_added = "louvain_cluster")
print("louvain Time Elaped: ",timer() - start)

Reference

Preprocessing and clustering 3k PBMCs — Scanpy documentation (scanpy-tutorials.readthedocs.io)
Installing Python Packages • reticulate (rstudio.github.io)
单细胞转录组经典聚类算法:Louvain与Leiden
Scanpy 与 Seurat 数据互通

目录
相关文章
|
6月前
|
关系型数据库 Java 测试技术
云效产品使用常见问题之流水线Maven单元测试链接rds要配置白名单如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
6月前
|
前端开发 JavaScript Java
java测试链接超时返回前端
java测试链接超时返回前端
61 0
|
6月前
|
数据采集 DataWorks 关系型数据库
DataWorks操作报错合集之在DataWorks运行任务时出现链接超时,但在测试连通性时显示正常连通是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
68 0
|
6月前
|
SQL 人工智能 自然语言处理
让老板成为数据分析师--ChatGpt链接本地数据源实战测试
本文探究ChatGpt等AI机器人能否帮助老板快速的做数据分析?用自然语言同老板进行沟通,满足老板的所有数据分析的诉求?
|
6月前
|
存储 应用服务中间件 网络安全
Android 网络链接稳定性测试解决方案
Android 网络链接稳定性测试解决方案
148 0
|
6月前
|
DataWorks 网络协议 Java
DataWorks常见问题之新建StarRocks数据源测试链接不通如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
6月前
华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接
华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接
108 0
|
11月前
|
Ubuntu Linux 虚拟化
linux(四)网络链接测试~
首先,我们创建一个虚拟机,当然,家里要是有那个条件,可以直接去阿里云或者腾讯云买一个虚拟云主机,我这里就直接使用虚拟机来测试了。 关于如何使用vmware创建一个虚拟主机请移步《VMware自定义安装ubuntu系统》这里边有详细的介绍,我这里不再赘述。 我这里安装的是ubuntu20.04LTS 那到目前为止,我手里边就相当于拥有了两台主机,一台是我本地的windows,一台是虚拟机ubuntu
266 0
|
SQL 监控 安全
分享一些渗透测试的工具(压箱底的)(附带下载链接)
分享一些渗透测试的工具(压箱底的)(附带下载链接)
分享一些渗透测试的工具(压箱底的)(附带下载链接)
|
11天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
43 3
下一篇
无影云桌面