拜讀了這位大神的筆記,有些一開始不太明白的地方,寫個筆記記下來。
1.1基本原理
sne是通過仿射(affinitie)變換將資料點對映到概率分布上,主要包括兩個步驟:
sne構建乙個高維物件之間的概率分布,使得相似的物件有更高的概率被選擇,而不相似的物件有較低的概率被選擇。
sne在低維空間裡在構建這些點的概率分布,使得這兩個概率分布之間盡可能的相似。
我們看到t-sne模型是非監督的降維,他跟kmeans等不同,他不能通過訓練得到一些東西之後再用於其它資料(比如kmeans可以通過訓練得到k個點,再用於其它資料集,而t-sne只能單獨的對資料做操作,也就是說他只有fit_transform,而沒有fit操作)
sne在低維空間裡在構建這些點的概率分布,這句話什麼意思呢?
然後我在二維或者三維空間隨機撒n個點,這些點也可以表示成距離和相似度矩陣。好吧,這裡有兩個矩陣了,也就是兩個概率分布,我們要做的就是盡可能的使得,低維度空間中的概率分布去接近高維度的概率分布,所以自然就想到了kl距離。讓兩個分布的kl距離盡快能的小,去優化這個目標,要用到梯度下降,從**的角度來說開始是一些隨機的點,然後經過多次迭代,原空間近的點低維空間也近,原空間遠的點低維空間也遠,當然這是最理想的結果。sne已經能夠取得不錯的效果。
1.2 sne原理推導
sne是先將歐幾里得距離轉換為條件概率來表達點與點之間的相似度。具體來說,給定乙個m個高維的資料 x1
,...
,xm , t-sne首先是計算概率pi
j ,正比於xi
和xj 之間的相似度(這種概率是我們自主構建的),即: p(
j/i)
=exp
(−∣∣x
i−xj
∣∣2/
(2σ2
i))∑
k≠ie
xp(−
∣∣xi−
xk∣∣
2/(2
σ2i)
) 這裡的有乙個引數是σi
,對於不同的點xi
取值不一樣,後續會討論如何設定。此外設定px
∣x=0
,因為我們關注的是兩兩之間的相似度。
那對於低維度下的yi
(最開始我們隨機撒n個點,然後通過梯度下降的方法調整他們的座標,經過若干次迭代,得到乙個降維視覺化的結果),我們可以指定高斯分布為方差為12
√ ,因此它們之間的相似度如下:**
∣i=e
xp(−
∣∣yi−
yj∣∣
2)∑k
≠iex
p(−∣∣
yi−y
k∣∣2
) 同樣,設定qi
∣i=0
如果降維的效果比較好,區域性特徵保留完整,那麼pi
∣j=q
i∣j , 因此我們優化兩個分布之間的距離-kl散度(kullback-leibler divergences),那麼目標函式(cost function)如下: c=
∑ikl
(pi∣∣
qi)=
∑i∑j
pj∣i
logp
j∣iq
j∣i
總的來說sne的思想是,我們有高維空間n個點的向量表示,然後計算出點之間兩兩的距離,也就是相似度,距離越小越相似。也就是乙個n*n的對稱矩陣。
然後我們在低維(2,3)空間隨機初始化n個點,這n個點之間的距離也是乙個n*n的矩陣,也表示點在低維空間的相似度,距離。
最後我們要優化的就是使得這兩個分布(使用高斯分布將距離轉換為概率分布)的kl距離越小越好,也就是這兩個分布越接近越好。
然後每次迭代計算出梯度,更新這些點在低維空間的位置。
而t-sne就是把距離轉換為概率分布的時候用t分布,長尾分布。
它的好處就是
t-sne的梯度更新有兩大優勢:
對於不相似的點,用乙個較小的距離會產生較大的梯度來讓這些點排斥開來。
這種排斥又不會無限大(梯度中分母),避免不相似的點距離太遠。
參考自:
機器學習 t SNE演算法原理
目錄 1.sen原理 2 t sen 2.1 symmetric sne 2.2 crowing 問題 2.3 t sne 2.4 演算法過程 2.5 不足 基本原理 是通放射變換 將資料點對映到概率分布上,分為兩個步驟 t sne是非監督的降維,跟kmeans 等不同,他不能通過訓練得到一些東西後...
Python學習 TSNE視覺化
from sklearn.manifold import tsne tsne tsne tsne.fit transform data zs 進行資料降維 tsne pd.dataframe tsne.embedding index data zs.index 轉換資料格式 import matpl...
python用tsne降維 tSNE降維
我有兩套資料訓練和測試。這兩個資料集分別有30213和30235個專案,每個專案有66個維度。在 我正在嘗試應用scikit learn的t sne將維數降到2。由於資料集很大,如果我試圖一次性處理整個資料,我會遇到記憶體錯誤,我會嘗試將它們分成塊,然後一次轉換乙個塊,如下所示 tsne manif...