日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

降维可视化(tSNE、UMAP、hypertools等)代码及效果对比

發布時間:2024/1/1 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 降维可视化(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等其他距離。

圖1. 用sklearn的tSNE法畫出MNIST嵌入特征的分布,兩次

??可以看出,由于隨機種子的不同,每次畫出來的結果不一樣,每個類別的形態是大致一樣的,但相對位置會有變化,這也說明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()。下面給出各種降維方法的效果:

圖2. 用hypertools的各種降維方法畫出MNIST嵌入特征的分布

??通常TSNE和UMAP兩種方法可視化效果較好,其他的如PCA更多的保留了樣本間距離信息的比例關系,反而看起來各類分的不是那么開,而UMAP則更極端一些,它把各類間區分的相當開。
使用hypertools也可以實現聚類,帶的聚類算法有K-Means, AgglomerativeClustering, Birch, FeatureAgglomeration, SpectralClustering這幾種。如果沒有labels信息,可以先聚類,用聚類結果代替labels畫出各簇的圖:

clust = hyp.cluster(embs, cluster='KMeans',n_clusters = 10) hyp.plot(embs,'.',reduce='TSNE',ndims=2,hue=clust) plt.title('TSNE, clutering by KMeans')

圖3. 用hypertools的KMeans聚類后再用TSNE畫出MNIST嵌入特征的分布

??最后說一個小細節,注意看圖3的各簇中仍有一些其他簇的“噪點”,這些噪點應是TSNE分類和KMeans分類的誤差造成的,這也說明圖2中的噪點也不全是標注錯誤造成的。

總結

以上是生活随笔為你收集整理的降维可视化(tSNE、UMAP、hypertools等)代码及效果对比的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。