TSNE 高维数据可视化

TSNE 高维数据可视化

标签: python 机器学习 神经网络


在神经网络中,我们最后一层一般都是高纬度的数据,但是有时候我们可能想看一下这些高纬度数据的分布情况,这个时候就需要用TSNE,其实TSNE本质上就是先利用PCA降维,比如降到二维或者三维,做法就是把神经网络某层的特征降维,然后映射到二维或者三维空间可视化。这样就能看到各层特征分布情况。

TSNE降维

from sklearn.manifold import TSNE
tsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000) # TSNE降维,降到2
# 只需要显示前500个
plot_only = 500
# 降维后的数据
low_dim_embs = tsne.fit_transform(last_layer.data.numpy()[:plot_only, :])
# 标签
labels = by.numpy()[:plot_only]
plot_with_labels(low_dim_embs, labels,"epoch{}_step{}".format(e,step))

这里用的数据是之前pytroch进行mnist中的,last_layer代表最后一层特征,这里降到了2维,by代表一个批次的y,为了后面可视化可以区分,plot_with_labels是一个自定义方法,用来可视化降维后的数据。

可视化


from matplotlib import cm
def plot_with_labels(lowDWeights, labels,i):
    plt.cla()
    # 降到二维了,分别给x和y
    X, Y = lowDWeights[:, 0], lowDWeights[:, 1]
    # 遍历每个点以及对应标签
    for x, y, s in zip(X, Y, labels):
        c = cm.rainbow(int(255/9 * s)) # 为了使得颜色有区分度,把0-255颜色区间分为9分,然后把标签映射到一个区间
        plt.text(x, y, s, backgroundcolor=c, fontsize=9)
    plt.xlim(X.min(), X.max())
    plt.ylim(Y.min(), Y.max()); plt.title('Visualize last layer')

    plt.savefig("{}.jpg".format(i))

可视化就是把前面降维过的数据画到二维空间,这里的关键点在于同一类别的用同种颜色画,体现在代码c = cm.rainbow(int(255/9 * s))以及backgroundcolor=c上面,这样的话如果两个点的标签同,那么绘制的颜色也是一样的。

下图是一个epoch后的分布情况可以看出数据已经很有区分性了:

在这里插入图片描述


版权声明:本文为qq_28888837原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。