1. 程式人生 > 其它 >兩個input_t-SNE實踐(視覺化兩個圖片資料集合的差異)

兩個input_t-SNE實踐(視覺化兩個圖片資料集合的差異)

任務陳述:在Images目錄下有兩種圖片,各500張,前500張為第一類,後500張為第二類如下圖,可以看到兩類的風格不一樣,需要想辦法將這兩類降到2維或者3維聚類視覺化。

兩類圖片資料集
在看下面內容之前,可以先看一下利用t-SEN手寫資料集分類的例子,(文末也有實現)這也是各大部落格最喜歡貼的例子,或者結合起來看。

直接上程式碼

確保python安裝好了各個依賴庫,特別是sklearn

第一部分是獲取資料的程式碼:

無論你是什麼型別的資料(圖片,音訊,文字等等),先將它先處理成np.array型別,確保data的形狀為(資料條數,每條資料維度),label的形狀(資料條數,) 方便後面呼叫t-SNE方法

import os
import numpy as np
import cv2
from time import time
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets #手寫資料集要用到
from sklearn.manifold import TSNE
#該函式是關鍵,需要根據自己的資料加以修改,將圖片存到一個np.array裡面,並且製作標籤
#因為是兩類資料,所以我分別用0,1來表示
def get_data(Input_path): #
Input_path為你自己原始資料儲存路徑,我的路徑就是上面的'./Images' Image_names=os.listdir(Input_path) #獲取目錄下所有圖片名稱列表 data=np.zeros((len(Image_names),40000)) #初始化一個np.array陣列用於存資料 label=np.zeros((len(Image_names),)) #初始化一個np.array陣列用於存資料 #為前500個分配標籤1,後500分配0 for k in range(500): label[k]=1 #讀取並存儲圖片資料,原圖為rgb三通道,而且大小不一,先灰度化,再resize成200x200固定大小
for i in range(len(Image_names)): image_path=os.path.join(Input_path,Image_names[i]) img=cv2.imread(image_path) img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) img=cv2.resize(img_gray,(200,200)) img=img.reshape(1,40000) data[i]=img n_samples, n_features = data.shape return data, label, n_samples, n_features ‘’‘下面的兩個函式, 一個定義了二維資料,一個定義了3維資料的視覺化 不作詳解,也無需再修改感興趣可以瞭解matplotlib的常見用法 ’‘’ def plot_embedding_2D(data, label, title): x_min, x_max = np.min(data, 0), np.max(data, 0) data = (data - x_min) / (x_max - x_min) fig = plt.figure() for i in range(data.shape[0]): plt.text(data[i, 0], data[i, 1], str(label[i]), color=plt.cm.Set1(label[i]), fontdict={'weight': 'bold', 'size': 9}) plt.xticks([]) plt.yticks([]) plt.title(title) return fig def plot_embedding_3D(data,label,title): x_min, x_max = np.min(data,axis=0), np.max(data,axis=0) data = (data- x_min) / (x_max - x_min) ax = plt.figure().add_subplot(111,projection='3d') for i in range(data.shape[0]): ax.text(data[i, 0], data[i, 1], data[i,2],str(label[i]), color=plt.cm.Set1(label[i]),fontdict={'weight': 'bold', 'size': 9}) return fig #主函式 def main(): data, label, n_samples, n_features = get_data('./Images') #根據自己的路徑合理更改 print('Begining......') #時間會較長,所有處理完畢後給出finished提示 tsne_2D = TSNE(n_components=2, init='pca', random_state=0) #呼叫TSNE result_2D = tsne_2D.fit_transform(data) tsne_3D = TSNE(n_components=3, init='pca', random_state=0) result_3D = tsne_3D.fit_transform(data) print('Finished......') #呼叫上面的兩個函式進行視覺化 fig1 = plot_embedding_2D(result_2D, label,'t-SNE') plt.show(fig1) fig2 = plot_embedding_3D(result_3D, label,'t-SNE') plt.show(fig2) if __name__ == '__main__': main()

下面給出結果圖:

降到2d視覺化

降到3d的視覺化

可以明顯看出兩類資料的差異巨大。t-SNE的降維能力實在是強悍!上面提到了”手寫資料集“的例子,下面也作一個說明:

將上述get_data改成:

def get_data(Input_path)
    digits = datasets.load_digits(n_class=6)
    data = digits.data
    label = digits.target
    n_samples, n_features = data.shape
return data, label, n_samples, n_features

這樣就能實現手寫資料集的分類視覺化。

手寫資料2d

手寫數字3d