降维可视化(tSNE、UMAP、hypertools等)代码及效果对比
??在機(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等其他距離。
??可以看出,由于隨機(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()。下面給出各種降維方法的效果:
??通常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à)出各簇的圖:
??最后說(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)題。
- 上一篇: 打开火狐浏览器之后主页自动跳转到2345
- 下一篇: 计算机实训基地运行与管理,计算机实训基地