t-SNE常用于将数据降维后可视化,直观地看出数据的分布情况。关于t-SNE的详细介绍见t-SNE:最好的降维方法之一 - 知乎 (zhihu.com)
本文介绍t-SNE的python实现。
# 固定随机种子会用到的包
import random
import numpy as np
import torch
# 使用TSNE函数比调用的包
from sklearn.manifold import TSNE
import seaborn as sns
# -----------数据获取-----------------
# x是需要降维的数据,通常是神经网络的高层特征(全连接层的输出)
# x为二维,如x.size()=[400,769],表示400个样本,每个样本特征的维度是1×769
X = x.cpu().numpy() # 将特征转换为numpy形式,因为高层特征通常为tensor
# 归一化
max_ = np.max(X)
min_ = np.min(X)
X = (X - min_)/(max_ - min_)
# y为样本标签,也是二维,标签可以是数字也可以是字符串
Y = np.array(y) # Y.shape=(400,1)
# ------------t-SNE可视化-------------
RS = 20 # 初始阶段参数
# 根据标签设置标记形状,以手写体数字识别任务为例,标签有0-9共10类,则:
Mark = {0:"X",1:"o",2:"X",3:"o",4:"X",5:"o",6:"X",7:"o"} # o和x分别为不同形状
# Mark = {'src1_pos':"X",'src1_neg':"o",'src2_pos':"X",'src2_neg':"o",'src3_pos':"X",'src3_neg':"o",'tgt_pos':"X",'tgt_neg':"o"} # 举例,标签为字符串时
sns.set(rc={'figure.figsize':(8,6)}) # 设置图片尺寸
palette = sns.color_palette("bright", 8)
tsne = TSNE(n_components=2,random_state=RS,perplexity=perplexity,early_exaggeration=early_exaggeration,n_iter=n_iter)
X_embedded = tsne.fit_transform(X) # X_embedded = (,2)
fig = sns.scatterplot(x=X_embedded[:,0], y=X_embedded[:,1], hue=Y,style=Y,legend='full', palette=palette, markers=Mark)
scatter_fig = fig.get_figure() # 获取散点图
savepath = '/data1/code/xxx.png'
scatter_fig.savefig(savepath, dpi = 200) # 每英寸点数(dots per inch)
t-SNE的参数详解见t-SNE高维数据可视化(python)_t-sne可视化python_haoji007的博客-CSDN博客