謝林娟,李荔瑄,張少強(qiáng)
天津師范大學(xué) 計算機(jī)與信息工程學(xué)院,天津 300387
在過去的幾年里,為了人類健康以及診斷、監(jiān)測和治療疾病,單細(xì)胞RNA測序(scRNA-seq)相關(guān)的研究得到了迅速的發(fā)展。包含數(shù)十萬甚至上百萬個單細(xì)胞測序數(shù)據(jù)的多個圖譜項目相繼完成[1-2]。這些項目主要歸功于單細(xì)胞測序技術(shù)的發(fā)展。目前主流的測序平臺能夠一次完成數(shù)千到數(shù)萬個細(xì)胞的測序[3]。但是,由于測序手段的限制以及基因表達(dá)高度復(fù)雜等原因,scRNA-seq數(shù)據(jù)普遍存在噪聲較大、維度較高、稀疏性較強(qiáng)等特點[4]。細(xì)胞分型是單細(xì)胞數(shù)據(jù)分析的重要流程之一[5]?,F(xiàn)在主流的細(xì)胞分型方法先運用主成分分析(principal component analysis,PCA)、t分布隨機(jī)近鄰嵌入(t-dis‐tributed stochastic neighbor embedding,t-SNE)或均勻流形近似和投影(uniform manifold approximation and projection,UMAP)[6]等經(jīng)典數(shù)據(jù)降維方法進(jìn)行數(shù)據(jù)降維或者進(jìn)行特征選擇,然后采用DBSCAN、譜聚類、層次聚類、K-means等經(jīng)典聚類方法進(jìn)行分型。例如SC3[7]運用PCA和t-SNE降 維及K-means進(jìn)行 一 致性聚類;CI‐DR[8]運用PCA降維和層次聚類;SCENA先特征選擇再譜聚類[9]。在幾千細(xì)胞的小規(guī)模測序數(shù)據(jù),這些算法均具有良好的性能。
目前針對大規(guī)模單細(xì)胞RNA測序數(shù)據(jù)的聚類基本采用構(gòu)建簡單的細(xì)胞關(guān)系網(wǎng)絡(luò),并對該網(wǎng)絡(luò)運用社區(qū)檢測的算法(例如魯汶算法[10])來進(jìn)行。而譜聚類和層次聚類算法受限于計算復(fù)雜性,很難應(yīng)用于大數(shù)據(jù)集。PhenoGraph[11]需要是先構(gòu)造k最近鄰(k-nearest neigh‐bors,KNN)圖然后對每一對細(xì)胞的共享最近鄰居(shared nearest neighbors,SNN)重新加權(quán)再用魯汶社區(qū)檢測算法聚類。SCANPY[12]基于UMAP降維后構(gòu)造KNN圖再調(diào)用PhenoGraph聚類。DropClust[13]使用了對數(shù)時間的局部敏感哈希(locality sensitive hashing,LSH)算法來確定每個細(xì)胞的近似KNN,然后用魯汶算法聚類。PARC[14]用對數(shù)時間復(fù)雜性的“分層導(dǎo)航小世界”(hierarchical navigable small world,HNSW)[15]搜索每個細(xì)胞的近似KNN,然后用萊頓模塊優(yōu)化(Leiden modularity optimization)[16]的社區(qū)檢測算法進(jìn)行聚類。這些大規(guī)模聚類工具大都通過近似構(gòu)造KNN圖來提高計算速度。雖然基于社區(qū)檢測的萊頓算法和魯汶算法能夠保證計算速度,但是其準(zhǔn)確度低于其他聚類算法[17-18]。scAIDE[19]是一個先用自動編碼器插補和降維,然后用隨機(jī)投影哈希(random projection hashing,RPH)初始化聚類質(zhì)心(centroid)來加速k-means的方法,該工具可以快速處理大規(guī)模數(shù)據(jù),但需要事先確定類簇數(shù)目。
因此如果能夠構(gòu)造更符合細(xì)胞關(guān)系的網(wǎng)絡(luò)圖并能夠在聚類過程中自動確定類簇數(shù)目,將能夠提升單細(xì)胞數(shù)據(jù)的聚類準(zhǔn)確度。此外,在聚類之前耗費時間最長的是計算細(xì)胞間的相似度。為此,本文結(jié)合openMP和CUDA來進(jìn)行CPU+GPU的異構(gòu)并行計算,并采用KNN和細(xì)胞相似度閾值相結(jié)合的方法構(gòu)建相似網(wǎng)絡(luò),最后通過改進(jìn)馬爾可夫聚類算法(Markov clustering,MCL)[20]來進(jìn)行快速聚類。該算法命名為SCMC(single-cell Markov clustering),其C++代碼在Github開源共享,其代碼及算法說明文檔詳見https://github.com/shaoqiang‐zhang/SCMC/。
給定由細(xì)胞集合C組成的單細(xì)胞表達(dá)矩陣X,其中m為基因數(shù),n為細(xì)胞數(shù)。SCMC首先對輸入表達(dá)矩陣X的每個細(xì)胞的元素進(jìn)行標(biāo)準(zhǔn)化處理;然后計算所有基因的變異系數(shù),并根據(jù)變異系數(shù)閾值進(jìn)行特征基因的選擇;再運用并行計算技術(shù)計算細(xì)胞之間的相似度構(gòu)建細(xì)胞相似網(wǎng)絡(luò);最后通過采用修改的馬爾科夫聚類算法對細(xì)胞相似度網(wǎng)絡(luò)進(jìn)行快速聚類,得到細(xì)胞類型。算法流程見圖1,具體方法步驟見1.2節(jié)至1.5節(jié)描述。
圖1 SCMC算法流程圖Fig.1 Flow chart of SCMC
數(shù)據(jù)預(yù)處理分為以下兩個步驟:基因過濾和細(xì)胞數(shù)據(jù)對數(shù)標(biāo)準(zhǔn)化(log-normalization)。即先從X中移除在所有細(xì)胞表達(dá)值均為0的基因(行),然后對矩陣的每個元素除以該元素所在細(xì)胞列的元素總和再乘以一個比例因子(默認(rèn)為10 000),最后加上偽數(shù)1取對數(shù),見公式(1):
對對數(shù)標(biāo)準(zhǔn)化后的矩陣(x'ij),計算每個基因的變異系數(shù)(coefficient of variation)。變異系數(shù)為基因所在行元素的標(biāo)準(zhǔn)差除以均值。根據(jù)所有基因變異系數(shù)的長尾分布(heavy-tailed)曲線設(shè)置變異系數(shù)變化趨緩的長尾閾值α,根據(jù)閾值α選取變異系數(shù)最大的前T個基因作為特征基因。注意不同的數(shù)據(jù)集會選擇不同的閾值,從而選擇不同數(shù)量的特征基因。
構(gòu)建K近鄰(K-nearest neighbors,KNN)網(wǎng)絡(luò)是目前多數(shù)大規(guī)模細(xì)胞聚類的通用方法。在構(gòu)建KNN網(wǎng)絡(luò)之前,需要計算降維后的兩兩細(xì)胞對應(yīng)特征表達(dá)向量的歐氏距離。設(shè)細(xì)胞i和j對應(yīng)的特征基因的表達(dá)向量分別為x和y,按照公式(2)計算兩細(xì)胞之間的余弦相似度。
根據(jù)公式(3)的推導(dǎo),計算標(biāo)準(zhǔn)化后兩向量的歐氏距離D等價于計算向量的余弦距離[21]。余弦相似度相當(dāng)于對細(xì)胞的特征表達(dá)向量做了標(biāo)準(zhǔn)化處理再求歐氏距離D,因此無需對降維后的細(xì)胞表達(dá)向量再標(biāo)準(zhǔn)化。
因為計算一對細(xì)胞的余弦相似度不需要與別的細(xì)胞交換信息,因此將n個細(xì)胞的所有可能的C2n種細(xì)胞對(cell pairs)組合分配到GPU的所有k個內(nèi)核上進(jìn)行CUDA并行計算。這樣理論上比CPU單線程的運算提高k倍。
對每個細(xì)胞x,計算x與其他所有細(xì)胞間的余弦相似度,并保留相似度最高的前條邊集合Nx和相似度超過閾值β的邊集Bx,得到與頂點x關(guān)聯(lián)的邊集Nx?Bx。由此構(gòu)造擴(kuò)充的K近鄰網(wǎng)絡(luò)(expanded KNN),其中頂點集合為細(xì)胞集合C,邊集為
運用馬爾科夫聚類(Markov clustering,MCL)算法對擴(kuò)充的KNN網(wǎng)絡(luò)進(jìn)行聚類。MCL算法是van Dongen[20]開發(fā)的基于圖的聚類的算法,主要思想是通過概率狀態(tài)轉(zhuǎn)移矩陣進(jìn)行隨機(jī)游走(random walk)。該算法不需預(yù)先設(shè)定聚類數(shù)目,通過反復(fù)修正矩陣以實現(xiàn)隨機(jī)流模擬。
首先根據(jù)細(xì)胞相似網(wǎng)絡(luò)構(gòu)造鄰接矩陣,然后對鄰接矩陣進(jìn)行標(biāo)準(zhǔn)化,即每個矩陣元素除以所在列的所有元素之和得到概率轉(zhuǎn)移矩陣,如公式(4):
構(gòu)造鄰接矩陣每列元素的概率用不到其他列的信息,因此針對每列進(jìn)行并行化設(shè)計(即矩陣每列指派不同的線程處理)。MCL算法是“擴(kuò)展”(Expansion)操作和“膨脹”(Inflation)操作交替重復(fù)執(zhí)行的過程。首先將概率矩陣進(jìn)行擴(kuò)展操作,對矩陣N*進(jìn)行p次冪方得到矩陣M如公式(5):
隨即進(jìn)行膨脹操作,對矩陣M內(nèi)元素進(jìn)行r次冪方得到矩陣G,如公式(6):
判斷矩陣G與擴(kuò)展操作前的矩陣N*是否非常接近,即矩陣G與N*所有相同位置元素之差小于規(guī)定的誤差ε(例如ε=10-4),則收斂,輸出聚類結(jié)果;否則令N*=G繼續(xù)迭代執(zhí)行擴(kuò)展操作和膨脹操作直至收斂。
在實際聚類中,設(shè)置p=2,r=1.5。其中擴(kuò)展操作(公式(5))實際就是矩陣的乘法運算,矩陣被按行和列分塊進(jìn)行并行計算;而膨脹操作(公式(6))與(公式(4))類似的并行設(shè)計,即對G的每列進(jìn)行并行化處理。本文調(diào)用openMP并行庫(https://www.openmp.org/)來并行化MCL的C++代碼。
原始的馬爾科夫聚類結(jié)果常常會產(chǎn)生規(guī)模很小的類簇,甚至只包含一個頂點的孤立點簇(統(tǒng)稱“小類簇”)。對于較大規(guī)模的單細(xì)胞數(shù)據(jù),這些小類簇應(yīng)該不是新的細(xì)胞類型。為此,為了提高聚類的準(zhǔn)確度,SCMC將小類簇重新分配到其他類簇(統(tǒng)稱“大類簇”)中。對每個小類簇S,在擴(kuò)充的KNN網(wǎng)絡(luò)中標(biāo)記與該小類簇每個頂點s∈S關(guān)聯(lián)的相似度最高的頂點所屬的大類簇編號l(s);從而得到小類簇S關(guān)聯(lián)度最高的大類簇編號集合L(S)={l (s),s∈S}。取L(S)中出現(xiàn)頻次最高的大類簇作為S的最終目標(biāo)類簇,將S分配給該類簇。如果n中存在多個頻次最高的大類簇,則選擇與S中所有頂點相似度最高的頂點所屬類簇。
為了測試算法的性能,本文選取7個較大規(guī)模具有代表性的單細(xì)胞測序數(shù)據(jù)集(依次編號Data1~Data7)。這些數(shù)據(jù)集分別從基因表達(dá)綜合數(shù)據(jù)庫(gene expres‐sion omnibus,GEO)和10X Genomics官網(wǎng)(https://www.10xgenomics.com/resources/datasets)免費獲取。Data1為3 005個小鼠大腦皮層(cerebral cortex)細(xì)胞scRNA-seq數(shù)據(jù)集(GEO編號:GSE60361)[22];Data2為10X Genom‐ics的4 340個健康人體外周血單核細(xì)胞(peripheral blood mononuclear cells,PBMCs)數(shù)據(jù)集;Data3、Da‐ta4、Data5分別為三個混合人體HEK293T細(xì)胞和小鼠NIH3T3細(xì)胞的數(shù)據(jù)集(樣本標(biāo)識分別為10k_hgmm_3p、10k_hgmm_3p_nextgem_Chromium_X 和20k_hgmm_5pv2_HT_nextgem_Chromium_X);Data6為24 822個 小鼠前額葉皮層(prefrontal cortex)細(xì)胞數(shù)據(jù)集(GEO編號:GSE124952)[23];Data7為68 579個健康人體外周血單核細(xì)胞(peripheral blood mononuclear cells,PBMCs)數(shù)據(jù)集。實驗所用數(shù)據(jù)集的具體信息見表1。
表1 實驗數(shù)據(jù)集Table 1 Experimental data set
調(diào)整蘭德系數(shù)(adjusted Rand index,ARI)[24]被廣泛用于評估單細(xì)胞數(shù)據(jù)聚類效果[25]。給定n個目標(biāo)(細(xì)胞)的聚類結(jié)果X=( )X1,X2,…,Xr和真實劃分結(jié)果調(diào)整蘭德系數(shù)的定義如公式(7):
其中,nij代表Xi和Yj中均有的目標(biāo)數(shù)目,ai和bj分別表示在Xi和Yj中的細(xì)胞數(shù)目。
在大規(guī)模單細(xì)胞聚類中應(yīng)用最廣泛的是SEURAT4[26],該工具均直接調(diào)用PhenoGraph中的魯汶算法進(jìn)行聚類。SCENA是最新的單細(xì)胞聚類算法,該方法基于多特征選擇的譜聚類算法并聲明在大多數(shù)實驗數(shù)據(jù)上優(yōu)于SEURAT4和SC3等主流工具[9]。本文重點將SCMC與SCENA和SEURAT4,以及另一基于魯汶算法的工具SCANPY進(jìn)行比較。所有比較工具的參數(shù)均采用默認(rèn)參數(shù),其中KNN的參數(shù)K均設(shè)置為相同值。單細(xì)胞數(shù)據(jù)的預(yù)處理(包括對數(shù)標(biāo)準(zhǔn)化和刪除低表達(dá)基因等)均按照各個工具默認(rèn)參數(shù)進(jìn)行。所有程序均在Linux工作站(CPU為Intel Xeon E5-2620/2.10 GHz/8×2 cores,GPU為NVidia GTX1080Ti)上運行。
以前的方法大都根據(jù)細(xì)胞相似性構(gòu)建KNN網(wǎng)絡(luò)或者近似KNN網(wǎng)絡(luò),然后對網(wǎng)絡(luò)圖進(jìn)行聚類。直接用KNN網(wǎng)絡(luò)進(jìn)行聚類效果并不理想,單純KNN網(wǎng)絡(luò)沒有充分考慮細(xì)胞之間的相似度。一對高度相似表達(dá)的細(xì)胞因為數(shù)目K的限制,可能在KNN圖中沒有直接連接,因此通過保留高相似度(相似度>0.95)的連接來擴(kuò)充KNN網(wǎng)絡(luò)。如表2所示,分別在7個單細(xì)胞數(shù)據(jù)集上構(gòu)造單純的KNN網(wǎng)絡(luò)與擴(kuò)充的KNN網(wǎng)絡(luò)并進(jìn)行后續(xù)聚類步驟,發(fā)現(xiàn)對大部分?jǐn)?shù)據(jù)集,在擴(kuò)充KNN網(wǎng)絡(luò)的聚類比在單純KNN網(wǎng)絡(luò)上聚類效果顯著增強(qiáng)。只有Data2數(shù)據(jù)集效果沒有顯著變化,這可能該數(shù)據(jù)集本身容易聚類(ARI=0.974)。而在Data6數(shù)據(jù)集上擴(kuò)充的KNN網(wǎng)絡(luò)比單純的KNN提升效果非常顯著。
表2 KNN網(wǎng)絡(luò)與擴(kuò)充KNN網(wǎng)絡(luò)實驗比較Table 2 Experimental comparison between KNN networks and extended KNN networks
SCMC算法的主要參數(shù)指標(biāo)是KNN中的最近鄰數(shù)K。選取三個不同規(guī)模的數(shù)據(jù)(Data2、Data4和Data6)來驗證不同K值對最終結(jié)果的影響。分別選取K=10、20、30、40,然后進(jìn)行聚類并計算ARI。如圖2所示,在這三個數(shù)據(jù)中SCMC算法的主要參數(shù)指標(biāo)是KNN中的最近鄰數(shù)K。如圖2所示,在這三個數(shù)據(jù)集中,K≥20表現(xiàn)比較平穩(wěn),其中最大的數(shù)據(jù)集Data6,隨著K增大ARI也相應(yīng)也有所增加。但K越大,KNN網(wǎng)絡(luò)的密度就會增大,算法復(fù)雜性就會增高。為此在所有較大規(guī)模數(shù)據(jù)集,為了減少算法復(fù)雜度,建議K設(shè)置為20。
圖2 不同K值對ARI的影響Fig.2 Effect of different K values on ARI
聚類算法前的特征基因選擇也會影響最終的聚類結(jié)果,SCMC算法通過計算基因的變異系數(shù)(coefficient of variation)來選擇高可變的基因作為特征基因。圖3是7個數(shù)據(jù)集基因變異系數(shù)的分布曲線,這些曲線的形態(tài)基本一致;變異系數(shù)越高的基因越可能是特征基因,根據(jù)帕累托法則(Pareto principle),重尾(heavy-tailed)部分大概率是特征顯著的基因。由于帕累托分布(Pareto distribution)屬于重尾連續(xù)概率分布,與圖3的曲線形態(tài)基本一致,為此,SCMC用帕累托分布來擬合基因變異系數(shù)的分布曲線(可以選用fitdistrplus的R包實現(xiàn)),選取面積占比5%的重尾部分的高可變基因作為特征基因,如圖3所示。在算法實際運行中,也可以觀測曲線選擇變化開始趨緩的值作為特征基因選擇的閾值(例如:曲線a點的值v(a)小于下一點a+1值v( a+1)的2倍,v(a)<2v( a+1),則取值a為閾值來選擇特征基因)。
圖3 各數(shù)據(jù)集基因變異系數(shù)分布曲線Fig.3 Distributi on curveDsa tao 5f coefficien of gene variation for 7 datasets
MCL算法是經(jīng)典的圖聚類算法,該算法已經(jīng)被成功應(yīng)用到模體聚類等研究領(lǐng)域。當(dāng)數(shù)據(jù)規(guī)模很大的時候,該算法復(fù)雜性較高( O(n2))以及容易產(chǎn)生大量的離群孤立或者小規(guī)模類簇,因此在單細(xì)胞聚類中,首先對MCL算法進(jìn)行openMP并行設(shè)計來加快算法,另外對MCL算法產(chǎn)生的孤立點和小類簇進(jìn)行再分配,以提升聚類效果。
實驗中將類簇規(guī)模小于3的進(jìn)行再分配。如表3所示,分別比較了改進(jìn)前和改進(jìn)后MCL聚類的ARI結(jié)果。除了Data2、Data3和Data4的ARI沒有明顯變化,算法在其他數(shù)據(jù)上ARI指標(biāo)均有所增加。說明對MCL的改進(jìn)能夠提升聚類的效果。另外,改進(jìn)后的MCL聚類得到的類簇數(shù)與數(shù)據(jù)集提供的細(xì)胞類別數(shù)比較接近。對于Data7,改進(jìn)后MCL的聚類結(jié)果的類簇數(shù)大幅度減少,由此可以看出算法對于大規(guī)模數(shù)據(jù)類簇數(shù)減少明顯,說明MCL本身產(chǎn)生了較多的小類簇。
由于SCMC沒有對細(xì)胞的特征基因進(jìn)行降維,而直接計算細(xì)胞之間的相似度,因此計算細(xì)胞之間相似度并構(gòu)建擴(kuò)充的KNN圖會占用大量的計算時間。為此,SCMC通過CUDA并行化來計算細(xì)胞相似度,通過openMP并行化MCL聚類來加快算法。從Data7中隨機(jī)取樣不同固定數(shù)量的細(xì)胞(從4 000到24 000個細(xì)胞)樣本來分別評估SCMC在CPU+GPU異構(gòu)并行的運行時間。如果單純用30個線程的CPU,4 000個細(xì)胞就耗時十幾個小時。但是如圖4所示,如果采用CPU(30線程)+GPU異構(gòu)計算,對于24 000個細(xì)胞的大規(guī)模數(shù)據(jù)集,SCMC的運行時間僅用時0.87 h。對于4 000個細(xì)胞的數(shù)據(jù)集,SCMC的運行時間則僅需要8 min左右。
0.05表3 MCL改進(jìn)前后聚類結(jié)果比較Table 3 Comparison of clustering results before and after MCL improvement
圖4 SCMC算法不同細(xì)胞數(shù)量的運行時間Fig.4 Running time of SCMC on different numbers of cells
將SCMC與2種最流行的算法SEURAT4和SCANPY,以及最新聚類算法SCENA進(jìn)行性能比較。分別用這4個工具對表1的7個數(shù)據(jù)集進(jìn)行聚類,并計算聚類的ARI指標(biāo)。
如圖5所示,SCMC的 ARI 指標(biāo)在這些工具中始終表現(xiàn)最好,特別是SCMC在所有測試數(shù)據(jù)上的 ARI 均大于0.7,算法具有較好的魯棒性。由于SCMC在大部分實驗數(shù)據(jù)上要比其他三個算法更接近真實類簇(細(xì)胞類型)數(shù)目,因此反映在ARI指標(biāo)上要優(yōu)于其他算法。因為SCANPY和SEURAT4均使用社區(qū)檢測算法,在默認(rèn)聚類粒度參數(shù)下,大都屬于粗粒度聚類,因此得到類簇數(shù)與實際細(xì)胞類型數(shù)相差較大。SCENA采用譜聚類,并用近鄰傳播聚類估計類簇數(shù)。在Data6數(shù)據(jù)集上SCENA預(yù)測的聚類數(shù)是14,更接近真實聚類數(shù)目,由此SCMC與SCENA的ARI指標(biāo)比較接近。但在其他測試數(shù)據(jù)上性能較明顯低于SCMC,說明SCENA的魯棒性較差SCANPY聚類。
作為無監(jiān)督聚類方法,SCMC在聚類中無須在聚類前估計細(xì)胞類簇的數(shù)目。雖然SCMC輸出的類簇數(shù)與數(shù)據(jù)本身提供的類簇數(shù)有所出入,但是較高的ARI指標(biāo)說明SCMC可能是對大類細(xì)胞進(jìn)行了亞群的細(xì)分。例如,SCMC 預(yù)測 Data7 數(shù)據(jù)(pbmc68K)有 13 個細(xì)胞類型,接近其真實的 11 個細(xì)胞亞型。再如圖 6 所示,對Data2數(shù)據(jù)的聚類結(jié)果通過UMAP降維后取前兩維作圖發(fā)現(xiàn),SCMC聚類標(biāo)簽與原始標(biāo)簽吻合度最高,并且發(fā)現(xiàn)右下角存在稀有細(xì)胞類型,但在原始標(biāo)簽中該部分被分到了距離較遠(yuǎn)的細(xì)胞類型中。從圖6(c)、(d)、(e)可以看出另外三個聚類算法可視化的聚類標(biāo)簽比較雜亂。此外,SCMC算法另一優(yōu)點是占用內(nèi)存低。在構(gòu)建擴(kuò)充KNN圖的時候,通過CUDA將每一對細(xì)胞分別輸入到GPU計算單元,計算每對細(xì)胞的相似度后自動釋放內(nèi)存,因此SCMC算法在計算細(xì)胞相似性時候只占用小量GPU存儲,而其他基于矩陣運算的算法(例如SCENA等)基本要一次讀入所有細(xì)胞數(shù)據(jù),占用大量的內(nèi)存。
圖6 UMAP降維后Data2數(shù)據(jù)集的可視化結(jié)果Fig.6 Clustering visualization effects of Data2 after UMAP dimensionality reduction
SCMC算法將擴(kuò)充的KNN網(wǎng)絡(luò)與改進(jìn)的MCL聚類算法進(jìn)行結(jié)合,并且基于CPU+GPU進(jìn)行并行化程序設(shè)計,因此適用于規(guī)模較大的單細(xì)胞RNA測序數(shù)據(jù)的細(xì)胞分類。通過在7個10X單細(xì)胞測序數(shù)據(jù)上實驗比較,算法比其他幾個最流行的算法聚類效果要好,因此該算法比較適用于10X單細(xì)胞數(shù)據(jù)分析。