t-SNE可視化示例

T 分佈隨機近鄰嵌入(T-Distribution Stochastic Neighbour Embedding)是一種用於降維的機器學習方法,它能幫我們識別相關聯的模式。t-SNE 主要的優勢就是保持局部結構的能力。這意味着高維數據空間中距離相近的點投影到低維中仍然相近。t-SNE 同樣能生成漂亮的可視化。

理論方面可查看Hinton 在 2008 年發表的論文:《Visualizing Data using t-SNE》

http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

我的理解是:高位空間和低維空間理論上相似性應該得到保留,爲了讓低維空間近似於高位空間的距離,通過概率分佈來建模點與點之間的關係,然後利用高位空間和低維空間的同樣分佈,用KL散度作爲loss來訓練,使低維空間最大近似保留高位空間的距離。

SKLearn 代碼如下:https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html

#visualize : t-SNE
from sklearn.manifold import TSNE
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patheffects as PathEffects
import random
def scatter(X, y):
    #X,y:numpy-array
    classes = len(list(set(y.tolist())))#get number of classes
    #palette = np.array(sns.color_palette("hls", classes))# choose a color palette with seaborn.
    color = ['c','y','m','b','g','r']
    marker = ['o','x','+','*','s']
    plt.figure(figsize=(8,8))#create a plot
    for i in range(classes):
        plt.scatter(X[y == i,0], X[y == i,1], c=color[i], marker=marker[i], label=str(i))
    plt.axis('off')
    plt.legend(loc='lower left')
    #plt.savefig('digits_tsne-generated.png', dpi=100)
    plt.show()

#prepare data,classes=5
idx= random.sample(np.where(np.array(teY)==0)[0].tolist(),100)
X0= np.array(teF)[idx]
y0= np.array(teY)[idx]

idx= random.sample(np.where(np.array(teY)==1)[0].tolist(),100)
X1= np.array(teF)[idx]
y1= np.array(teY)[idx]

idx= random.sample(np.where(np.array(teY)==2)[0].tolist(),100)
X2= np.array(teF)[idx]
y2= np.array(teY)[idx]

idx= random.sample(np.where(np.array(teY)==3)[0].tolist(),100)
X3= np.array(teF)[idx]
y3= np.array(teY)[idx]

idx= np.where(np.array(teY)==4)[0].tolist()
X4= np.array(teF)[idx]
y4= np.array(teY)[idx]

y = np.append(y0,y1)
y = np.append(y,y2)
y = np.append(y,y3)
y = np.append(y,y4)
X = np.vstack((X0,X1))
X = np.vstack((X,X2))
X = np.vstack((X,X3))
X = np.vstack((X,X4))
#training t-sne 
tsne = TSNE(n_components=2, init='pca', random_state=501)
X_tsne = tsne.fit_transform(X)
print("Org data dimension is {}.Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))

#visualize
scatter(X_tsne, y)

可見分類模型的效果不是很好。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章