1 t-SNE 背景介紹 最易被我們視覺觀察到的維數(shù)是一維,二維和三維,四維及以上用圖形表達(dá)都不會(huì)那么直觀。 然而,現(xiàn)實(shí)情況卻是隨意拿個(gè)數(shù)據(jù)集,都有上千上百個(gè)維度。比如,經(jīng)典的MNIST維度是64,所以使用二維的笛卡爾坐標(biāo)系,注定無(wú)法繪制64個(gè)維度。 當(dāng)我們想對(duì)高維數(shù)據(jù)集進(jìn)行分類,但又不清楚這個(gè)數(shù)據(jù)集有沒有很好的可分性(同類之間間隔小、異類之間間隔大)時(shí),可以通過降維算法將數(shù)據(jù)投影到二維或三維空間中。 很久以前,就有人提出一種降維算法,主成分分析(PCA) 降維法,中間其他的降維算法陸續(xù)出現(xiàn),比如 多維縮放(MDS),線性判別分析(LDA),等度量映射(Isomap)。 等時(shí)間來(lái)到2008年,另外一個(gè)和我們比較熟悉的大牛 Geoffrey Hinton在 2008 年一同提出了t-SNE 算法。 他們改進(jìn)SNE算法為t-SNE算法,并使它在降維領(lǐng)域得到更廣泛的應(yīng)用。 2 t-SNE 算法概述 全稱為 t-distributed Stochastic Neighbor Embedding,翻譯為 t分布-隨機(jī)鄰近嵌入。 怎么理解這個(gè)名字? 首先,t-分布是關(guān)于樣本(而非總體)的t 變換值的分布,它是對(duì)u 變換變量值的標(biāo)準(zhǔn)正態(tài)分布的估計(jì)分布,是一位學(xué)生首先提出的,所以 t-分布全稱:學(xué)生t-分布。 其次,t-SNE本質(zhì)是一種嵌入模型,能夠?qū)⒏呔S空間中的數(shù)據(jù)映射到低維空間中,并保留數(shù)據(jù)集的局部特性。t-SNE 可以算是目前效果很好的數(shù)據(jù)降維和可視化方法之一。 缺點(diǎn)主要是占用內(nèi)存較多、運(yùn)行時(shí)間長(zhǎng)。 t-SNE變換后,如果在低維空間中具有可分性,則數(shù)據(jù)是可分的;如果在低維空間中不可分,則可能是因?yàn)閿?shù)據(jù)集本身不可分,或者數(shù)據(jù)集中的數(shù)據(jù)不適合投影到低維空間。 該算法在論文中非常常見,主要用于高維數(shù)據(jù)的降維和可視化。 Visualizing Data using t-SNE,2008年發(fā)表在Journal of Machine Learning Research,大神Hinton的文章: http://www./papers/v9/vandermaaten08a.html 3 t-SNE 原理描述 t-SNE將數(shù)據(jù)點(diǎn)之間的相似度轉(zhuǎn)化為條件概率,原始空間中數(shù)據(jù)點(diǎn)的相似度由高斯聯(lián)合分布表示,嵌入空間中數(shù)據(jù)點(diǎn)的相似度由學(xué)生t分布 表示。 通過原始空間和嵌入空間的聯(lián)合概率分布的KL散度(用于評(píng)估兩個(gè)分布的相似度的指標(biāo),經(jīng)常用于評(píng)估機(jī)器學(xué)習(xí)模型的好壞)來(lái)評(píng)估嵌入效果的好壞。 也就是,將有關(guān)KL散度的函數(shù)作為損失函數(shù)(loss function),通過梯度下降算法最小化損失函數(shù),最終獲得收斂結(jié)果。 4 t-SNE 精華所在 t-SNE的精華都在以下這些文字: 在文中提到的論文中,主要討論降維出現(xiàn)的擁擠問題,解決的方法也很巧妙,一旦理解它后就明白為什么叫t-分布隨機(jī)近鄰嵌入。 如果想象在一個(gè)三維的球里面有均勻分布的點(diǎn),不難想象,如果把這些點(diǎn)投影到一個(gè)二維的圓上一定會(huì)有很多點(diǎn)是重合的。 所以,為了在二維的圓上想盡可能表達(dá)出三維里的點(diǎn)的信息,大神Hinton采取的方法: 把由于投影所重合的點(diǎn)用不同的距離(差別很?。┍硎?。 這樣就會(huì)占用原來(lái)在那些距離上的點(diǎn),原來(lái)那些點(diǎn)會(huì)被趕到更遠(yuǎn)一點(diǎn)的地方。 t分布是長(zhǎng)尾的,意味著距離更遠(yuǎn)的點(diǎn)依然能給出和高斯分布下距離小的點(diǎn)相同的概率值。 從而達(dá)到高維空間和低維空間對(duì)應(yīng)的點(diǎn)概率相同的目的。 5 t-SNE降維對(duì)比分析 以MNIST數(shù)據(jù)集,降維并可視化為例,可以看到t-SNE 算法明顯好于其他降維算法: 在人臉數(shù)據(jù)集olivertti 上表現(xiàn): 在哥倫比亞大學(xué) Columbia University Image Library (COIL-20) 數(shù)據(jù)集上的表現(xiàn): 6 sklearn實(shí)現(xiàn)t-SNE import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.manifold import TSNE# 加載數(shù)據(jù)def get_data(): ''' :return: 數(shù)據(jù)集、標(biāo)簽、樣本數(shù)量、特征數(shù)量 ''' digits = datasets.load_digits(n_class=10) data = digits.data # 圖片特征 label = digits.target # 圖片標(biāo)簽 n_samples, n_features = data.shape # 數(shù)據(jù)集的形狀 return data, label, n_samples, n_features# 對(duì)樣本進(jìn)行預(yù)處理并畫圖def plot_embedding(data, label, title): ''' :param data:數(shù)據(jù)集 :param label:樣本標(biāo)簽 :param title:圖像標(biāo)題 :return:圖像 ''' x_min, x_max = np.min(data, 0), np.max(data, 0) data = (data - x_min) / (x_max - x_min) # 對(duì)數(shù)據(jù)進(jìn)行歸一化處理 fig = plt.figure() # 創(chuàng)建圖形實(shí)例 ax = plt.subplot(111) # 創(chuàng)建子圖 # 遍歷所有樣本 for i in range(data.shape[0]): # 在圖中為每個(gè)數(shù)據(jù)點(diǎn)畫出標(biāo)簽 plt.text(data[i, 0], data[i, 1], str(label[i]), color=plt.cm.Set1(label[i] / 10), fontdict={'weight': 'bold', 'size': 10}) plt.xticks() # 指定坐標(biāo)的刻度 plt.yticks() plt.title(title, fontsize=14) # 返回值 return fig# 主函數(shù),執(zhí)行t-SNE降維def main(): data, label , n_samples, n_features = get_data() # 調(diào)用函數(shù),獲取數(shù)據(jù)集信息 print('Starting compute t-SNE Embedding...') ts = TSNE(n_components=2, init='pca', random_state=0) # t-SNE降維 reslut = ts.fit_transform(data) # 調(diào)用函數(shù),繪制圖像 fig = plot_embedding(reslut, label, 't-SNE Embedding of digits') # 顯示圖像 plt.show()# 主函數(shù)if __name__ == '__main__': main() 結(jié)果: |
|
來(lái)自: taotao_2016 > 《AI》