t-sne on Mnist

t

以MNIST为例使用降维投影进行高维数据可视化

问题提出

现在的大多数数据集拥有越来越多的维度,而我们人类无法直观想象高维数据分布情况,也不善于同时处理多维度信息,所以怎样将高维度数据可视化成为了关键。

二、问题定义

高维数据可视化是指使用合适的方法对高维数据进行处理,或者使用合适的展示方式将高维数据以可视化的形式展现,便于我们分析数据中内在的联系。

本文将使用MNIST数据集为例通过降维投影方式进行一些探索。事实上我们已经清楚该数据集分为10类,并且每个数据都有相应的标签,我们期望降维后的数据能体现出良好的聚类表示。

数据来源

MNIST数据集是一个手写数字图片数据集,该数据集共含有70000张图片,每张图片为28*28的灰度像素。我们将28*28=784个灰度像素值视为数据的维度,可视化时随机选取10000张图片以方便呈现。

下图为其中的几张图片:

解决方案

3.1 PCA

主成分分析(PCA)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分。具体地,主成分可以看做一个线性方程,其包含一系列线性系数来指示投影方向。

我们首先使用PCA(使用Scikit-Learn包)将数据降到二维并用散点图表示: 背景图案

描述已自动生成

可以看到这两个维度确实保留了一些信息,特别是对像数字1等某些数字,但是其他数字的分类关系并不明晰。实际上,explained_variance_ratio_变量表明这两个维度大概保留了17%的信息,这显然不足以表示高维数据的关键结构。

3.2 t-SNE

实际上,PCA是一种线性方法,在降维过程中主要保证了不相似的点尽量远离的结构特征. 但是当高维数据处于低维非线性流形上时, 保证相似的点尽量接近更为重要, 而这在线性映射中通过难以做到。

t-SNE 可用于可视化高维数据, 它可以保留高维数据的局部特征, 同时也能揭示数据的整体结构。它的基本原理是:通过仿射变换将数据点映射到概率分布上,主要包括两个步骤:构建一个高维对象之间的概率分布,使得相似的对象有更高的概率被选择,而不相似的对象有较低的概率被选择;在低维空间里在构建这些点的概率分布,使得这两个概率分布之间尽可能的相似。

Scikit-Learn中的TSNE函数推荐维度不要太高,所以我们先使用PCA将维度降至50,50维大概保留了82%的信息,并且可以起到降噪的作用。然后我们的参数设置为perplexity=40, n_iter=300, learning_rate=’auto’,其他都保持为默认。最后得到的效果(和PCA对比):

可以看到,达到了很好的聚类效果,后续可以使用k means等简单的聚类算法即可以完成较好的分类效果。

总结与思考

作为非监督方法,t-SNE在MNIST达到这样的效果超出了我的预期,尽管如此,我们仍然需要注意t-SNE的一些缺点:

  • t-SNE 对超参数很敏感
  • 计算量较大(本文中300步花费了150s,CPU:AMD R5 3600)
  • 高维空间数据的方差不会反映在低维表示中
  • 聚类间的距离没有意义
  • 随机噪声看起来不一定那么随机
  • 有时候会出现一些特殊的形状

代码

zhao/t-sne-on-mnist – t-sne.ipynb at master – t-sne-on-mnist – Gitea: Git with a cup of tea (cybergeek.net.cn)

About the author

Add Comment

By zhao

zhao

Get in touch

Quickly communicate covalent niche markets for maintainable sources. Collaboratively harness resource sucking experiences whereas cost effective meta-services.