StatQuest學習筆記17——聚類

前言

這篇筆記是StatQuest系列教程的第47,48,49節(jié)。第47節(jié)與第48節(jié)有很在一部分內(nèi)容是重復的,主要講的是層次聚類,第49節(jié)講提K-means聚類。

熱圖簡單案例

平時在讀一個測序文章時,我們可能會經(jīng)??吹綗釄D,就像現(xiàn)在的這種圖:

image

現(xiàn)在我們來解釋一下這張圖:

  1. 這是一張熱圖(heatmap),為什么要叫熱圖呢,因為它用不同的顏色來表示數(shù)值的大小,通常來說,用暖色(紅色)表示數(shù)值大,冷色(藍色)表示數(shù)值小。
  2. 這個熱圖的行(row)是基因名(可能太小看不清楚),列是RNA-seq的樣本名。
  3. 當原始數(shù)據(jù)通過熱圖來展現(xiàn)時,數(shù)據(jù)經(jīng)過了兩種修飾來展示出來。第一種修飾就是相對豐度(relative abundances),以這種方式展示的數(shù)據(jù),它研究的是一個基因在不同樣本中的相對表達情況,這種展示方式,需要對同一行(也就是相同的基因在不同樣本中的表達水平)的數(shù)據(jù)進行縮放(scaled),也就是Z轉(zhuǎn)換。從下面的圖中,我們就可以看到,樣本1的某基因表達量明顯高于其它樣本(因為樣本1的顏色最紅,根據(jù)圖例,它的表達值就最高),如下所示:
image

為了方便理解,我隨手用Excel做了一下簡陋的熱圖,如下所示:

image

可以看出,基因4在樣本1中的表達量很高。不過按照第一種展示數(shù)據(jù)的方式,無法比較不同基因的表達水平差異,例如,在上圖的黑色方框中,基因4顯紅色,這只能表達,樣本1中基因4的表達水平比其它的樣本高,不能說明樣本1中的其它基因(例如基因3)的水平也比其它樣本高,這種數(shù)據(jù)的展示方式只用于研究同一個基因在不同的樣本中的表達水平差異。

第二處修飾后的展示方式就是根據(jù)這些基因表達的相似性,把它們放到一塊,如下所示:

image

再看下面的圖形:

image

從上到下,我們可以看到這些基因的表達的模式。

在第一個紫紅色的方框中,我們可以看到,這些基因在第2個樣本中表達水平最高,而在第4個樣本中表達水平最低。

在第二個黑色的方框中,我們可以看到,這些基因在第1個樣本中表達水平最高,而在第4個樣本中表達水平最低。

在第三個橙色方框中中,我們可以看到,這些基因在第2個樣本中的表達水平最高,而在第3個棲中的表達水平最低。

根據(jù)不同基因表達模式的相似性進行的“聚類”(clustering)并不是偶然的,而是通過一定的算法實現(xiàn)的,這些算法會將那些表達模式類似的基因放到一塊,如下所示:

image

如果不進行聚類(clustering),那么用熱圖展示出來就是下圖右邊的那個樣子,如下所示:

image

如果熱圖中既不進行聚類(clustering),也不進行縮放(scaling),那么熱圖就變成了如下的這個樣子:

image

從圖上我們可以看到,紅色部分的這個基因表達水平最高(比其他的基因表達高太多了),可以把它視為一個異常值。

熱圖復雜案例

現(xiàn)在我們再看一下比較復雜的熱圖案例,如下所示:

image

從這個圖的標題上我們可以看出,這個貌似是一個結腸的單細胞測序數(shù)據(jù)的熱圖。這個熱圖的數(shù)據(jù)經(jīng)過了縮放(scaled)與聚類(clustered),它的縮放是全局的,因此,這一組數(shù)據(jù)中并沒有異常值,這里的縮放要與前面熱圖的縮放區(qū)分開來,前面的前面是按照某個基因進行縮放的,也就是把同一行的數(shù)據(jù)當成整體,進行了縮放(也就是z轉(zhuǎn)換),而這個數(shù)據(jù)是把所有的數(shù)據(jù)當作整體,進行縮放。

再看聚類。這個熱圖的聚類是按照列(column,也就是樣本)和行(row,也就是基因)同時進行的聚類,如下所示:

image

在上圖中,我們可以看到,縱矩形的部分表示基因表達模式相似的樣本聚在了一起,橫矩形表示的是,表達模式相似的基因聚集在了一起。它們的交集表示,這些樣本的基因表達模式相似,以及有哪些基因相似。

如果不進行聚類,也不進行數(shù)據(jù)縮放(scaling),那么下圖的右上表示的就是不聚類的熱圖,右下表示的就是即不進行聚類,又不進行縮放的熱圖,如下所示:

image

此時我們再回到前面的那個簡單熱圖案例中來,我們試想一個問題,在那張熱圖中,如果我們對所有的基因進行整體的縮放(global scaling),而非單個基因的縮放,那么這個熱圖會怎么樣,我們看下圖:

image

經(jīng)過全局縮放(global scaling)后,得到下面的圖形,如下所示:

image

此時,我們會發(fā)現(xiàn),這些聚類的結果就會發(fā)生了改變,并且新生成的圖形中出面了異常高的熱圖,它是異常值,這個異常值會導致熱圖整體上出來嚴重的偏離,并且不容易觀察基因的變化,如下所示:

image

因此,我們從上面的結果可以知道,縮放(scaling)會影響兩個結果,第一,不同表達水平基因的顏色,這會影響你比較不同樣本中的相同基因的表達水平,第二,影響聚類(clustering),如下所示:

image

如何對數(shù)據(jù)進行縮放(scale)

此時,我們再回到數(shù)據(jù)的縮放這個話題上,無論你對相同基因在不同樣本中進行縮放,還是對全局的基因進行縮放,最常用的方法就是Z值縮放法(Z-Score Scaling),如下所示:

image

接著,我們具體看一下這種方法是如何實現(xiàn)數(shù)據(jù)的縮放的。在下圖中,我們看到一個數(shù)軸上分布了幾個樣本的reads數(shù),如下所示:

image

第一步:計算其均值(均值為16.5),如下所示:

image

第二步:每個樣本的數(shù)值減去均值,此時,如果這個數(shù)值大,就表示此樣本的某基因轉(zhuǎn)錄水平高;如果數(shù)值小,就表示此樣本的某基因轉(zhuǎn)錄水平低,如下所示:

image

第三步:計算標準差(標準差為6.28);

第四步:將第2步中的數(shù)值除以標準差,如下所示:

image

經(jīng)過上述的處理后,無論原始數(shù)據(jù)的變異程度如何,這些數(shù)據(jù)的范圍最終會縮小,之所以這樣處理,就是因為如果原始數(shù)據(jù)之間差異過大,那么不同基因表達水平就會變化程度(more subtle)更高的色度(shade)來表示,經(jīng)過這樣的處理,用較小程度的色度(shade)就能表示出基因水平的差異,方便觀察,如下所示:

image

此時,我們可能會遇到這樣的一種情況,例如,如果數(shù)據(jù)中出現(xiàn)異常值時,數(shù)據(jù)會怎么樣,就像下面的這個樣子:

image

此時如果進行Z轉(zhuǎn)換的話,標準差會很大,也就是Z值的分子會很大,最終得到的值會有一部分集中在0附近,只能用很少的色度來進行區(qū)分,如下所示:

image

例如,我們?nèi)绻捎萌挚s放來處理原始數(shù)據(jù)中,在第一個案例中,我們就會得到下面這樣的圖形,其中有一個基因明顯表達水平非常高,使得其它的基因差異很難看出來,如下所示:

image

如何聚類

原始數(shù)據(jù)經(jīng)過縮放后(scaling),此時就可以進行聚類了,聚類有2種方法,分別是層次聚類(hierarchical clustering)和K-均值(K-means)聚類,我們先講層次聚類(hierarchical clustering),如下所示:

image

層次聚類(hierarchical clustering)

先看一個簡單的案例,在這個案例中,有3個樣本,每個樣本4個基因,如下所示:

image

這種聚類方法的思路是這樣的:

第一步,計算出哪些基因與基因1最為接近,基因2明顯與基因1表達模式不同,基因3與基因1的表達形式比較類似,基因4與基因1的表達模式也比較類似,但是,在這幾個基因中,與基因1表達模式最接近的還是基因3,如下所示:

image

第二步,計算出哪些基因的表達模式與基因2最為接近(然后是基因3,基因4),經(jīng)計算發(fā)現(xiàn),基因4與基因2的表達模式最相似,如下所示:

image

第三步,我們在前面找到基因1和基因3的表達模式相似,基因2和基因4的表達模式相似,但是,基因1和基因3的相似程度要比基因2和基因4的相似程度高,我們把前面的組合(基因1和基因3)放到一個簇(cluster)中,如下所示:

image

第四步:此時再回到第一步,把基因1和基因3構成的簇(Cluster # 1)當作一個基因,然后再按照第二步,第三步來計算,經(jīng)計算,此時,基因2和基因4最相似,把它們再放到一個簇中(Cluster #2),如下所示:

image

通常情況下,層次聚類(Hierarchical Clustering)通常會用一個樹形圖(dendrogram)連接起來,用于表明聚類成員之間的相似性和聚類次序,如下所示:

image

在右側的樹形中,我們可以發(fā)現(xiàn),Cluster #1是最先形成的聚類,它們的相似性最高,如下所示:

image

Cluster #2是第二個形成的聚類,它們的相似性次高,如下所示:

image

而第三個聚類Cluster #3則包含了所有的基因,它是最后形成的,如下所示:

image

層次聚類的原理

前面我們提到過,層次聚類的第一步就是計算兩組基因的相似性,此時我們詳細介紹一下如何進行計算。

在計算相似性方面并沒有一個統(tǒng)計的標準,但有一些常用的手段。第一種計算相似性的方法就是歐氏距離(Euclidian distance),如下所示:

image

為了簡單地說明歐氏距離(Euclidian distance),我們以最簡單的例子來說明,在這個例子中,有2個樣本,每個樣本有2個基因,然后兩個樣本的相同基因的差值的平方相加,并開平方,得到的數(shù)值就是歐氏距離,如下所示:

image

除了歐氏距離可以計算相似性外,還可以使用曼哈頓距離(Manhattan distance)和坎貝拉距離(Canberra distance)來計算相似性,其中曼哈頓距離只是不同樣本之間相同基因差值的絕對值之和,如下所示:

image

我們看一下用不同的方法計算相似性的區(qū)別,下圖的左側圖使用的歐氏距離(Euclidian distance)來得到的熱圖,右圖使用的是曼哈頓距離(Manhattan distance)得到的熱圖,如下所示:

image

從圖上來看,使用這兩種不同的相似性計算方法得到的熱圖略有差異,具體要使用哪種方法來計算相似性,并沒有一個統(tǒng)計的標準,它們也沒有什么生物學意義。

此時,我們再回到原來的案例中來,在前面部分中我們提到,基因1和基因3的相似程度最高,把它們都放到一個簇(Cluster #1)中,此時,我們?nèi)绾斡嬎鉉luster #1和基因2,基因4的相似性呢?有幾種方法。

其中最簡單的一種方法就是求出Cluster #1中的兩個基因的平均值,然后進行計算。但還有其它的方法,這些方法同樣會影響聚類,如下所示:

image

為了簡單地說明簇(Cluster #1)與其它基因相似性計算的問題,我們假設有一批數(shù)據(jù),分布在X-Y軸上,此時,我們已經(jīng)生成了2個簇,如下所示:

image

此時,我們僅需要計算最后一個點屬于哪個簇,如下所示:

image

此時我們可以采用以下這些方法進行計算:

第一,計算這個點與兩個簇平均值的距離(centroid),如下所示:

image

第二,計算這個點到兩個簇最近的點的距離(single-linkage),如下所示:

image

第三,計算這個點到兩個簇中最遠的點的距離(complete-linkage),如下所示:

image

我們用前面的單細胞測序的熱圖來說明一下這三種方法,從左到右分別是:某點到某簇最遠點的距離(在R中默認的就是這個選項),某點到某簇均值的距離,某點到某簇最近的點的距離,如下所示:

image

K-means聚類

什么是K-means

先看一個場景,例如我們手中有這樣的一批數(shù)據(jù),把它們繪制到一個數(shù)軸上,此時你的目的就是把它們分成3個簇(cluster),這三個數(shù)據(jù)或許是來源于三種不同的細胞或都是三種不同的腫瘤,如下所示:

image

我們僅從肉眼觀察,就知道這一批數(shù)據(jù)明顯可以分成3個簇,但是,如果我們不用肉眼來觀察,用計算機來計算,如何得到這3個簇呢?此時就需要用到一種算法,即K-means聚類,如下所示:

image

K-means的基本思想

此時,我們先了解一下K-means聚類的基本思想。

第一步:選擇你要聚類的個數(shù),K-means聚類中的這個K就是你要聚類的數(shù)目的意思,此時,你們選擇K=3,這也就是說,我們想把這些數(shù)據(jù)取成3個簇(cluster),對這個K值如何選擇,我們后文會提到,如下所示:

image

第二步,隨機選擇3個不同的數(shù)據(jù)點當成3個簇,如下所示:

image

第三步:計算第1個點到這三個簇的距離,先計算第1個點到藍簇的距離,如下所示:

image

接著,計算第1個點到綠簇的距離,如下所示:

image

最后,計算第1個點到橘黃簇的距離,如下所示:

image

第四步:將第1個點歸于離它最近的簇,在這個案例中,第1個點就屬于藍簇,如下所示:

image

接著,重復前面的步驟,只是這次計算的第2個點,第2個點最終的計算結果它屬于綠簇,如下所示:

image

再計算第3個點,它屬于橘黃簇,如下所示:

image

經(jīng)過最終計算,第3個點到最后的點都屬于橘黃簇,如下所示:

image

此時,所有的點都進行了聚類,如下所示:

image

第五步:計算每個簇的均值,如下所示:

image

此時,我們還按照前面的方法,計算每個點到這三個簇的均值的距離,如下所示:

image

最終計算結果如下所示:

image

經(jīng)過最終的計算,我們發(fā)現(xiàn),這些聚類結果并沒有發(fā)生改變,如下所示:

image

也就是說,K-means的聚類結果似乎比我們?nèi)庋圻M行的聚類的結果還要差,如下所示:

image

此時,我們需要對聚類的結果進行評估,其方法就是計算每個簇的變異,如下所示:

image

由于K-means的聚類過程并不能“看”到最佳的聚類,只能追蹤這些簇與這些簇的總變異,然后通過不斷更改起始的數(shù)據(jù)點進行迭代。

此時我們回到起點,再將隨機選擇3個初始數(shù)據(jù)點作為初始的簇,按照前面同樣的自救,計算剩余的點到這三個簇的距離,計算每個簇的均值,然后基于新的均值進行聚類,直接這些簇不再改變?yōu)橹?,如下所示?/p>

image

計算的結果如下所示,此時這些數(shù)據(jù)已經(jīng)進行了聚類,再計算這三個簇的變異,如下所示:

image

這一輪迭代結束,然后再來一輪,如下所示:

image

我們把這三次的聚類結果放一塊兒,我們可以發(fā)現(xiàn),第二次的聚類結果最好,如下所示:

image

但是我們并不清楚這個結果是不是所有可能的聚類結果中最好的(總變異最?。虼宋覀冃枰M行更多次的聚類,然后才能下結論。

此時我們提出一個問題,K值應該如何選?在這個案例中,明顯可以知道K值為3,但是,有的時候,這個K值并不像本案例中這么明顯,如下所示:

image

其中一種確定K值的方法就是不斷地使用不同的K值,如下所示:

image

我們先使用K=1這個數(shù)值,通過計算總的變異程度,明顯這個結果不行,如下所示:

image

再使用K=2,此時我們計算一下總變異,這個結果比K=1的時候要好一些,如下所示:

image

接著,我們使用K=3,通過計算它的總變異,我們發(fā)現(xiàn)K=3的結果要比K=2更好,因為它的總變異更低,如下所示:

image

再繼續(xù),使K=4,我們發(fā)現(xiàn),K=4的總變異比K=3的總變異還要小,如下所示:

image

從前面的這些計算結果來看,我們能總結出一個規(guī)律,每當我們添加一個新的簇時,總變異就會降低,當簇的數(shù)目等于總的數(shù)據(jù)點的數(shù)目時,總變異就是0,如下所示:

image

如果我們把K值與變異降低的程度繪制成曲線,那么就能得到下面的這條曲線:

image

從這個曲線上我們可以看到,當K=3時,它之后的K值每增加1,總變異的降低幅度就沒有前面的快,我們把K=3這個點稱為拐點(elbow plot)。

K-mean聚類與層次聚類的區(qū)別

此時,我們再提出一個問題:K-mean聚類與層次聚類有什么區(qū)別?

K-means聚類會把數(shù)據(jù)聚成你所期望的簇的數(shù)目,而層次聚類則中介告訴你,哪兩個數(shù)據(jù)是最相似的,如下所示:

image

二維坐標的K-means

如果我們的數(shù)據(jù)無法繪制到一條數(shù)軸上時,如何進行K-means聚類呢,如下所示:

image

這種情況下,它的聚類原理跟一維數(shù)軸的原理一樣,第一步就是隨機找到三個點(前提是你想聚成3個簇),如下所示:

image

然后,計算不同的點到這三個簇的歐氏距離(Euclidean distance),在二維坐標中,計算這個歐氏距離就是采用勾股定理,如下所示:

image

接著,就像前面講的那樣,距離最近的就屬于某個簇,如下所示:

image

第一次的聚類結果如下所示:

image

再接著,我們會像前面是找到的那樣,計算出每個族的中心點(也就是均值),然后再聚類,如下所示:

image

最后,得到比較滿意的聚類圖,如下所示:

image

熱圖的K-means

如果我們的數(shù)據(jù)是熱圖,那么如何進行K-means聚類呢?

為了方便描述,我們就以下面的案例說明一下,兩個樣本(sample 1和sample 2),分別有4個基因,現(xiàn)在把這兩個樣本分別命令為X,Y,把它們的基因放到二維坐標軸上,如下所示:

image

然后像前面那樣進行聚類,如下所示:

image

事實上,在實際的計算過程中,我們并不需要把數(shù)據(jù)投射到二維坐標上,只用計算不同樣本之間的距離即可,例如歐氏距離,如下所示:

image

R的kmeans()函數(shù)備注

在R中,進行K-menas聚類的函數(shù)是kmeans(),它有一些注意事項。

  1. 此函數(shù)會對每個距離加上權重,因此那些大簇(large clusters)的權重要略高于小簇(small clusters)的權重。
  2. 默認情況下,此函數(shù)只有一組原始的簇,如果你要使用多個不同的起始數(shù)據(jù)點,那么你需要設定參數(shù)nclust=25或者是25左右的數(shù)字,例如(kmans(data, k=3, nclust=25))。

如下所示:

image
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 參考學習資源:1.生信技能樹線下培訓班視頻StatQuest系列2.配合云天明讀研學習筆記系列記錄補充一些不熟悉的...
    程涼皮兒閱讀 1,171評論 0 5
  • 聚類算法 前面介紹的集中算法都是屬于有監(jiān)督機器學習方法,這章和前面不同,介紹無監(jiān)督學習算法,也就是聚類算法。在無監(jiān)...
    飄涯閱讀 41,762評論 3 51
  • title: DALS022-機器學習01-聚類與熱圖date: 2019-08-22 12:0:00type: ...
    backup備份閱讀 1,435評論 1 0
  • 寫下這二天的一些小感觸吧!昨天做了自己愛吃的菜,嗯,就是花菜,天知道我為什么這么愛花菜,炒肉也好,素炒也罷,火鍋更...
    晨寶要瘦瘦瘦閱讀 146評論 0 1
  • pytorch官網(wǎng)地址 系統(tǒng)配置 win10(1809) python3.6 pytorch版本 stable 1...
    whupenger閱讀 382評論 0 0

友情鏈接更多精彩內(nèi)容