降维可视化(tSNE、UMAP、hypertools等)代码及效果对比
??在機器學習和深度學習領域,特征往往是高維度的,然而不幸的是,我們的電腦屏幕是二維的,我們的人眼也只能觀察最多三維,所以必須對特征進行降維之后才能可視化。
一、準備工作:提取MNIST在LeNet5中的特征
??方法很簡單,我們在第一節的代碼上修改,我們取出倒數第二個全連接層的輸出特征,有84維。代碼如下,多輸出一個emb。
def forward(self, x):x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))x = x.view(-1, self.num_flat_features(x))x = F.relu(self.fc1(x))emb = F.relu(self.fc2(x))x = self.fc3(emb)return emb,x??然后用訓練好的模型過一遍數據集,得到數據集所有樣本的嵌入向量embs,同時也收集labels用于后面按類別畫圖:
model.eval() embs = [] labels = [] for data, target in test_loader:data, target = data.cuda(), target.cuda()emb,output = model(data)embs.append(emb.data.cpu().numpy())labels.append(target.data.cpu().numpy()) embs = np.concatenate(embs) labels = np.concatenate(labels)二、使用sklearn中的t-SNE可視化
??使用tSNE可視化不用更改網絡結構,直接對原網絡得到的輸出進行處理即可,sklearn中已經封裝好此功能:
from sklearn.manifold import TSNE tsne = TSNE(n_components=2, learning_rate=200, metric='cosine',n_jobs=-1) tsne.fit_transform(embs) outs_2d = np.array(tsne.embedding_)import matplotlib.pyplot as plt import matplotlib.colors as mcolors css4 = list(mcolors.CSS4_COLORS.keys()) #我選擇了一些較清楚的顏色,更多的類時也能畫清晰 color_ind = [2,7,9,10,11,13,14,16,17,19,20,21,25,28,30,31,32,37,38,40,47,51,55,60,65,82,85,88,106,110,115,118,120,125,131,135,139,142,146,147] css4 = [css4[v] for v in color_ind] for lbi in range(10):temp = outs_2d[labels==lbi]plt.plot(temp[:,0],temp[:,1],'.',color=css4[lbi]) plt.title('feats dimensionality reduction visualization by tSNE,test data')??注意在TSNE的參數中可以指定距離類型metric,默認是euclidean,我這里使用了cosine,還可以是correlation等其他距離。
??可以看出,由于隨機種子的不同,每次畫出來的結果不一樣,每個類別的形態是大致一樣的,但相對位置會有變化,這也說明tSNE在降維的時候能夠保證較近的點的距離關系,但不能保證較遠的點的距離關系,通常也就是類內和類間能夠很好的體現,但類間的距離關系不能體現。比如黑色和紅色的類在第一張圖中很近,但在第二張圖中很遠。或者從另一個角度說,tSNE在降維的同時,也具備一定的分類能力。
三、使用hypertools中的多種降維方法
??hypertools是Kaggle推出的一種降維工具包,集成了多種降維算法,如PCA、TSNE、Isomap、UMAP等。此外還有聚類算法和對齊算法等,用起來更加方便。可以用pip install hypertools安裝。降維和畫圖的核心代碼用一行搞定:
import hypertools as hyp import matplotlib.pyplot as plt hyp.plot(embs,'.',reduce='TSNE',ndims=2,hue=labels) plt.title('TSNE')??注意,這個hyp.plot畫的圖內部也是調用matplotlib.pyplot,所以可以直接混合使用plt的命令實現更多的畫圖功能,如上面的plt.title()。下面給出各種降維方法的效果:
??通常TSNE和UMAP兩種方法可視化效果較好,其他的如PCA更多的保留了樣本間距離信息的比例關系,反而看起來各類分的不是那么開,而UMAP則更極端一些,它把各類間區分的相當開。
使用hypertools也可以實現聚類,帶的聚類算法有K-Means, AgglomerativeClustering, Birch, FeatureAgglomeration, SpectralClustering這幾種。如果沒有labels信息,可以先聚類,用聚類結果代替labels畫出各簇的圖:
??最后說一個小細節,注意看圖3的各簇中仍有一些其他簇的“噪點”,這些噪點應是TSNE分類和KMeans分類的誤差造成的,這也說明圖2中的噪點也不全是標注錯誤造成的。
總結
以上是生活随笔為你收集整理的降维可视化(tSNE、UMAP、hypertools等)代码及效果对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打开火狐浏览器之后主页自动跳转到2345
- 下一篇: qt 获得系统输入法列表_2020法考主