【Python代碼】TSNE高維數據降維可視化工具 + python實現


1.概述

1.1 什么是TSNE

  • TSNE是由T和SNE組成,T分布和隨機近鄰嵌入(Stochastic neighbor Embedding).
  • TSNE是一種可視化工具,將高位數據降到2-3維,然后畫成圖。
  • t-SNE是目前效果最好的數據降維和可視化方法
  • t-SNE的缺點是:占用內存大,運行時間長。

1.2 TSNE原理

1.2.1入門的原理介紹

舉一個例子,這是一個將二維數據降成一維的任務。我們要怎么實現?


首先,我們想到的最簡單的方法就是舍棄一個維度的特征,將所有點映射到x軸上:

很明顯,結果來看,藍色和黃色的點交疊在一起,可是他們在二維上明明不屬於一類


TSNE就是計算某一個點到其他所有點的距離,然后映射到t分布上,效果就會好一些。

1.2.2進階的原理介紹

  • t-SNE的降維關鍵:把高緯度的數據點之間的距離轉化為高斯分布概率

1.2.2.1 高維距離表示

  • 如果兩個點在高維空間距離越近,那么這個概率值越大。
  • 我們來看下面公式,兩個公式的內容一致,只是寫法不同。

\[P_{j|i} = \frac{e^{\frac{-||x_i-x_j||^2}{2\sigma_i^2}}}{\sum_{i\not=k}e^{\frac{-||x_i-x_k||^2}{2\sigma_i^2}}} \]

這個形式的公式,只是明顯的展示這是高斯分布概率


\[P_{j|i} = \frac{exp(-||x_i-x_k||^2/(2\sigma_i^2))}{\sum_{i\not=k}exp(-||x_i-x_k||^2/(2\sigma_i^2))} \]

\(||x_i-x_k||^2\)是兩個點之間的距離;
距離越大,\(exp(-||x_i-x_k||^2/(2\sigma_i^2))\)越小;
距離越小,\(exp(-||x_i-x_k||^2/(2\sigma_i^2))\)越大;
分母是一個常數,對於一個固定的點\(x_i\);


  • 這個算法的創新點\(\sigma_i\)對於每一個\(x_i\)都是不同的,是由事先設定的困惑性影響,\(\sigma_i\)是自動設定的。

現在我們能得到\(p_{j|i}\),然后計算聯合分布

\[P_{ij} = \frac{P_{j|i}+P_{i|j}}{2N} \]


  • 從上文中,我們用高斯分布概率來表示兩個高維點之間的相似性,再次復述一次兩個點越相似,\(p_{ij}\)越大

1.2.2.2 低維相似度表示

  • 在低緯度中,我們使用t分布來表示相似性。這里不探究為什么使用t分布而不是其他分布,具體內容可以看論文

\[Q_{ij} = \frac{(1+||y_i-y_j||^2)^{-1}}{\sum_{k\not=l}(1+||y_k-y_l||^2)^{-1}} \]

\(y_i,y_j\)是低緯度的點


1.2.2.3 懲罰函數

  • 現在我們有方法衡量高緯度和低緯度的點的相似性,我們如何保證高緯度相似度高的點在低緯度相似度也高?
  • t-SNE使用的是KL散度(Kullback-Leibler divergence)

\[KL(P|Q) = \sum_{i\not=j}P_{ij}\log\frac{P_{ij}}{Q_{ij}} \]

1.2.2.4 為什么是局部相似性

  • \(P_{ij}\)很大,\(Q_{ij}\)很小(高維空間距離近,低維空間距離遠)的懲罰很大,但是高維空間距離遠,低維空間距離近的懲罰小。

1.2.2.5 為什么選擇高斯和t分布

  • 降維必然帶來信息損失,TSNE保留局部信息必然犧牲全局信息,而因為t分布比 高斯分布更加長尾,可以一定程度減少這種損失。

2 python實現

函數參數表:

  • parameters 描述
  • n_components 嵌入空間的維度
  • perpexity 混亂度,表示t-SNE優化過程中考慮鄰近點的多少,默認為30,建議取值在5到50之間
  • early_exaggeration 表示嵌入空間簇間距的大小,默認為12,該值越大,可視化后的簇間距越大
  • learning_rate 學習率,表示梯度下降的快慢,默認為200,建議取值在10到1000之間
  • n_iter 迭代次數,默認為1000,自定義設置時應保證大於250
  • min_grad_norm 如果梯度小於該值,則停止優化。默認為1e-7
  • metric 表示向量間距離度量的方式,默認是歐氏距離。如果是precomputed,則輸入X是計算好的距離矩陣。也可以是自定義的距離度量函數。
  • init 初始化,默認為random。取值為random為隨機初始化,取值為pca為利用PCA進行初始化(常用),取值為numpy數組時必須shape=(n_samples, n_components)
  • verbose 是否打印優化信息,取值0或1,默認為0=>不打印信息。打印的信息為:近鄰點數量、耗時、σ
    、KL散度、誤差等
  • random_state 隨機數種子,整數或RandomState對象
  • method 兩種優化方法:barnets_hut和exact。第一種耗時O(NlogN),第二種耗時O(N^2)但是誤差小,同時第二種方法不能用於百萬級樣本
  • angle 當method=barnets_hut時,該參數有用,用於均衡效率與誤差,默認值為0.5,該值越大,效率越高&誤差越大,否則反之。當該值在0.2-0.8之間時,無變化。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold,datsets
'''X是特征,不包含target;X_tsne是已經降維之后的特征'''
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501)
X_tsne = tsne.fit_transform(X)
print("Org data dimension is {}. 
      Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))
      
  '''嵌入空間可視化'''
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min)  # 歸一化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
    plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]), 
             fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.show()

參考內容

  1. sklearn中tsne可視化
  2. 筆記 | 什么是TSNE
  3. 理解TSNE算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM