天天看點

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

作者:CDA資料分析師

t-SNE是什麼技術

我們直接開門見山好了,第一件事:什麼是t-SNE?t-SNE的全稱叫做t分布式随機鄰居嵌入(t-SNE)。該算法是一種非監督的非線性技術,主要用于資料探索和可視化高維資料。簡而言之,t-SNE為我們提供了資料如何在高維空間中排列的感覺或直覺。它由Laurens van der Maatens和Geoffrey Hinton于2008年開發。一提到降維,我們會想到大名鼎鼎的PCA,PCA是線性降維的技術,那麼較之于我們今天要介紹的t-SNE,它們有什麼不同或者聯系嗎。如果您熟悉主成分分析(PCA),那麼像我一樣,你可能想知道PCA和t-SNE之間的差別。首先要注意的是,PCA是在1933年開發的,而t-SNE是在2008年開發的。

自1933年以來,資料科學領域發生了很大變化,主要是在計算和資料大小領域。其次,PCA是一種線性降維技術,旨在最大化方差并保持較大的成對距離。PCA可能導緻可視化效果不佳,特别是在處理非線性結構時。這裡非線性結構可以視為任何幾何形狀,如:圓柱體、球、曲線等。t-SNE與PCA的不同之處在于隻保留小的成對距離或局部相似性,而PCA則關注的是保持大成對距離以最大化方差。

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

圖1-“瑞士卷“資料集,保持與t-SNE(實線)的小距離vs最大化方差PCA

Laurens很好地利用上圖中的“瑞士卷”資料集很好地說明了PCA和t-SNE方法(實線為t-SNE,虛線為PCA)。你可以看到,由于這個“瑞士卷”資料集(流形)的非線性并保持了大距離,PCA會錯誤地保留資料的結構。

t—SNE算法原理

現在我們知道為什麼有時候我們不用pca而用t-SNE,讓我們來看看t-SNE是如何工作的,其背後有怎樣的算法原理。其實,概括來說:t-SNE算法計算高維空間和低維空間中一對執行個體之間的相似性度量。然後,該算法用代價函數來優化這兩個相似度名額。這個算法将其分為3個基本步驟。

步驟1:測量高維空間中點之間的相似性

我們以分散在二維空間上的一堆資料點(圖2)說明。對于每個資料點(),我們将在該點上以高斯分布為中心。然後,我們測量高斯分布下所有點()的密度。然後對所有點進行重整化。我們根據高斯得出所有點的機率()。這些機率與相似之處成正比。這意味着,如果資料點()和()在這個高斯圓下具有相等的值,那麼它們的比例和相似性是相等的,是以在這個高維空間的結構中具有局部相似性。高斯分布或圓可以使用所謂的複雜度來操作,這影響分布(圓大小)的方差,本質上影響最近鄰居的數量。複雜度的正常範圍在5到50之間。

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

圖2-圍繞資料點的高斯分布在高維空間中測量成對的相似度

步驟2:第2步類似于第1步,不用高斯分布而是使用具有一定自由度的學生t分布

T分布這也被稱為柯西分布(圖3)。這給了我們在低維空間中的第二組機率。如您所見,學生t分布的尾部比正态分布更“重”。沉重的尾部可以更好地模拟相距很遠的距離。

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

圖3-柯西分布和正态分布機率密度圖的比較

步驟3:最後一步是,我們希望這些來自低維空間()的機率集盡可能地反映高維空間()的機率我們希望這兩個地圖結構相似。我們使用庫爾巴克-利布勒發散(KL)測量二維空間的機率分布之間的差異。可以有效地比較和值。最後,我們使用梯度下降來最小化我們的KL損失函數。

t-SNE用在哪

現在我們已經了解了t-SNE的工作原理,讓我們快速談談它在哪裡使用。Laurens van der Maaten在他的視訊示範中展示了許多例子,他提到了t-SNE在氣候研究、計算機安全、生物資訊學、癌症研究等領域的使用。也就是說t-SNE可用于高維資料(主要用于可視化),然後這些次元的輸出成為其他分類模型的輸入。然而,t-SNE不是聚類方法,因為它不保留PCA等輸入,并且值可能經常在運作之間發生變化,是以純粹是為了探索、可視化等工作。

代碼示例:本次案例的目标是通過蘑菇的特征(比如形狀、氣味等)來區分其是否可以食用,同時會在二維空間上呈現基于PCA和t-SNE的不同的降維分類效果,以此來認識二者的不同。第1步-導入所需的庫,讀取并檢視資料集#導入所需的庫import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns#讀取并檢視資料data = pd.read_csv('mushrooms.csv')data.head()

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

第2步-區分解釋變量與被解釋變量,檢視資料的基本資訊

#區分解釋變量與被解釋變量y = data['class']X = data.iloc[:,1:]#檢視解釋變量的基本資訊X.info()

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

第3步-檢視解釋變量的取值情況,進行資料編碼#檢視解釋變量的取值情況cols = X.columns.tolist()for col in cols: print(col, X[col].unique())

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

#對解釋變量進行資料編碼for col in cols: X[col] = X[col].astype('category') X[col] = X[col].cat.codesX.head()

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

#删除無用變量X.drop('veil-type', axis=1, inplace=True)

第4步-PCA降維與可視化(1)導入所需的庫from sklearn import preprocessingfrom sklearn.decomposition import PCA(2)資料标準化X_std = preprocessing.scale(X)(3)pca(二維)pca=PCA(n_components=2) pca.fit(X_std)(4)計算主成分得分,合并資料X_pca=pd.DataFrame(pca.fit_transform(X_std)).rename(columns={0:'1st_component',1:'2nd_component'})Y = pd.DataFrame(y)data_pca = pd.concat([X_pca, Y], axis = 1)data_pca

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

(5)可視化PCA降維分類結果plt.figure(figsize=(8, 8)) sns.scatterplot(data=data_pca, hue='class', x='1st_component', y='2nd_component') plt.show()

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

第5步-t-SNE降維與可視化(1)導入所需的庫from sklearn.manifold import TSNE(2)t-SNE降維tsne = TSNE(n_components=2)tsne.fit(X_std)(3)可視化t-SNE降維分類結果X_tsne = pd.DataFrame(tsne.fit_transform(X_std)).rename(columns={0:'dim1', 1:'dim2'})data_tsne = pd.concat([X_tsne, Y], axis = 1)plt.figure(figsize=(8, 8)) sns.scatterplot(data=data_tsne, hue='class', x='dim1', y='dim2') plt.show()

【建議收藏】好用的降維算法——t-SNE,帶python執行個體講解

編輯切換為居中

添加圖檔注釋,不超過 140 字(可選)

從可視化的結果可以看出,基于PCA降維的結果會産生重疊,這是因為主成分降維無法維護資料的局部結構而導緻的,而基于t-SNE降維的結果分類更加清晰,基本沒有類别之間的重疊,這就是t-SNE算法在降維過程中很好的保留了資料局部特征而産生的結果,是以,t-SNE算法可以很好的用來進行資料降維和可視化展示。