t-SNE数据降维(2维3维)及可视化
(最近看了一個(gè)叫光譜特征在后門(mén)攻擊中的用法,讀完之后發(fā)現(xiàn)是用了一個(gè)SVD也就是奇異值分解做了降維,然后用殘差網(wǎng)絡(luò)的representation層殘差與殘差的奇異值分解后的右奇異值矩陣的第一行做乘法得到correlation,疑惑得很什么時(shí)候相關(guān)性可以這么算了。于是想到降維可以不用SVD可以用TSNE,就寫(xiě)一下這一塊的東西,融合了別人寫(xiě)的二維和三維的可視化)
?t-SNE全稱(chēng)為t-distributed Stochastic Neighbor Embedding,翻譯為t-隨機(jī)鄰近嵌入,它是一種embedding模型,用于高維空間中的數(shù)據(jù)映射到低維空間中,并保留數(shù)據(jù)集的局部特性,該算法在論文中非常常見(jiàn),主要用于高維數(shù)據(jù)的降維和可視化。
????t-SNE可以算是目前效果最好的數(shù)據(jù)降維和可視化方法之一,當(dāng)我們想對(duì)高維數(shù)據(jù)集進(jìn)行分類(lèi),但又不清楚這個(gè)數(shù)據(jù)集有沒(méi)有很好的可分性時(shí),可以通過(guò)t-SNE將數(shù)據(jù)投影到2維或3維空間中觀察一下:如果在低維空間中具有可分性,則數(shù)據(jù)是可分的;如果在低維空間中不可分,則可能是因?yàn)閿?shù)據(jù)集本身不可分,或者數(shù)據(jù)集中的數(shù)據(jù)不適合投影到低維空間。
????t-SNE將數(shù)據(jù)點(diǎn)之間的相似度轉(zhuǎn)化為條件概率,原始空間中數(shù)據(jù)點(diǎn)的相似度由高斯聯(lián)合分布表示,嵌入空間中數(shù)據(jù)點(diǎn)的相似度由學(xué)生t分布表示。通過(guò)原始空間和嵌入空間的聯(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),通過(guò)梯度下降算法最小化損失函數(shù),最終獲得收斂結(jié)果。要注意t-SNE的缺點(diǎn)很明顯:占用內(nèi)存較多、運(yùn)行時(shí)間長(zhǎng)。
1 降維
????首先,通過(guò)一個(gè)簡(jiǎn)單的示例看一下t-SNE的降維效果:輸入4個(gè)5維的數(shù)據(jù),通過(guò)t-SNE將其降維成2維的數(shù)據(jù),代碼如下:
? ? ? ?
2 S型曲線的降維與可視化
????S型曲線中的數(shù)據(jù)是高維的數(shù)據(jù),不同的顏色表示不同的數(shù)據(jù)點(diǎn)。當(dāng)我們通過(guò)t-SNE將數(shù)據(jù)嵌入到2維空間中后,可以看到數(shù)據(jù)點(diǎn)之間的類(lèi)別信息被完整地保留了下來(lái)。代碼如下:
????效果如下圖所示:
?
3 手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集的降維與可視化
????手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集是一個(gè)經(jīng)典的圖片分類(lèi)數(shù)據(jù)集,數(shù)據(jù)集中包含0-9這10個(gè)數(shù)字的灰度圖片,每張圖片以8*8共64個(gè)像素點(diǎn)表示。具體代碼如
????效果截圖如下:
?
4 3D可視化效果圖
import tensorflow as tf import numpy as np from sklearn.manifold import TSNE # TSNE集成在了sklearn中 import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axes3D # 進(jìn)行3D圖像繪制import input_data # MNIST的數(shù)據(jù)操作文件mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) saver = tf.train.import_meta_graph('model/model.ckpt.meta') # tensorflow加載神經(jīng)網(wǎng)絡(luò)圖結(jié)構(gòu) gragh = tf.get_default_graph()image_input = gragh.get_tensor_by_name('Placeholder:0') # 獲得圖中預(yù)定義的輸入,即MNIST圖像 label_input = gragh.get_tensor_by_name('Placeholder_1:0') # 獲得對(duì)應(yīng)圖像的標(biāo)簽 predict = gragh.get_tensor_by_name('fco/BiasAdd:0') # 獲得網(wǎng)絡(luò)的輸出值with tf.Session() as sess:sess.run(tf.global_variables_initializer())saver.restore(sess, tf.train.latest_checkpoint("model")) # tensorflow恢復(fù)神經(jīng)網(wǎng)絡(luò)參數(shù)到當(dāng)前圖# 方便快速計(jì)算,只取訓(xùn)練集前面2000個(gè)數(shù)據(jù)進(jìn)行可視化。pre = sess.run(predict,feed_dict={image_input: mnist.test.images[:2000, :], label_input: mnist.test.labels[:2000, :]})# TSNE進(jìn)行降維計(jì)算,n_components代表降維維度embedded = TSNE(n_components=3).fit_transform(pre)# 對(duì)數(shù)據(jù)進(jìn)行歸一化操作x_min, x_max = np.min(embedded, 0), np.max(embedded, 0)embedded = embedded / (x_max - x_min)# 創(chuàng)建顯示的figurefig = plt.figure()ax = Axes3D(fig)# 將數(shù)據(jù)對(duì)應(yīng)坐標(biāo)輸入到figure中,不同標(biāo)簽取不同的顏色,MINIST共0-9十個(gè)手寫(xiě)數(shù)字ax.scatter(embedded[:, 0], embedded[:, 1], embedded[:, 2],c=plt.cm.Set1(np.argmax(mnist.test.labels[:2000, :], axis=1) / 10.0))# 關(guān)閉了plot的坐標(biāo)顯示plt.axis('off')plt.show()3D可視化效果圖,不同顏色代表不同的數(shù)字類(lèi)別
總結(jié)
以上是生活随笔為你收集整理的t-SNE数据降维(2维3维)及可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 长隆大马戏机器人_长隆娱乐登陆
- 下一篇: 用户标签(三):oneid与用户标签之间