【機器學習】關於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分佈替代高斯分佈表達兩點之間的相似度

具體的算法解釋和推導可以關注這篇博文 http://www.datakit.cn/blog/2017/02/05/t_sne_full.html

優化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() 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章