2017-05-04 582 views
2
from sklearn.manifold import TSNE 
tsne = TSNE(n_components=2, init='pca', n_iter=5000) 

print(tsne.fit_transform(np.array([[1,2,3],[3,4,3],[1,2,3],[3,3,3]]))) 

輸出:爲什麼sklearn.manifold中的TSNE對同樣的值給出不同的答案?

[[ 547.9452404 11.31943926] 
[-152.33035505 -223.32060683] 
[ 97.57201578 84.04839505] 
[-407.18939464 124.50285141]] 

對於矢量[1,2,3],其被重複兩次它給了不同的值/載體。

這是爲什麼?

EDIT1:

上面給出的例子僅僅是一個玩具爲例,說明這一事實。其實我的數據是形狀不規則的陣列(500,100)。仍然存在同樣的問題。

回答

2

這是一個有趣的問題。 TSNE將樣本轉換爲保留它們之間距離的不同空間,但不保證保留數據樣本的值。它將每個樣本視爲一個不同的點,並嘗試將該點與另一個樣本之間的距離映射到另一個空間。這沒有考慮樣本的,只是它與其他點的相對距離。

您可以檢查:

>>> a = np.array([[1,2,3],[3,4,3],[1,2,3],[3,3,3]]) 
>>> b = TSNE(n_components=2) 
>>> from sklearn.metrics import euclidean_distances 
>>> print(euclidean_distances(b[0], b).sum()) 
2498.7985853798709 
>>> print(euclidean_distances(b[2], b).sum()) 
2475.26750924 
>>> print(b) 
[[-201.41082311 361.14132525] 
[-600.23416334 -523.48599925] 
[ 180.07532649 -288.01414955] 
[ 553.42486539 538.85793453]] 

它大致保留了兩個樣本,以每隔一個採樣相似的距離(考慮規模),但具有不同的他們交涉。

關於爲什麼它的工作只有4個樣本,我的猜測是,你只有4個樣本和3個維度。 TSNE無法通過如此少的樣本推斷出正確的映射。假定使用高維數據(及其多個樣本)。

對於較低維的數據,我會說一個簡單的PCA可以完成這項工作。 PCA您的數據並保持前2個維度。

+0

嘿Imanol,感謝您的解釋。這個問題給出的例子就是一個玩具的例子來說明這個事實。其實我的數據是形狀不規則的陣列(500,100)。仍然存在同樣的問題。問候 – Abhishek

+0

是*問題*不是問題。 TSNE不保留數據的價值,它只是保留了距離。例如,在1D中,如果有兩個點'A = x'和'B = 0',則有兩個表示A(x和-x)的表示,它們保持與B相同的距離。TSNE不保證所有實例的表示都相同對於一個N維問題,不同的可能表示呈指數增長。 –

相關問題