R語言——使用t-SNE算法在R中實現(xiàn)數(shù)據(jù)降維與可視化

本文首發(fā)于“生信大碗”公眾號,轉(zhuǎn)載請注明出處

上期推文我們介紹了一種線性數(shù)據(jù)降維的方法——主成分分析PCA,今天我們再來介紹一種非線性的算法——t-SNE。

t-SNE(t-distributed Stochastic Neighbor Embedding),中文全稱t分布-隨機鄰近嵌入,其原理比較復雜,這里不多做講解,感興趣的小伙伴可以自行百度。

數(shù)據(jù)降維方法有很多,t-SNE算法的優(yōu)勢在哪里呢?t-SNE算法有效地解決了降維后的擁擠問題,也就是說,經(jīng)t-SNE算法降維后,相似的數(shù)據(jù)相互靠近,而差異較大的數(shù)據(jù)則互相遠離。但有利就有弊,t-SNE算法的缺點是運行所占內(nèi)存大,所需時間長。具體選擇哪種方法小伙伴們可以自行權(quán)衡。

話不多說,接下來我們開始實操。

1.安裝并加載Rtsne包

2.加載示例數(shù)據(jù)

下載TCGA肺腺癌數(shù)據(jù)集并對正常組和腫瘤組進行差異分析,選取差異最顯著的前十個基因的表達數(shù)據(jù)作為示例數(shù)據(jù),注意行是樣本,列是基因

3.獲取樣本的分組信息

4.?進行t-SNE降維

①?t-SNE結(jié)果隨機,進行分析之前需設(shè)置隨機數(shù)種子是結(jié)果具有可重復性

②?Rtsne()函數(shù)各參數(shù)的意義如下:

dims = 2, 正整數(shù),表示降維后的數(shù)據(jù)緯度——將數(shù)據(jù)降到幾維?

pca = TRUE/FALSE,表示在進行t-SNE前是否進行主成分分析PCA。

max_iter = 1000,表示迭代次數(shù),默認為1000。

theta = 0.5,是速度/精度權(quán)衡,范圍在0~1之間,數(shù)值越小越精確,默認0.5。該參數(shù)影響最終結(jié)果,可根據(jù)可視化結(jié)果進行調(diào)整。

perplexity = 20,困惑度:正整數(shù),且需滿足?3*perplexity < nrow(data) - 1?,可以簡單理解為每個數(shù)據(jù)點的近鄰數(shù)據(jù)點的可能數(shù)目,是用于計算數(shù)據(jù)點相似度的參數(shù),是數(shù)據(jù)局部/全局權(quán)衡,影響可視化結(jié)果,參數(shù)越小,樣本越獨立,參數(shù)越大,樣本越趨向于形成一個整體。

check_duplicates = FALSE,檢查是否存在重復項。最好確保在進行t-SNE之前數(shù)據(jù)不存在重復項,并將此選項設(shè)置為FALSE。

③?輸出結(jié)果是一個列表,其中元素Y就是降維結(jié)果??梢钥吹皆瓉?0個基因的表達數(shù)據(jù)(10維數(shù)據(jù)),已經(jīng)降為二維數(shù)據(jù)。

5.?降維結(jié)果可視化

t-SNE算法數(shù)據(jù)降維與可視化完整代碼如下:

# 安裝并加載Rtsne包

install.packages("Rtsne")

library(Rtsne)

# 加載示例數(shù)據(jù)

load("前十個差異基因表達矩陣.rdata")

data[1:6,1:6]

# 樣本分組

sample <- data.frame(id=rownames(data))

?# TCGA樣本命名方式,倒數(shù)二三位數(shù)字是11的為正常組,01的為腫瘤組

sample$group <- ifelse(substr(sample$id,14,15)==11,"normal","tumor")

sample[1:6,]

group <- sample$group

group[1:6]

# t-SNE降維

?#設(shè)置隨機數(shù)種子

set.seed(1)

?#進行t-SNE

tsne_out = Rtsne(

?data,?????????????

? dims =2,?????????

? pca =TRUE,???????

?max_iter = 1000,??

? theta =0.4,??????

?perplexity = 20,??

?check_duplicates = FALSE,

? verbose= F)

str(tsne_out)

# 降維結(jié)果可視化

library(ggplot2)

tsne_result = as.data.frame(tsne_out$Y)

colnames(tsne_result) =c("tSNE1","tSNE2")

ggplot(tsne_result,aes(tSNE1,tSNE2,color=group))+

?geom_point()

本文首發(fā)于“生信大碗”公眾號,轉(zhuǎn)載請注明出處

—END—

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

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

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