最近接触了一个特别好用的看数据分布的可视化降维的方法——tSNE,但是也在这个坑里挣扎了非常久的时间,血与泪的经验是这是一个可视化的工具,只是一个可视化的工具,重要的还是数据和算法!!!现在准备收拾收拾暂时出坑了(说这句话的时候脑海里突然浮现出了《爱与不爱之间》,大家可以自行google或者百度或者脑补),把一些记录分享给大家。
00 写在最前面:什么是tSNE?
tSNE是由t和SNE组成(就是这么粗暴的解释),也就是T分布和随机近邻嵌入(Stochastic neighbour Embedding ),可以将数据间的相似性转化为概率, 是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出,是一个非常好用的可视化的降维的工具,可以将数据从高维降维到2-3维,然后利用这2-3维的数据就可以画成图(可以假设我们取0维的做为x轴,1维做y轴,就有了二维的图像,同理也可以画成三维的图像)。想了解更多的小伙伴可以去围观以下两篇博客,都是大佬的原创或者转载:
数据降维与可视化——t-SNE:这一篇可以参考参数设置和解释;
tSNE:这一篇有兴趣的伙伴可以看一下具体的原理分析,但是代码实现有些复杂;
01 举个栗子:tSNE的Python实现
我们拿HCL2000的部分手写汉字数据集做一个简单的tSNE的实现,语言是基于Python写的。
先给大家看一下数据,随机挑选了10个汉字,每个汉字有100个样本,共有1000个数据样本。
我们来coding一下代码,阿哈哈哈哈哈,其实非常简单。
# 选取模型,打印出模型的各层,对数据进行特征提取,例如下可得shape=(1,1,2048)的特征向量
resnet_model = resnet50.ResNet50(weights='resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5', include_top=False)
print(resnet_model.summary())
# 我们建一个新的模型,定义新模型的输入、输出
model_new = Model(inputs=resnet_model.input, outputs=resnet_model.get_layer('add_16').output)
# 载入要输入的数据,shape=(1000,28,28,3)
data = load('tSNE_10class_data.npz')
shape = data.shape
print(shape, data[0].shape, data[-1])
# 将每一个样本数据输入模型进行预测,得到shape=(1000,1,1,2048)的预测结果
preds = np.zeros(shape=(1000,1,1,2048)