日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

t-SNE数据降维(2维3维)及可视化

發(fā)布時間:2024/3/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 t-SNE数据降维(2维3维)及可视化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(最近看了一個叫光譜特征在后門攻擊中的用法,讀完之后發(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ù),代碼如下:

import numpy as np from sklearn.manifold import TSNE"""將3維數(shù)據(jù)降維2維"""# 4個3維的數(shù)據(jù) x = np.array([[0, 0, 0, 1, 2], [0, 1, 1, 3, 5], [1, 0, 1, 7, 2], [1, 1, 1, 10, 22]]) # 嵌入空間的維度為2,即將數(shù)據(jù)降維成2維 ts = TSNE(n_components=2) # 訓練模型 ts.fit_transform(x) # 打印結(jié)果 print(ts.embedding_)

? ? ? ?


2 S型曲線的降維與可視化
????S型曲線中的數(shù)據(jù)是高維的數(shù)據(jù),不同的顏色表示不同的數(shù)據(jù)點。當我們通過t-SNE將數(shù)據(jù)嵌入到2維空間中后,可以看到數(shù)據(jù)點之間的類別信息被完整地保留了下來。代碼如下:

import matplotlib.pyplot as plt from sklearn import manifold, datasets"""對S型曲線數(shù)據(jù)的降維和可視化"""# 生成1000個S型曲線數(shù)據(jù) x, color = datasets.samples_generator.make_s_curve(n_samples=1000, random_state=0) # x是[1000,2]的2維數(shù)據(jù),color是[1000,1]的一維數(shù)據(jù)n_neighbors = 10 n_components = 2# 創(chuàng)建自定義圖像 fig = plt.figure(figsize=(8, 8)) # 指定圖像的寬和高 plt.suptitle("Dimensionality Reduction and Visualization of S-Curve Data ", fontsize=14) # 自定義圖像名稱# 繪制S型曲線的3D圖像 ax = fig.add_subplot(211, projection='3d') # 創(chuàng)建子圖 ax.scatter(x[:, 0], x[:, 1], x[:, 2], c=color, cmap=plt.cm.Spectral) # 繪制散點圖,為不同標簽的點賦予不同的顏色 ax.set_title('Original S-Curve', fontsize=14) ax.view_init(4, -72) # 初始化視角# t-SNE的降維與可視化 ts = manifold.TSNE(n_components=n_components, init='pca', random_state=0) # 訓練模型 y = ts.fit_transform(x) ax1 = fig.add_subplot(2, 1, 2) plt.scatter(y[:, 0], y[:, 1], c=color, cmap=plt.cm.Spectral) ax1.set_title('t-SNE Curve', fontsize=14) # 顯示圖像 plt.show()

????效果如下圖所示:

?



3 手寫數(shù)字數(shù)據(jù)集的降維與可視化
????手寫數(shù)字數(shù)據(jù)集是一個經(jīng)典的圖片分類數(shù)據(jù)集,數(shù)據(jù)集中包含0-9這10個數(shù)字的灰度圖片,每張圖片以8*8共64個像素點表示。具體代碼如

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.manifold import TSNE# 加載數(shù)據(jù) def get_data():""":return: 數(shù)據(jù)集、標簽、樣本數(shù)量、特征數(shù)量"""digits = datasets.load_digits(n_class=10)data = digits.data # 圖片特征label = digits.target # 圖片標簽n_samples, n_features = data.shape # 數(shù)據(jù)集的形狀return data, label, n_samples, n_features# 對樣本進行預處理并畫圖 def plot_embedding(data, label, title):""":param data:數(shù)據(jù)集:param label:樣本標簽:param title:圖像標題:return:圖像"""x_min, x_max = np.min(data, 0), np.max(data, 0)data = (data - x_min) / (x_max - x_min) # 對數(shù)據(jù)進行歸一化處理fig = plt.figure() # 創(chuàng)建圖形實例ax = plt.subplot(111) # 創(chuàng)建子圖# 遍歷所有樣本for i in range(data.shape[0]):# 在圖中為每個數(shù)據(jù)點畫出標簽plt.text(data[i, 0], data[i, 1], str(label[i]), color=plt.cm.Set1(label[i] / 10),fontdict={'weight': 'bold', 'size': 7})plt.xticks() # 指定坐標的刻度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()

????效果截圖如下:

?

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。