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