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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/1/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 降维可视化(tSNE、UMAP、hypertools等)代码及效果对比 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域,特征往往是高維度的,然而不幸的是,我們的電腦屏幕是二維的,我們的人眼也只能觀察最多三維,所以必須對(duì)特征進(jìn)行降維之后才能可視化。

一、準(zhǔn)備工作:提取MNIST在LeNet5中的特征

??方法很簡(jiǎn)單,我們?cè)诘谝还?jié)的代碼上修改,我們?nèi)〕龅箶?shù)第二個(gè)全連接層的輸出特征,有84維。代碼如下,多輸出一個(gè)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

??然后用訓(xùn)練好的模型過(guò)一遍數(shù)據(jù)集,得到數(shù)據(jù)集所有樣本的嵌入向量embs,同時(shí)也收集labels用于后面按類別畫(huà)圖:

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可視化不用更改網(wǎng)絡(luò)結(jié)構(gòu),直接對(duì)原網(wǎng)絡(luò)得到的輸出進(jìn)行處理即可,sklearn中已經(jīng)封裝好此功能:

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()) #我選擇了一些較清楚的顏色,更多的類時(shí)也能畫(huà)清晰 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的參數(shù)中可以指定距離類型metric,默認(rèn)是euclidean,我這里使用了cosine,還可以是correlation等其他距離。

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

??可以看出,由于隨機(jī)種子的不同,每次畫(huà)出來(lái)的結(jié)果不一樣,每個(gè)類別的形態(tài)是大致一樣的,但相對(duì)位置會(huì)有變化,這也說(shuō)明tSNE在降維的時(shí)候能夠保證較近的點(diǎn)的距離關(guān)系,但不能保證較遠(yuǎn)的點(diǎn)的距離關(guān)系,通常也就是類內(nèi)和類間能夠很好的體現(xiàn),但類間的距離關(guān)系不能體現(xiàn)。比如黑色和紅色的類在第一張圖中很近,但在第二張圖中很遠(yuǎn)。或者從另一個(gè)角度說(shuō),tSNE在降維的同時(shí),也具備一定的分類能力。

三、使用hypertools中的多種降維方法

??hypertools是Kaggle推出的一種降維工具包,集成了多種降維算法,如PCA、TSNE、Isomap、UMAP等。此外還有聚類算法和對(duì)齊算法等,用起來(lái)更加方便。可以用pip install hypertools安裝。降維和畫(huà)圖的核心代碼用一行搞定:

import hypertools as hyp import matplotlib.pyplot as plt hyp.plot(embs,'.',reduce='TSNE',ndims=2,hue=labels) plt.title('TSNE')

??注意,這個(gè)hyp.plot畫(huà)的圖內(nèi)部也是調(diào)用matplotlib.pyplot,所以可以直接混合使用plt的命令實(shí)現(xiàn)更多的畫(huà)圖功能,如上面的plt.title()。下面給出各種降維方法的效果:

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

??通常TSNE和UMAP兩種方法可視化效果較好,其他的如PCA更多的保留了樣本間距離信息的比例關(guān)系,反而看起來(lái)各類分的不是那么開(kāi),而UMAP則更極端一些,它把各類間區(qū)分的相當(dāng)開(kāi)。
使用hypertools也可以實(shí)現(xiàn)聚類,帶的聚類算法有K-Means, AgglomerativeClustering, Birch, FeatureAgglomeration, SpectralClustering這幾種。如果沒(méi)有l(wèi)abels信息,可以先聚類,用聚類結(jié)果代替labels畫(huà)出各簇的圖:

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畫(huà)出MNIST嵌入特征的分布

??最后說(shuō)一個(gè)小細(xì)節(jié),注意看圖3的各簇中仍有一些其他簇的“噪點(diǎn)”,這些噪點(diǎn)應(yīng)是TSNE分類和KMeans分類的誤差造成的,這也說(shuō)明圖2中的噪點(diǎn)也不全是標(biāo)注錯(cuò)誤造成的。

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。