tsne 使用教程


1、TSNE的基本概念

t-SNE(t-distributed stochastic neighbor embedding)是用於降維的一種機器學習算法,是由 Laurens van der Maaten 等在08年提出來。此外,t-SNE 是一種非線性降維算法,非常適用於高維數據降維到2維或者3維,進行可視化。該算法可以將對於較大相似度的點,t分布在低維空間中的距離需要稍小一點;而對於低相似度的點,t分布在低維空間中的距離需要更遠。

作者的主頁: 

t-SNE的梯度更新有兩大優勢:

  • 對於不相似的點,用一個較小的距離會產生較大的梯度來讓這些點排斥開來。
  • 這種排斥又不會無限大(梯度中分母),避免不相似的點距離太遠。

主要不足有四個:

  • 主要用於可視化,很難用於其他目的。比如測試集合降維,因為他沒有顯式的預估部分,不能在測試集合直接降維;比如降維到10維,因為t分布偏重長尾,1個自由度的t分布很難保存好局部特征,可能需要設置成更高的自由度。
  • t-SNE傾向於保存局部特征,對於本征維數(intrinsic dimensionality)本身就很高的數據集,是不可能完整的映射到2-3維的空間
  • t-SNE沒有唯一最優解,且沒有預估部分。如果想要做預估,可以考慮降維之后,再構建一個回歸方程之類的模型去做。但是要注意,t-sne中距離本身是沒有意義,都是概率分布問題。
  • 訓練太慢。有很多基於樹的算法在t-sne上做一些改進

2、例1 鳶尾花數據集降維

from sklearn.manifold import TSNE from sklearn.datasets import load_iris from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 加載數據集 iris = load_iris() # 共有150個例子, 數據的類型是numpy.ndarray print(iris.data.shape)#(150,4) # 對應的標簽有0,1,2三種 print(iris.target.shape)#(150,) # 使用TSNE進行降維處理。從4維降至2維。 tsne = TSNE(n_components=2, learning_rate=100).fit_transform(iris.data) # 使用PCA 進行降維處理 pca = PCA().fit_transform(iris.data) # 設置畫布的大小 plt.figure(figsize=(12, 6)) plt.subplot(121) plt.scatter(tsne[:, 0], tsne[:, 1], c=iris.target) plt.subplot(122) plt.scatter(pca[:, 0], pca[:, 1], c=iris.target) plt.colorbar() plt.show()

結果:

3、例2 MINISET數據集降維

import numpy as np

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D 
from sklearn.datasets import load_digits

from sklearn.manifold import TSNE
digits = load_digits(n_class=6)
X = digits.data#1083*64
y = digits.target#1083 max(y)=5

n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):
    ix = 10 * i + 1
    for j in range(n_img_per_row):
        iy = 10 * j + 1
        img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))

#按行放置 取前400個圖片
#img中會有0、10、20列這些沒有,是為了形成空列吧。
plt.imshow(img, cmap=plt.cm.binary)#cmap: 顏色圖譜(colormap), 默認繪制為RGB(A)顏色空間。
plt.title('A selection from the 64-dimensional digits dataset')

import time#需導入包
tsne = TSNE(n_components=3, init='pca', random_state=0)
t0 = time
X_tsne = tsne.fit_transform(X)
def plot_embedding_3d(X, title=None):
    #坐標縮放到[0,1]區間
    x_min, x_max = np.min(X,axis=0), np.max(X,axis=0)
    X = (X - x_min) / (x_max - x_min)
    #降維后的坐標為(X[i, 0], X[i, 1],X[i,2]),在該位置畫出對應的digits
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection='3d')
    for i in range(X.shape[0]):
        ax.text(X[i, 0], X[i, 1], X[i,2],str(digits.target[i]),
                 color=plt.cm.Set1(y[i] / 10.),
                 fontdict={'weight': 'bold', 'size': 9})
    if title is not None:
        plt.title(title)

plot_embedding_3d(X_tsne,"t-SNE 3D " )


import time#需導入包
tsne = TSNE(n_components=2, init='pca', random_state=0)
X_tsne = tsne.fit_transform(X)
plt.scatter(X_tsne[:,0],X_tsne[:,1],c=y)
plt.colorbar()


def plot_embedding(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()
    ax = plt.subplot(111)
    for i in range(data.shape[0]):
        plt.text(data[i, 0], data[i, 1], str(label[i]),
                 color=plt.cm.Set1(label[i] / 10.),
                 fontdict={'weight': 'bold', 'size': 9})
    plt.xticks([])
    plt.yticks([])
    plt.title(title)
    return fig

plot_embedding(X_tsne,y,"t-SNE 2D")

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM