Python

具有混合連續變量和二元變量的 t-SNE

  • April 3, 2019

我目前正在研究使用 t-SNE 對高維數據進行可視化。我有一些混合了二進制和連續變量的數據,這些數據似乎很容易對二進制數據進行聚類。當然,這對於縮放(0 到 1 之間)數據是預期的:歐幾里得距離在二元變量之間總是最大/最小。應該如何使用 t-SNE 處理混合的二進制/連續數據集?我們應該刪除二進制列嗎?它有不同的metric我們可以使用嗎?

作為一個例子,考慮這個 python 代碼:

x1 = np.random.rand(200)
x2 = np.random.rand(200)
x3 = np.r_[np.ones(100), np.zeros(100)]

X = np.c_[x1, x2, x3]

# plot of the original data
plt.scatter(x1, x2, c=x3)
# … format graph

所以我的原始數據是:

原始數據

其中顏色是第三個特徵 (x3) 的值 - 在 3D 中,數據點位於兩個平面中(x3=0 平面和 x3=1 平面)。

然後我執行 t-SNE:

tsne = TSNE() # sci-kit learn implementation
X_transformed = StandardScaler().fit_transform(X)
tsne = TSNE(n_components=2, perplexity=5)
X_embedded = tsne.fit_transform(X_transformed)

結果圖:

tsne_data

並且數據當然由 x3 聚集。我的直覺是,由於二進制特徵的距離度量沒有很好地定義,我們應該在執行任何 t-SNE 之前放棄它們,這將是一種恥辱,因為這些特徵可能包含用於生成集群的有用信息。

免責聲明:我對該主題只有切線知識,但由於沒有其他人回答,我會嘗試一下

距離很重要

任何基於距離的降維技術(tSNE、UMAP、MDS、PCoA 和可能的其他)都只能與您使用的距離度量一樣好。正如@amoeba 正確指出的那樣,不可能有一個萬能的解決方案,您需要有一個距離度量來捕捉您認為數據中重要的內容,即您認為相似的行具有較小的距離和行您會考慮不同有很大的距離。

你如何選擇一個好的距離度量?首先,讓我做一點轉移:

按立

早在現代機器學習的光輝歲月之前,社區生態學家(很可能還有其他人)已經嘗試為多維數據的探索性分析繪製漂亮的圖。他們稱之為過程協調,它是一個有用的關鍵詞,可以在生態學文獻中搜索,至少可以追溯到 70 年代,並且在今天仍然很強大。

重要的是生態學家擁有非常多樣化的數據集並處理二進制、整數和實值特徵的混合(例如物種的存在/不存在、觀察到的標本數量、pH、溫度)。他們花了很多時間思考距離和變換,以使出家工作順利進行。我不太了解該領域,但例如 Legendre 和 De Cáceres Beta 多樣性作為社區數據的方差的評論:不相似係數和分區顯示了您可能想要檢查的大量可能距離。

多維縮放

排序的首選工具是多維縮放 (MDS),尤其是非度量變體 (NMDS),我鼓勵您在 t-SNE 之外嘗試。我不了解 Python 世界,但是包metaMDS函數中的 R 實現vegan為您做了很多技巧(例如,運行多次運行,直到找到兩個相似的)。

這一直存在爭議,請參閱評論: MDS 的優點在於它還可以投影特徵(列),因此您可以看到哪些特徵推動了降維。這有助於您解釋數據。

請記住,t-SNE 一直被批評為一種獲得理解的工具,例如對其陷阱的探索——我聽說 UMAP 解決了一些問題,但我沒有使用 UMAP 的經驗。我也不懷疑生態學家使用 NMDS 的部分原因是文化和慣性,也許 UMAP 或 t-SNE 實際上更好。老實說,我不知道。

拉開自己的距離

如果您了解數據的結構,那麼現成的距離和轉換可能不適合您,您可能希望構建自定義距離度量。雖然我不知道您的數據代表什麼,但為實值變量(例如,如果有意義,則使用歐幾里德距離)和二進制變量分別計算距離並添加它們可能是明智的。二進制數據的常見距離是例如Jaccard 距離Cosine 距離。您可能需要考慮距離的一些乘法係數,因為 Jaccard 和 Cosine 都有 $ [0,1] $ 與特徵數量無關,而歐幾里得距離的大小反映了特徵的數量。

一個警告

始終要記住,由於要調整的旋鈕太多,因此很容易陷入調整的陷阱,直到看到自己想看到的為止。這在探索性分析中很難完全避免,但您應該謹慎。

引用自:https://stats.stackexchange.com/questions/400995

comments powered by Disqus