關於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過程的動態圖如下:
我們可以使用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()