1. 程式人生 > >【機器學習】關於t-sne:降維、視覺化

【機器學習】關於t-sne:降維、視覺化

關於t-sne:降維、視覺化

機器學習中,我們的使用的資料基本都是高維的,所以我們很難直接從資料中觀察分佈和特徵。因此出現了很多資料降維的手段幫助我們提取特徵和視覺化資料。這就是流行學習方法(Manifold Learning):假設資料是均勻取樣於一個高維歐氏空間中的低維流形,流形學習就是從高維取樣資料中恢復低維流形結構,即找到高維空間中的低維流形,並求出相應的嵌入對映,以實現維數約簡或者資料視覺化。它是從觀測到的現象中去尋找事物的本質,找到產生資料的內在規律。

有張圖可以比較好的理解下降維的方法。
資料降維分支

PCA曾經廣泛用於提取特徵,由於其是線性降維,所以不能解釋特徵之間的複雜多項式關係,而且也已經過於古老。而上圖中沒有提及的t-sne屬於非線性方法,是由Hinton和lvdmaaten在2008年提出的。關於降維的資料作為feature是否更優還不能確定,但是其視覺化效果非常好。由於t-sne執行速度非常慢,比pca高了一個數量級,因此在視覺化資料的時候一般先用pca處理,然後再用tsne處理。

t-sne是由sne發展而來,SNE是通過仿射(affinitie)變換將資料點對映到概率分佈上,主要包括兩個步驟:

  • SNE構建一個高維物件之間的概率分佈,使得相似的物件有更高的概率被選擇,而不相似的物件有較低的概率被選擇。
  • SNE在低維空間裡在構建這些點的概率分佈,使得這兩個概率分佈之間儘可能的相似

儘管SNE提供了很好的視覺化方法,但是他很難優化,而且存在”crowding problem”(擁擠問題)。後續中,Hinton等人又提出了t-SNE的方法。與SNE不同,主要如下:

  • 使用對稱版的SNE,簡化梯度公式
  • 低維空間下,使用t分佈替代高斯分佈表達兩點之間的相似度

優化mnist過程的動態圖如下:t-sne

我們可以使用python得sklearn包來體驗一下tsne,非常簡單。

#import 相關的包和mnist資料集
import numpy as np
import matplotlib.pyplot as plt
from time import time
from sklearn import datasets, manifold

#定義函式將結果plot出來                            
def plot_embedding(X, title=None):     
    x_min, x_max = np.min(X, 0), np.max(X, 0
) X = (X - x_min) / (x_max - x_min) plt.figure() ax = plt.subplot(111) for i in range(X.shape[0]): plt.text(X[i, 0], X[i, 1], str(digits.target[i]), color=plt.cm.Set1(y[i] / 10.), fontdict={'weight': 'bold', 'size': 9}) plt.xticks([]), plt.yticks([]) if title is not None: plt.title(title) # 呼叫t-SNE print("Computing t-SNE embedding") tsne = manifold.TSNE(n_components=2, init='pca', random_state=0) t0 = time() X_tsne = tsne.fit_transform(X) plot_embedding(X_tsne, "t-SNE embedding of the digits (time %.2fs)" % (time() - t0)) plt.show()