PCA是線性降維,它不能解釋特征之間的復(fù)雜多項(xiàng)式關(guān)系。 因此還有一些非線形降維算法,例如:T-SNE、UMAP、SOM、LLE等等。
t-SNE本質(zhì)上來說就是要找到一個投影方法,使得降維后,數(shù)據(jù)之間的分團(tuán)信息得以保存。
首先,它將通過選擇一個隨機(jī)數(shù)據(jù)點(diǎn)并計算與其他數(shù)據(jù)點(diǎn)(|x—x|)的歐幾里得距離來創(chuàng)建概率分布。 從所選數(shù)據(jù)點(diǎn)附近的數(shù)據(jù)點(diǎn)將獲得更多的相似度值,而距離與所選數(shù)據(jù)點(diǎn)較遠(yuǎn)的數(shù)據(jù)點(diǎn)將獲得較少的相似度值。 使用相似度值,它將為每個數(shù)據(jù)點(diǎn)創(chuàng)建相似度矩陣(S1)
其次,它將根據(jù)正態(tài)分布將計算出的相似距離轉(zhuǎn)換為聯(lián)合概率。
通過以上的計算,t-SNE將所有數(shù)據(jù)點(diǎn)隨機(jī)排列在所需的較低維度上。
然后,t-SNE將再次對高維數(shù)據(jù)點(diǎn)和隨機(jī)排列的低維數(shù)據(jù)點(diǎn)進(jìn)行所有相同的計算。但是在這一步中,它根據(jù)t分布分配概率。這就是名稱t-SNE的原因。t-SNE中使用t分布的目的是減少擁擠問題
最后,對于較低維的數(shù)據(jù)點(diǎn),還將創(chuàng)建一個相似度矩陣(S2)。然后該算法將S1與S2進(jìn)行比較,并通過處理一些復(fù)雜的數(shù)學(xué)運(yùn)算來使S1與S2之間有所不同。包括使用兩個分布之間的Kullback Leibler散度(KL散度)作為損失函數(shù)運(yùn)行梯度下降算法。使用KL散度通過將兩個分布之間相對于數(shù)據(jù)點(diǎn)位置的值最小化,幫助t-SNE保留數(shù)據(jù)的局部結(jié)構(gòu)。
算法步驟:
第一步:計算數(shù)據(jù)集中每行與其他行的距離(默認(rèn)為歐氏距離),轉(zhuǎn)為概率。

第二步:對每一行重復(fù)操作,得到概率矩陣。

第三步:沿兩條新軸用學(xué)生氏分布(t分布)對數(shù)據(jù)隨機(jī)化。

第四步:逐漸迭代,通過最小化KL divergence,使得二維空間的新概率矩陣盡可能接近原高維空間的。

基于R的t-SNE實(shí)現(xiàn)
例:對USArrests數(shù)據(jù),使用t-SNE降維
#加載包
library(Rtsne)
#由于四個變量的量綱不統(tǒng)一,不方便進(jìn)行運(yùn)算,先進(jìn)行標(biāo)準(zhǔn)化處理
USArrests_scale <- as_tibble(scale(USArrests, scale=TRUE))
#將標(biāo)準(zhǔn)化后的數(shù)據(jù)使用t-SNE算法進(jìn)行降維
noteTsne <- Rtsne(USArrests_scale, perplexity = 7, theta = 0, max_iter = 1000, eta = 300, verbose = T)
參數(shù)說明:
- dims:參數(shù)設(shè)置降維之后的維度,默認(rèn)值為2;
- perplexity(困惑度):控制距離轉(zhuǎn)化為概率的分布。越小越關(guān)注局部結(jié)構(gòu),越大越關(guān)注全局結(jié)構(gòu)。簡單來說,就是最后分簇后,每個簇包含的數(shù)據(jù)數(shù)量。越小分的簇越多,越大分的簇越少。參數(shù)的取值必須小于(nrow(data) - 1 )/ 3;
- theta:參數(shù)取值越大,結(jié)果的準(zhǔn)確度越低,但計算速度會提高,反之,越小越精確,計算速度越慢。默認(rèn)值為0.5;
- max_iter:參數(shù)設(shè)置最大迭代次數(shù),默認(rèn)1000


可視化數(shù)據(jù),觀察降維后的效果:
#先將四個變量放到同一列,這樣便于畫圖和比較
USArrestsTSNE <- USArrests_scale %>%
mutate(tSNE1 = noteTsne$Y[,1], tSNE2 = noteTsne$Y[,2]) %>%
pivot_longer(1:4, names_to ="Variable", values_to = "Value")
#畫圖
ggplot(USArrestsTSNE, aes(tSNE1, tSNE2,col=Value)) +
facet_wrap(~ Variable) +
geom_point(size = 1) +
scale_color_gradient(low = "dark blue", high = "cyan") +
theme_bw()

t-SNE的特點(diǎn):
優(yōu)點(diǎn):
- 相較于正態(tài)分布,使用t分布能更好地分散可能的數(shù)據(jù)簇,更易識別;
- 分類效果往往勝過PCA。
缺點(diǎn):
- t-SNE在低維容易保持局部結(jié)構(gòu),不易保留全局結(jié)構(gòu)。
- 計算費(fèi)時,計算時間隨簇數(shù)顯著增加。
- 無法像PCA一樣投影新數(shù)據(jù)。
- 簇間距離意義不大。
【參考文獻(xiàn)】: