降维可视化(tSNE、UMAP、hypertools等)代码及效果对⽐
在机器学习和深度学习领域,特征往往是⾼维度的,然⽽不幸的是,我们的电脑屏幕是⼆维的,我们的⼈眼也只能观察最多三维,所以必须对特征进⾏降维之后才能可视化。
⼀、准备⼯作:提取MNIST在LeNet5中的特征
⽅法很简单,我们在的代码上修改,我们取出倒数第⼆个全连接层的输出特征,有84维。代码如下,多输出⼀个emb。
def forward(lf, x):
怎么学习英语
x = F.max_v1(x)),(2,2))
x = F.max_v2(x)),(2,2))
x = x.view(-1, lf.num_flat_features(x))
x = F.relu(lf.fc1(x))
emb = F.relu(lf.fc2(x))
x = lf.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.bedding_)
import matplotlib.pyplot as plt
lors 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. ⽤sk lea rn的tS N E法画出M N I S T嵌⼊特征的分布,两次
可以看出,由于随机种⼦的不同,每次画出来的结果不⼀样,每个类别的形态是⼤致⼀样的,但相对位置会有变化,这也说明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. ⽤hy p ertools的各种降维⽅法画出M N I S T嵌⼊特征的分布
美丽中国行 通常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. ⽤hy p ertools的KM ea ns聚类后再⽤T S N E画出M N I S T嵌⼊特征的分布
最后说⼀个⼩细节,注意看图3的各簇中仍有⼀些其他簇的“噪点”,这些噪点应是TSNE分类和KMeans分类的误差造成的,这也说明图2中的噪点也不全是标注错误造成的。