R语言中的深度学习Minst数据集下的聚类分析

本文为巡洋舰的深度学习实战课程 预科准备。

说到深度学习,想到的都是python中的框架,例如tensorflow。然而R语言作为另一种数据科学家常用的工具,也不会缺席深度学习的盛宴的。今天为大家介绍一个来自R语言的包(package),名叫h2o,相比tensorflow,他的功能虽然不够强大,可能无法实现CNN,RNN这种特殊的结构,但却可以满足日常数据分析和建模的应用。

这个包的安装简单,只需一行命令就可以搞定,不管是在notebook中,还是R的自带的运行坏境,只要输入install.package(“h2o”), 然后选择相应的镜像服务器,就可以安装完成了。h2o这个包功能强大,不止包含深度学习的模型,还包括工程界流行树模型,例如xgBoost,随机森林等,还包括自然语言处理中的word2vec,由于这个包是由由java实现底层代码的,其运算速度相对较快。

而h2o这个包中和深度学习有关的函数是deeplearning这个函数,这个函数既可以用来训练常见的分类模型,用来做有监督学习;也可以用来做无监督学习,对数据进行聚类。而对于用深度学习的模型来进行聚类,则是这里要介绍的要点,也就是自编码器。

无监督学习的目的是为了展示出那些没有带标签的数据之间的关系。一种常见的应用场景是数据降维,也就是将原来的高纬度数据投影到2维,从而使人们可以清楚的看到其间的关系。而用来评价数据降维的效果好坏,有一套常用的数据集,也就是分类中常用的MINST,手写数字的照片集,如下图。

/pic/1_VKFCMXOMcELC0VWOV5pkg6d81BdcVA.jpg

而分类的任务是给定一个数据,由算法模型来预测这个数字究竟是几,而聚类的任务,则是去看看能不能相同的数字放到一起,常用的聚类方法有PCA和tsne, 其中tsne是效果较好的一种方法。下图分别是用PCA 和tsne’做聚类得到的结果,不同的颜色代表不同的数字,我们看到各个类之间还是分得比较开的。而之所以tsne效果要好于pca,那是因为tsne能更好的处理非线性的变换,从而造成较少的信息丢失。

/pic/2_xHNg3HiczzmquQ7zbmj5jjUg6HoQZg.png

/pic/3_UKOHIseECczRGS5LP5PuPpB9VWL6Rw.jpg

而深度学习,则天生适合处理非线性的情况,所以从理论上来说,使用深度学习,也可以做到较好的聚类。自编码器是一种神经网络的结构,其左右互博的思路,有些类似GAN。一个神经网络用来降低维度,另一个网络用来从降维的信息中恢复出尽可能多的信息,整个神经网络的目标是使得恢复出的数据尽可能的和原始的数据相类似。

/pic/4_dic3rFFIqXt1exz8ZWDHv0pAzYIfWA.png

以上的神经网络中,输入的信息有4维,经过一层名叫编码器的神经网络的降维,变成了2维的,也就是中间那俩个隐藏层的输出,之后进过4个解码器中人工神经元的处理,由恢复成了4维,这就是一个最基本的自编码器。

而将许多个单层的编码器和解码器按照顺序堆叠起来,就构成了更强大的深度自编码器,如下图所示。先是将5维变成4维3维再变成2维,之后再按顺序升维。而要获得降维后的表示,只要看看中间那俩个神经元的输出就好。

好,我们来看看在R 语言的h2o包中如何实现深度自编码器。首先是导入包,

library(h2o) 这一句就行了,之后是导入训练数据

mfile = ``"D:\R_Projects\MNIST\MNIST_DIGITStrain.csv"

MDIG = ``h2o.importFile``(path = mfile,sep=``","``)

之后要做的就是去规定模型了,这里的函数有很多参数,每一个读者都可以在了解后观察其对模型效果的影响,这里大多数采取了默认值。

NN_model = ``h2o.deeplearning``(

  ``x = 2:785,

  ``training_frame = MDIG,

  ``hidden = ``c``(400, 200, 2, 200, 400 ),

  ``epochs = 600,

  ``activation = ``"Tanh"``,

  ``autoencoder = ``TRUE

)

这里x 指出了使用数据中的第2列到第785 列,第一列是该行突袭对应的数字标签,这里不用,第二行是告诉模型使用的训练数据是之前导入的MINST,第三个参数指定了有多少可隐藏神经元,最初是400个,之后是200个,最后是2个,再进行升维,第四个参数是说模型最多训练400轮,第五个函数是每个神经元的激励函数是什么,这里是双曲正切Tanh函数,最后一个参数是指定这里是一个自编码器而不是分类器。

接着我们来看看模型的效果,第一幅图是用自编码器画出的,第二副则是由h2o这个包中的线性聚类方法SVD画出的,明显看起来第一幅要比第二副好的的,当然自编码器要慢一些,需要350秒来完成训练,而SVD只需要6.5 秒。有兴趣的小伙伴可以自己试试不同的网络结构,看看会不会得出更好的效果。

train_supervised_features2 = ``h2o.deepfeatures``(NN_model, MDIG, layer=3)

plotdata2 = ``as.data.frame``(train_supervised_features2)

plotdata2$label = ``as.character``(``as.vector``(MDIG[,1]))

qplot``(DF.L3.C1, DF.L3.C2, data = plotdata2, color = label, main = ``"Neural network: 400 - 200 - 2 - 200 - 4000 "``)

/pic/5_Q7gzySGuwGib2ChZjvI684DmiaiaBA.jpg

/pic/6_jxpHomnlu2vWXRnSSc9ASklzhgGfTA.jpg

总结一下,在R平台下,也可以进行深度学习,而且可以进行聚类和数据降维。自编码器作为一种常见的非监督学习框架,在未来也会有广泛的应用。

欢迎关注巡洋舰的深度学习实战课程, 手把手带你进行深度学习实战, 课程涵盖机器学习,深度学习, 深度视觉, 深度自然语言处理, 以及极具特色的深度强化学习,看你能不能学完在你的领域跨学科的应用深度学习惊艳你的小伙伴,成为身边人眼中的大牛。

原创不易,随喜赞赏

/pic/7_vHVmC19a0o7YS03eqTrIL9QJS4wS4w.jpg