如何理解可視化利器t?
T 分布隨機(jī)近鄰嵌入(T-Distribution Stochastic Neighbour Embedding)是一種用于降維的機(jī)器學(xué)習(xí)方法,它能幫我們識(shí)別相關(guān)連的模式。t-SNE 主要的優(yōu)勢(shì)就是保持局部結(jié)構(gòu)的能力。這意味著高維數(shù)據(jù)空間中距離相近的點(diǎn)投影到低維中仍然相近。t-SNE 同樣能生成漂亮的可視化。
當(dāng)構(gòu)建一個(gè)預(yù)測(cè)模型時(shí),第一步一般都需要理解數(shù)據(jù)。雖然搜索原始數(shù)據(jù)并計(jì)算一些基本的統(tǒng)計(jì)學(xué)數(shù)字特征有助于理解,但沒有什么是可以和圖表可視化展示更直觀的。然而將高維數(shù)據(jù)擬合到一張簡(jiǎn)單的圖表(降維)通常是非常困難的,這就正是 t-SNE 發(fā)揮作用的地方。
在本文中,我們將探討 t-SNE 的原理,以及 t-SNE 將如何有助于我們可視化數(shù)據(jù)。
t-SNE 算法概念
這篇文章主要是介紹如何使用 t-SNE 進(jìn)行可視化。雖然我們可以跳過這一章節(jié)而生成出漂亮的可視化,但我們還是需要討論 t-SNE 算法的基本原理。
t-SNE 算法對(duì)每個(gè)數(shù)據(jù)點(diǎn)近鄰的分布進(jìn)行建模,其中近鄰是指相互靠近數(shù)據(jù)點(diǎn)的集合。在原始高維空間中,我們將高維空間建模為高斯分布,而在二維輸出空間中,我們可以將其建模為 t 分布。該過程的目標(biāo)是找到將高維空間映射到二維空間的變換,并且最小化所有點(diǎn)在這兩個(gè)分布之間的差距。與高斯分布相比 t 分布有較長(zhǎng)的尾部,這有助于數(shù)據(jù)點(diǎn)在二維空間中更均勻地分布。
控制擬合的主要參數(shù)為困惑度(Perplexity)。困惑度大致等價(jià)于在匹配每個(gè)點(diǎn)的原始和擬合分布時(shí)考慮的最近鄰數(shù),較低的困惑度意味著我們?cè)谄ヅ湓植疾M合每一個(gè)數(shù)據(jù)點(diǎn)到目標(biāo)分布時(shí)只考慮最近的幾個(gè)最近鄰,而較高的困惑度意味著擁有較大的「全局觀」。
因?yàn)榉植际腔诰嚯x的,所以所有的數(shù)據(jù)必須是數(shù)值型。我們應(yīng)該將類別變量通過二值編碼或相似的方法轉(zhuǎn)化為數(shù)值型變量,并且歸一化數(shù)據(jù)也是也十分有效,因?yàn)闅w一化數(shù)據(jù)后就不會(huì)出現(xiàn)變量的取值范圍相差過大。
T 分布隨機(jī)近鄰嵌入算法(t-SNE)
http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf
Jake Hoare 的博客并沒有詳細(xì)解釋 t-SNE 的具體原理和推導(dǎo)過程,因此下面我們將基于 Geoffrey Hinton 在 2008 年提出的論文詳細(xì)介紹 t-SNE 算法。如果讀者對(duì)這一章節(jié)不感興趣,也可以直接閱讀下一章節(jié) Jake Hoare 在實(shí)踐中使用 t-SNE 進(jìn)行數(shù)據(jù)可視化。
https://nlml.github.io/in-raw-numpy/in-raw-numpy-t-sne/
因?yàn)?t_SNE 是基于隨機(jī)近鄰嵌入而實(shí)現(xiàn)的,所以首先我們需要理解隨機(jī)近鄰嵌入算法。
隨機(jī)近鄰嵌入(SNE)
假設(shè)我們有數(shù)據(jù)集 X,它共有 N 個(gè)數(shù)據(jù)點(diǎn)。每一個(gè)數(shù)據(jù)點(diǎn) x_i 的維度為 D,我們希望降低為 d 維。在一般用于可視化的條件下,d 的取值為 2,即在平面上表示出所有數(shù)據(jù)。
SNE 通過將數(shù)據(jù)點(diǎn)間的歐幾里德距離轉(zhuǎn)化為條件概率而表征相似性(下文用 p_j|i 表示):
如果以數(shù)據(jù)點(diǎn)在 x_i 為中心的高斯分布所占的概率密度為標(biāo)準(zhǔn)選擇近鄰,那么 p_j|i 就代表 x_i 將選擇 x_j 作為它的近鄰。對(duì)于相近的數(shù)據(jù)點(diǎn),條件概率 p_j|i 是相對(duì)較高的,然而對(duì)于分離的數(shù)據(jù)點(diǎn),p_j|i 幾乎是無窮小量(若高斯分布的方差σ_i 選擇合理)。
其中σ_i 是以數(shù)據(jù)點(diǎn) x_i 為均值的高斯分布標(biāo)準(zhǔn)差,決定σ_i 值的方法將在本章后一部分討論。因?yàn)槲覀冎粚?duì)成對(duì)相似性的建模感興趣,所以可以令 p_i|i 的值為零。
現(xiàn)在引入矩陣 Y,Y 是 N*2 階矩陣,即輸入矩陣 X 的 2 維表征。基于矩陣 Y,我們可以構(gòu)建一個(gè)分布 q,其形式與 p 類似。
對(duì)于高維數(shù)據(jù)點(diǎn) x_i 和 x_j 在低維空間中的映射點(diǎn) y_i 和 y_j,計(jì)算一個(gè)相似的條件概率 q_j|i 是可以實(shí)現(xiàn)的。我們將計(jì)算條件概率 q_i|j 中用到的高斯分布的方差設(shè)置為 1/2。因此我們可以對(duì)映射的低維數(shù)據(jù)點(diǎn) y_j 和 y_i 之間的相似度進(jìn)行建模:
我們的總體目標(biāo)是選擇 Y 中的一個(gè)數(shù)據(jù)點(diǎn),然后其令條件概率分布 q 近似于 p。這一步可以通過最小化兩個(gè)分布之間的 KL 散度(損失函數(shù))而實(shí)現(xiàn),這一過程可以定義為:
因?yàn)槲覀兿M茏钚』摀p失函數(shù),所以我們可以使用梯度下降進(jìn)行迭代更新,我們可能對(duì)如何迭代感興趣,但我們會(huì)在后文討論與實(shí)現(xiàn)。
使用 NumPy 構(gòu)建歐幾里德距離矩陣
計(jì)算 p_i|j 和 q_i|j 的公式都存在負(fù)的歐幾里德距離平方,即-||x_i - x_j||^2,下面可以使用代碼實(shí)現(xiàn)這一部分:
為了更高的計(jì)算效率,該函數(shù)使用矩陣運(yùn)算的方式定義,該函數(shù)將返回一個(gè) N 階方陣,其中第 i 行第 j 列個(gè)元素為輸入點(diǎn) x_i 和 x_j 之間的負(fù)歐幾里德距離平方。
使用過神經(jīng)網(wǎng)絡(luò)的讀者可能熟悉 exp(?)/∑exp(?) 這樣的表達(dá)形式,它是一種 softmax 函數(shù),所以我們定義一個(gè) softmax 函數(shù):
注意我們需要考慮 p_i|i=0 這個(gè)條件,所以我們可以替換指數(shù)負(fù)距離矩陣的對(duì)角元素為 0,即使用 np.fill_diagonal(e_x, 0.) 方法將 e_x 的對(duì)角線填充為 0。
將這兩個(gè)函數(shù)放在一起后,我們能構(gòu)建一個(gè)函數(shù)給出矩陣 P,且元素 P(i,j) 為上式定義的 p_i|j:
感到困惑?
在上面的代碼段中,Sigmas 參數(shù)必須是長(zhǎng)度為 N 的向量,且包含了每一個(gè)σ_i 的值,那么我們?nèi)绾稳〉眠@些σ_i 呢?這就是困惑度(perplexity)在 SNE 中的作用。條件概率矩陣 P 任意行的困惑度可以定義為:
其中 H(P_i) 為 P_i 的香農(nóng)熵,即表達(dá)式如下:
在 SNE 和 t-SNE 中,困惑度是我們?cè)O(shè)置的參數(shù)(通常為 5 到 50 間)。我們可以為矩陣 P 的每行設(shè)置一個(gè)σ_i,而該行的困惑度就等于我們?cè)O(shè)置的這個(gè)參數(shù)。直觀來說,如果概率分布的熵較大,那么其分布的形狀就像對(duì)平坦,該分布中每個(gè)元素的概率就更相近一些。
困惑度隨著熵增而變大,因此如果我們希望有更高的困惑度,那么所有的 p_j|i(對(duì)于給定的 i)就會(huì)彼此更相近一些。換而言之,如果我們希望概率分布 P_i 更加平坦,那么我們就可以增大σ_i。我們配置的σ_i 越大,概率分布中所有元素的出現(xiàn)概率就越接近于 1/N。
所以如果我們希望有更高的困惑度,將σ_i 增大將使條件概率分布變得更加平坦。實(shí)際上這增加了每個(gè)點(diǎn)的近鄰數(shù),這就是為什么我們常將困惑度參數(shù)大致等同于所需要的近鄰數(shù)量。
搜索σ_i
為了確保矩陣 P 每一行的困惑度 Perp(P_i) 就等于我們所希望的值,我們可以簡(jiǎn)單簡(jiǎn)單地執(zhí)行一個(gè)二元搜索以確定σ_i 能得到我們所希望的困惑度。這一搜索十分簡(jiǎn)單,因?yàn)槔Щ蠖?Perp(P_i) 是隨σ_i 增加而遞增的函數(shù),下面是基本的二元搜索函數(shù):
為了找到期望的σ_i,我們需要將 eval_fn 傳遞到 binary_search 函數(shù),并且將σ_i 作為它的參數(shù)而返回 P_i 的困惑度。
以下的 find_optimal_sigmas 函數(shù)確實(shí)是這樣做的以搜索所有的σ_i,該函數(shù)需要采用負(fù)歐幾里德距離矩陣和目標(biāo)困惑度作為輸入。距離矩陣的每一行對(duì)所有可能的σ_i 都會(huì)執(zhí)行一個(gè)二元搜索以找到能產(chǎn)生目標(biāo)困惑度的最優(yōu)σ。該函數(shù)最后將返回包含所有最優(yōu)σ_i 的 NumPy 向量。
對(duì)稱 SNE
現(xiàn)在估計(jì) SNE 的所有條件都已經(jīng)聲明了,我們能通過降低成本 C 對(duì) Y 的梯度而收斂到一個(gè)良好的二維表征 Y。因?yàn)?SNE 的梯度實(shí)現(xiàn)起來比較難,所以我們可以使用對(duì)稱 SNE,對(duì)稱 SNE 是 t-SNE 論文中一種替代方法。
在對(duì)稱 SNE 中,我們最小化 p_ij 和 q_ij 的聯(lián)合概率分布與 p_i|j 和 q_i|j 的條件概率之間的 KL 散度,我們定義的聯(lián)合概率分布 q_ij 為:
該表達(dá)式就如同我們前面定義的 softmax 函數(shù),只不過分母中的求和是對(duì)整個(gè)矩陣進(jìn)行的,而不是當(dāng)前的行。為了避免涉及到 x 點(diǎn)的異常值,我們不是您 p_ij 服從相似的分布,而是簡(jiǎn)單地令 p_ij=(p_i|j+p_j|i)/2N。
我們可以簡(jiǎn)單地編寫這些聯(lián)合概率分布 q 和 p:
同樣可以定義 p_joint 函數(shù)輸入數(shù)據(jù)矩陣 X 并返回聯(lián)合概率 P 的矩陣,此外我們還能一同估計(jì)要求的σ_i 和條件概率矩陣:
所以現(xiàn)在已經(jīng)定義了聯(lián)合概率分布 p 與 q,若我們計(jì)算了這兩個(gè)聯(lián)合分布,那么我們能使用以下梯度更新低維表征 Y 的第 i 行:
在 Python 中,我們能使用以下函數(shù)估計(jì)梯度,即給定聯(lián)合概率矩陣 P、Q 和當(dāng)前低維表征 Y 估計(jì)梯度:
為了向量化變量,np.expand_dims 方法將十分有用,該函數(shù)最后返回的 grad 為 N*2 階矩陣,其中第 i 行為 dC/dy_i。一旦我們計(jì)算完梯度,那么我們就能利用它執(zhí)行梯度下降,即通過梯度下降迭代式更新 y_i。
我們對(duì) t-SNE 的符號(hào)定義為:X 是原來的數(shù)據(jù);P 是一個(gè)矩陣,顯示了高維(原來的)空間中 X 中的點(diǎn)之間的親和度(affinities,約等于距離);Q 也是一個(gè)矩陣,顯示了低維空間中數(shù)據(jù)點(diǎn)之間的親和度。如果你有 n 個(gè)數(shù)據(jù)樣本,那么 Q 和 P 都是 n×n 的矩陣(從任意點(diǎn)到任意點(diǎn)的距離包含自身)。
現(xiàn)在 t-SNE 有自己的「獨(dú)特的」測(cè)量事物之間距離的方式(我們下面就會(huì)介紹)、一種測(cè)量高維空間中數(shù)據(jù)點(diǎn)之間的距離的方式、一種測(cè)量低維空間中數(shù)據(jù)點(diǎn)之間的距離的方式以及一種測(cè)量 P 和 Q 之間的距離的方式。
根據(jù)原始論文,一個(gè)數(shù)據(jù)點(diǎn) x_j 與另一個(gè)點(diǎn) x_i 之間的相似度是 p_j|i,其定義為:「x_i 選取 x_j 為其近鄰點(diǎn)(neighbor),而近鄰點(diǎn)的選取與以 x_i 為中心的高斯分布概率密度成正比。」
「這是什么意思!」不要擔(dān)心,我前面說了,t-SNE 有自己測(cè)量距離的獨(dú)特方式,所以讓我們看看用于測(cè)量距離(親和度)的公式,然后從中取出我們理解 t-SNE 的行為所需的見解。
從高層面來講,這就是算法的工作方式(注意和 PCA 不一樣,這是一個(gè)迭代式的算法)。
圖 3:t-SNE 工作流程
讓我們一步步地研究一下這個(gè)流程。
這個(gè)算法有兩個(gè)輸入,一個(gè)是數(shù)據(jù)本身,另一個(gè)被稱為困惑度(Perp)。
簡(jiǎn)單來說,困惑度(perplexity)是指在優(yōu)化過程中數(shù)據(jù)的局部(封閉點(diǎn))和全局結(jié)構(gòu)的焦點(diǎn)的平衡程度——本文建議將其保持在 5 到 50 之間。
更高的困惑度意味著一個(gè)數(shù)據(jù)點(diǎn)會(huì)把更多的數(shù)據(jù)點(diǎn)看作是其緊密的近鄰點(diǎn),更低的困惑度就更少。
困惑度會(huì)實(shí)際影響可視化的結(jié)果,而且你需要小心應(yīng)對(duì),因?yàn)樗赡軙?huì)在可視化低維數(shù)據(jù)時(shí)出現(xiàn)誤導(dǎo)現(xiàn)象——我強(qiáng)烈推薦閱讀這篇文章了解如何使用 t-SNE 困惑度:http://distill.pub/2016/misread-tsne,其中介紹了不同困惑度的影響。
這種困惑度從何而來?它被用于求解式子 (1) 中的 σ_i,而且因?yàn)樗鼈冇袉握{(diào)的連接,所以可以通過二元搜索(binary search)找到。
所以使用我們提供給算法的困惑度,我們基本上會(huì)找到不同的 σ_i。
讓我們看看公式為我們提供了哪些關(guān)于 t-SNE 的信息。
在我們探索公式 (1) 和 (2) 之前,需要知道 p_ii 和 q_ii 被設(shè)置為 0(即使我們將它們應(yīng)用到兩個(gè)相似的點(diǎn)上,公式的輸出也不會(huì)是 0,這只是給定的值)。
所以看看公式 (1) 和 (2),我希望你注意到,當(dāng)兩個(gè)點(diǎn)很接近時(shí)(在高維表征中),分子的值大約為 1,而如果它們相距非常遠(yuǎn),那么我們會(huì)接近無窮小——這將有助于我們后面理解成本函數(shù)。
現(xiàn)在我們可以了解關(guān)于 t-SNE 的一些事情了。
一是因?yàn)橛H和度公式的構(gòu)建方式,在 t-SNE 圖中解讀距離可能會(huì)出問題。
這意味著聚類之間的距離和聚類大小可能被誤導(dǎo),并且也會(huì)受到所選擇的困惑度的影響(在上面我推薦的文章中,你可以看到這些現(xiàn)象的可視化)。
第二件要注意的事情是,怎么在等式 (1) 中我們基本上計(jì)算的是點(diǎn)之間的歐幾里得距離?這方面 t-SNE 很強(qiáng)大,我們可以用任何我們喜歡的距離測(cè)量來取代它,比如余弦距離、Manhattan 距離,也可以使用任何你想用的測(cè)量方法(只要其保持空間度量(space metric),而且保持低維親和度一樣)——以歐幾里得的方式會(huì)得到復(fù)雜的距離繪圖。
比如說,如果你是一位 CTO,你有一些數(shù)據(jù)需要根據(jù)余弦相似度測(cè)量距離,而你的 CEO 想要你通過圖表的形式呈現(xiàn)這些數(shù)據(jù)。我不確定你是否有時(shí)間向董事會(huì)解釋什么是余弦相似度以及解讀聚類的方式,你可以直接繪制余弦相似度聚類,因?yàn)闅W幾里得距離聚類使用 t-SNE——要我說,這確實(shí)很酷。
在代碼中,你可以在 scikit-learn 中通過向 TSNE 方法提供一個(gè)距離矩陣來實(shí)現(xiàn)。
現(xiàn)在,我們知道當(dāng) x_i 和 x_j 更近時(shí),p_ij/q_ij 的值更大;相反則該值更小。
讓我們看看這會(huì)對(duì)我們的成本函數(shù)(被稱為 KL 散度(Kullback–Leibler divergence))帶來怎樣的影響。讓我們繪圖,然后看看沒有求和部分的公式 (3)。
圖 4:沒有求和部分的 t-SNE 成本函數(shù)
很難看明白這是啥?但我在上面給軸加了名字。
如你所見,這個(gè)成本函數(shù)是不對(duì)稱的。
對(duì)于高維空間中臨近的點(diǎn),其得出了非常高的成本(p 軸),但這些點(diǎn)是低維空間中很遠(yuǎn)的點(diǎn)表示的;而在高維空間中遠(yuǎn)離的點(diǎn)則成本更低,它們則是用低維空間中臨近的點(diǎn)表示的。
這說明在 t-SNE 圖中,距離解釋能力的問題甚至還更多。
t-SNE 可視化
我們將要使用的第一個(gè)數(shù)據(jù)集是基于物理特征分類的 10 種不同葉片。這種情況下,t-SNE 需要使用 14 個(gè)數(shù)值變量作為輸入,其中就包括葉片的生長(zhǎng)率和長(zhǎng)寬比等。下圖展示了 2 維可視化輸出,植物的種類(標(biāo)簽)使用不同的顏色表達(dá)。
物種 Acer palmatum 的數(shù)據(jù)點(diǎn)在右上角形成了一個(gè)橙色集群,這表明它的葉子和其他物種有很大的不同。該示例中類別通常會(huì)有很好的分組,相同物種的葉子(同一顏色的數(shù)據(jù)點(diǎn))趨向于彼此靠緊聚集在一起。左下角有兩種顏色的數(shù)據(jù)點(diǎn)靠近在一起,說明這兩個(gè)物種的葉子形狀十分相似。
最近鄰準(zhǔn)確度表明給定兩個(gè)隨機(jī)點(diǎn),它們是相同物種的概率是多少。如果這些數(shù)據(jù)點(diǎn)完美地根據(jù)不同物種而分類,那么準(zhǔn)確度就會(huì)非常接近 100%,高準(zhǔn)確度意味著數(shù)據(jù)能被干凈地分為不同的集群。
困惑度
下面,我們對(duì)可樂品牌做了類似的分析。為了演示困惑度(perplexity)的影響,我們首先需要將困惑度設(shè)置為較低的值 2,每個(gè)數(shù)據(jù)點(diǎn)的映射只考慮最近鄰。如下,我們將看到許多離散的小集群,并且每一個(gè)集群只有少量的數(shù)據(jù)點(diǎn)。
下面我們將 t-SNE 的困惑度設(shè)置為 100,我們可以看到數(shù)據(jù)點(diǎn)變得更加擴(kuò)散,并且同一類之間的聯(lián)系變?nèi)酢?/p>
在該案例中,可樂本身就要比樹葉更難分割,即使一類數(shù)據(jù)點(diǎn)某個(gè)品牌要更集中一些,但仍然沒有明確的邊界。
在實(shí)踐中,困惑度并沒以一個(gè)絕對(duì)的標(biāo)準(zhǔn),不過一般選擇 5 到 50 之間會(huì)有比較好的結(jié)果。并且在這個(gè)范圍內(nèi),t-SNE 一般是比較魯棒的。
預(yù)測(cè)的解釋
度量數(shù)據(jù)點(diǎn)之間的角度或距離并不能推斷出任何數(shù)據(jù)上的具體或定量的信息,所以 t-SNE 的預(yù)測(cè)更多的是用于可視化數(shù)據(jù)。
在模型搭建前期直觀地挖掘數(shù)據(jù)模式有助于指導(dǎo)數(shù)據(jù)科學(xué)下一步進(jìn)程。如果 t-SNE 能很好地分割數(shù)據(jù)點(diǎn),那么機(jī)器學(xué)習(xí)同樣也能找到一種將未知新數(shù)據(jù)投影到相應(yīng)類別的好方法。給定一種預(yù)測(cè)算法,我們就能實(shí)現(xiàn)很難搞的準(zhǔn)確度。
上例中每一個(gè)類別都是孤立分類的,因此簡(jiǎn)單的機(jī)器學(xué)習(xí)模型就能將該類別與其他類別分離開。但如果類別重疊,我們可能就要構(gòu)建更精細(xì)的模型做出預(yù)測(cè)。如下所示,如果我們按照某個(gè)品牌的偏好從 1 到 5 進(jìn)行分類,那么類別可能更加離散、更難以預(yù)測(cè),最近鄰精度也會(huì)相對(duì)較低。
對(duì)比 PCA
很自然我們就希望將 t-SNE 和其他降維算法做比較。降維算法中比較流行的是主成分分析法(PCA),PCA 會(huì)尋找能盡可能保留數(shù)據(jù)方差的新維度。有較大的方差的數(shù)據(jù)保留的信息就越多,因?yàn)楸舜瞬煌臄?shù)據(jù)可以提供不同的信息,所以我們最好是保留彼此分離的數(shù)據(jù)點(diǎn),因?yàn)樗鼈兲峁┝溯^大的方差。
下面是采用 PCA 算法對(duì)上文的樹葉類別進(jìn)行降維的結(jié)果,我們看到雖然左側(cè)的橙色是分離的,但其它類別都有點(diǎn)混合在一起。這是因?yàn)?PCA 并不關(guān)心局部的最近鄰關(guān)系,此外 PCA 是一種線性方法,所以它表征非線性關(guān)系可能效果并不是很好。不過 PCA 算法在壓縮數(shù)據(jù)為更小的特征向量而投入到預(yù)測(cè)算法中有很好地表現(xiàn),這一點(diǎn)它要比 t-SNE 效果更好。
結(jié)語
t-SNE 是一種可視化高維數(shù)據(jù)的優(yōu)秀算法,它經(jīng)常要比其它降維算法生成更具特點(diǎn)的可視化結(jié)果。