数据可视化

经常看到网上一些样本分布图画的非常漂亮,不知道是怎么画出来的,在网上找到了一个好资料http://colah.github.io/posts/2014-10-Visualizing-MNIST/#raw_mnist,代码参考的这个https://www.oreilly.com/learning/an-illustrated-introduction-to-the-t-sne-algorithm研究了一番总结一下。

我们经常要分析一些高维特征的表现能力,由于我们人类只能理解二维、三维的东西,所以要把高维数据降到三维以内展示出来。

直观想法

最直观的想法,比如原数据有1000维,从中任意选择两维,然后画图,结果可想而知。

PCA

一种改进办法就是选择更为合适的两个维度进行展示,于是选择PCA主成分分析,然后选择前两个主成分对应的维度作为可视化的两个维度。

降维优化算法

可视化的目标就是希望两个向量实际的距离能够跟显示的距离接近,本来向量距离远的显示的距离也远。这就变成了一个优化问题,这也是很多流形学习方法的目标。比较常用解决这个优化问题的方法有MDS和t-SNE

MDS

结合代码分析,首先,加载必要模块

from sklearn import manifold
import matplotlib.pyplot as plt
import seaborn
import numpy as np

首先加载数据,用array存储数据以及对应标签。这里用scikit-learn中的digits手写字符数据集作为演示数据,加载之后,其data维度为179764,图片是88=64,target维度为1797*1,为0~9的整数。同时加载seaborn模块中的调色板,用这个模板生成的颜色比自己设计的要好看一些

from sklearn.datasets import load_digits
digits = load_digits()
palette = np.array(seaborn.color_palette('hls', 10))
x = digits.data
y = digits.target

加载mds模型

mds = manifold.MDS(n_components=2, max_iter=300, eps=1e-5)
x_mds = mds.fit_transform(x)

画图

fig = plt.figure()
plt.scatter(x_mds[:,0], x_mds[:,1], c=palette[y])
plt.show()

t-SNE

加载数据与上一种方法相同,加载模型代码如下

tsne = manifold.TSNE(n_components=2, learning_rate=1000.0)
x_tsne = tsne.fit_transform(x)

显示动态流形变化图像

TBD

可视化参考资料

how to use t-SNE effectively中文翻译