tag:blogger.com,1999:blog-4862444491224044252024-03-17T02:52:19.194+08:00数据科学中的R和PythonData Science is the art of turning data into actions写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.comBlogger267125tag:blogger.com,1999:blog-486244449122404425.post-75534009025417762742016-09-29T11:26:00.000+08:002016-09-29T11:36:21.246+08:00艺术风格的神经网络算法实验2015年九月的时候出现了一篇很趣的论文《A Neural Algorithm of Artistic Style》。论文中提出了一种算法,可以将一张普通的图片,转换成具有某种艺术家的风格。<br />
<br />
用语言来描述计算流程如下:<br />
1、首先用一个给定参数的卷积神经网络(VGG网络),将原始的内容图片和风格图片进行函数映射,这个任务不需要网络后面的全连接层,只需要中间一些卷积层的输出即可,而且将网络中的max_pool改成了avg_pool。<br />
2、可以利用这些中间输出,将其定义为内容输出和风格输出。内容输出是网络中较上层的映射结果,而风格输出是一些较低层映射的相关矩阵,用一个Gram矩阵计算表示。<br />
3、将内容图片加噪音,这个将做为网络的输入,将网络的输出和内容输出进行对比,计算出内容损失函数(像素值取差值,再平方和),和风格输出进行对比,计算出风格损失函数,再整合两个损失形成总损失。<br />
4、训练目标是总损失最小化,训练参数是第3步中的输入图片,这样得到一个图片,使内容和原来的内容图片相似,而风格和风格图片一致。<br />
<br />
内容图片如下:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQr5b1vRSVxjUuzU0M1Fp0jhugkn68hzZRm_iesh5xjGWZwzvv55Q2uNzNm-WdKp95wAP2SMW3823M8_xG1BAltvBIx3gWQyf0sIEwQW8QDvqWBCFIDLZJvpVJwOK7Q4T1D3xHEEU9BV9h/s1600/Taipei101.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQr5b1vRSVxjUuzU0M1Fp0jhugkn68hzZRm_iesh5xjGWZwzvv55Q2uNzNm-WdKp95wAP2SMW3823M8_xG1BAltvBIx3gWQyf0sIEwQW8QDvqWBCFIDLZJvpVJwOK7Q4T1D3xHEEU9BV9h/s320/Taipei101.jpg" width="320" /></a></div>
<br />
风格图片如下:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOR_tKavq2YHy6CPW9fb3G0H0Ec8hHxt79Wf_ndaJ32CpZWRwDTlgR9AJ4fXGITBrG_lZDQhmtFbgXqYzSSzHT5Bj7Bh2ADeBI5OjGampvDdrkwheN1539_bwLLxMJ-9CLMEfSQRmSMKL/s1600/StarryNight.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOR_tKavq2YHy6CPW9fb3G0H0Ec8hHxt79Wf_ndaJ32CpZWRwDTlgR9AJ4fXGITBrG_lZDQhmtFbgXqYzSSzHT5Bj7Bh2ADeBI5OjGampvDdrkwheN1539_bwLLxMJ-9CLMEfSQRmSMKL/s320/StarryNight.jpg" width="320" /></a></div>
<br />
初始的输入是一个内容图片加噪音:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAMddN9FrIET6flP-qSousioetqAdRSQqSHoYGEd4YDoxZhu9V7FaT5uzorUJ9HQM5i03Xl7PJngRloFfuFewMtcJu_c-8lHM2plyrNzDXYkp5Qxl7njyp2yCXMc2QfL9M5x3LKH8aEXOF/s1600/0000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAMddN9FrIET6flP-qSousioetqAdRSQqSHoYGEd4YDoxZhu9V7FaT5uzorUJ9HQM5i03Xl7PJngRloFfuFewMtcJu_c-8lHM2plyrNzDXYkp5Qxl7njyp2yCXMc2QfL9M5x3LKH8aEXOF/s320/0000.png" width="320" /></a></div>
<br />
最后结果图片如下:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjBczZR16B7Gw_xFH2opeI0LBwEj0jwYD1pBkqjEZBxZj3aFWxQX0XPgTDNJ5gS-g8q8iqwvjJnqF-fsd-q5XfaKGxqYBmgveEWmQ62GryZQRP87HApTF0uyVw-1JrvJtpe6mJI_MOtxt/s1600/0400.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjBczZR16B7Gw_xFH2opeI0LBwEj0jwYD1pBkqjEZBxZj3aFWxQX0XPgTDNJ5gS-g8q8iqwvjJnqF-fsd-q5XfaKGxqYBmgveEWmQ62GryZQRP87HApTF0uyVw-1JrvJtpe6mJI_MOtxt/s320/0400.png" width="320" /></a></div>
<br />
参考资料:<br />
http://arxiv.org/pdf/1508.06576v2.pdf<br />
https://github.com/ckmarkoh/neuralart_tensorflow<br />
具体方法如下面代码所示,<br />
<br />
<script src="https://gist.github.com/xccds/a03747ddbf2dea77ba4c1a95ca926852.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com5tag:blogger.com,1999:blog-486244449122404425.post-47114604230834044272016-06-28T10:38:00.003+08:002016-06-28T10:38:27.650+08:00TensorFlow初体验以前玩深度学习一直是用的theano和keras,做为谷粉不能不试一下大热的TensorFlow。首先安装起来。<br />
<br />
TensorFlow的安装指南非常详细,我是python的anaconda环境,所以直接先创建一个新环境,创建前先更新一下conda<br />
conda update conda<br />
conda update anaconda<br />
看一下目前计算机上有哪些环境<br />
conda info --env<br />
目前只有root环境,所以新建一个专门为TensorFlow的环境,并将root中的包克隆过来<br />
conda create --name tensorflow --clone root<br />
激活使用环境<br />
source activate tensorflow<br />
退出环境<br />
source deactivate<br />
<br />
使用pip来安装<br />
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py2-none-any.whl<br />
<br />
然后我们可以使用jupyter notebook来启动,下面是两个最简单的示例。<br />
<br />
<script src="https://gist.github.com/xccds/543780a9457faf1f648a37e1f950356f.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com3tag:blogger.com,1999:blog-486244449122404425.post-91142903425873116002016-06-09T16:59:00.000+08:002016-06-09T16:59:35.457+08:00标签传播算法因为标注成本比较高,当你的训练数据集只有一部分数据是有标注的情况下,使用监督学习你只能扔掉那些没有标注的X。而实际上,有标注的样本和无标注的样本之间是有关系的,这种关系信息也可以用来帮助学习。这就是半监督学习标签传播(Label Propagation)算法的思路。<br />
<br />
它的基本逻辑是借助于近朱者赤的思路,也就是KNN的思路,如果A和B在X空间上很接近,那么A的Y标签就可以传给B。进一步迭代下去,如果C和B也很接近,C的标签也应该和B一样。所以基本计算逻辑就是两步,第一步是计算样本间的距离,构建转移矩阵,第二步是将转移矩阵和Y矩阵相乘,Y里面包括了已标注和未标注的两部分,通过相乘可以将已标注的Y转播给未标注的Y。具体论文可以<a href="http://mlg.eng.cam.ac.uk/zoubin/papers/CMU-CALD-02-107.pdf">看这里</a>。在sklearn模块中已经内置了这种算法,文档示例可以<a href="http://scikit-learn.org/stable/modules/label_propagation.html">看这里</a>。下面是用python的numpy模块实现的一个toy demo。
<script src="https://gist.github.com/xccds/a1385c23bba4b5ad16ef18e8c8727525.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com2tag:blogger.com,1999:blog-486244449122404425.post-41512328848487656902016-06-08T13:29:00.002+08:002016-06-08T13:29:41.061+08:00值乎?<span style="background-color: white; color: #333333; font-family: Helvetica, STHeiti; font-size: 14px; line-height: 23px;">刚开通了值乎,有趣的数据问题可以来问我,当然一分钟比较短啦。有严肃的长问题还是去知乎问我吧。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPMbO2yTNyqOK3xSeylNcKLose18nJs1O3FbDBxvVAum36cGy7TwilcIy0ABg8lcq9_fXya5Lmwj6PUvdrZwAHgVPjvYX_lHEBgcZUl9N03KRkenANgK1jJgmN4GEyr2aqchDBZ_jNr88u/s1600/Screenshot_2016-06-08-08-50-20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPMbO2yTNyqOK3xSeylNcKLose18nJs1O3FbDBxvVAum36cGy7TwilcIy0ABg8lcq9_fXya5Lmwj6PUvdrZwAHgVPjvYX_lHEBgcZUl9N03KRkenANgK1jJgmN4GEyr2aqchDBZ_jNr88u/s640/Screenshot_2016-06-08-08-50-20.png" width="360" /></a></div>
<span style="background-color: white; color: #333333; font-family: Helvetica, STHeiti; font-size: 14px; line-height: 23px;"><br /></span>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com2tag:blogger.com,1999:blog-486244449122404425.post-30936987185454955682016-05-31T20:54:00.002+08:002016-05-31T20:54:22.420+08:00python中的数据工具箱最近参加了第九届北京R语言大会,做了一个关于python的简单介绍。相关ppt在如下连接,需要的下载。<br />
链接: http://pan.baidu.com/s/1dEGl63f 密码: k3y6<br />
博客,只要有时间,我还是会继续坚持的。写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com9tag:blogger.com,1999:blog-486244449122404425.post-86367561689351072982015-11-25T10:58:00.004+08:002015-11-25T11:01:24.744+08:00基于深度LSTM的中文分词本例尝试的用多层LSTM来玩中文分词,大部分代码和<a href="http://xccds1977.blogspot.tw/2015/08/blog-post.html">之前的文章</a>是一样的。不一样的就是使用了更复杂的模型,用了多个LSTM叠加在一起。这对于句子这种有时序特征的数据更有帮助。在前面部分的代码是计算了字向量,但是发现是没有太大必要。除了用多层LSTM,后面还尝试了双向LSTM,效果也还可以。<br />
<div>
<br /></div>
<script src="https://gist.github.com/xccds/d82f2b8de4112c209f8c.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com1tag:blogger.com,1999:blog-486244449122404425.post-88360511935462069302015-11-24T09:21:00.002+08:002015-11-24T09:21:46.327+08:00自夸<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5X1m5ZV-gC299h3y-EEkNd5umxZ89lTFjbJEAVeGTklOMQs7Dqan5JuWVddLuwdN4vnle6c6V84xpYrTCKTiIHhvUT15K-uazv5OUSnHNqi57Zm2dJlpPnDrQWkOa0hpGQ8IJly0ohZY/s1600/s28260663.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5X1m5ZV-gC299h3y-EEkNd5umxZ89lTFjbJEAVeGTklOMQs7Dqan5JuWVddLuwdN4vnle6c6V84xpYrTCKTiIHhvUT15K-uazv5OUSnHNqi57Zm2dJlpPnDrQWkOa0hpGQ8IJly0ohZY/s320/s28260663.jpg" width="221" /></a></div>
<br />
李舰和我合写的一本书在2015年的7月份上市了,今天来自推一下这本书。此书是面向于初学者,提供宽而浅的导论性质读物。<br />
<br />
<a href="http://book.douban.com/subject/26576631/">http://book.douban.com/subject/26576631/</a><br />
<br />
数据科学是将数据转化为行动的艺术,是综合了统计学、计算机科学和领域知识的新兴学科。数据科学与很多传统学科的最大区别在于其为应用而生,因此本书一切从实际应用出发,以R语言为核心工具,介绍了各类分析方法的实现及其在各领域的应用情况。<br />
<br />
如果是初学者,可以从“编程篇”开始阅读,了解R语言的基本特点。如果是程序员,在迅速掌握语法后,可以深入研究“模型篇”,学习如何用统计学和其他流行的分析方法来描绘复杂的数据世界。如果关心数据价值的落地,“应用篇”必不负你所望,金融、制药、文本挖掘、社交网络、地理信息、高性能计算、可重复研究,这些最热门的行业和应用领域的案例将会为你带来数据应用的最真实的体验。<br />
<br />
本书适用于所有对数据应用感兴趣的读者,也适合作为统计和数据分析的实务操作型课程的教材。写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com2tag:blogger.com,1999:blog-486244449122404425.post-37632658675249867222015-11-21T17:03:00.003+08:002016-01-27T16:45:17.829+08:00深度学习入门资源索引深度学习(Deep Learning)属于非常前沿的学科,没有现成的的综合型教材,主要是通过阅读大量论文和代码练习来学习。值得读的经典论文很多,下面介绍的一些教程中多少都有提及,另外就是去google重要文献。代码方面推荐使用python为基础的theano框架,因为它比较偏底层,可以从细节掌握如何构建一个深度学习模块,而且方便结合python在数据领域的其它积累,例如numpy。当然到了生产环境你可以再考虑torch之类的框架。从代码角度切入学习的好处是,理解起来不会像理论切入那么枯燥,可以很快做起一个好玩的东西。当然,最后你还是得补充理论的。下面精选介绍一些本人在学习时遇到的好教程。<br />
<br />
1、入门首选:<br />
http://deeplearning.net/tutorial/<br />
该站提供了一系列的theano代码示范,通过研究模仿,就可以学会包括NN/DBN/CNN/RNN在内的大部分主流技术。其中也有很多文献连接以供参考。<br />
<br />
2、BP神经网络:<br />
http://neuralnetworksanddeeplearning.com/<br />
第1部分的教程中,神经网格的参数是theano自动求导的,如果想深入了解细节,还得手动推导加代码实现一遍。该教程对BP神经网络的理论细节讲的非常好。<br />
<br />
3、理论补充:<br />
http://goodfeli.github.io/dlbook/<br />
该书内容比较广泛,虽未最终完成,但已初见气象。用来完善理论知识是再好不过。<br />
<br />
4、图像处理中的卷积神经网络:<br />
http://vision.stanford.edu/teaching/cs231n/syllabus.html<br />
前面三部分相当于导论,比较宽泛一些,该教程则是专注于卷积神经网络在图像视觉领域的运用,CNN方面知识由此深入。<br />
<br />
5、自然语言处理中的深度学习:<br />
http://cs224d.stanford.edu/<br />
本教程则偏重于深度学习在自然语言处理领域的运用,词向量等方面知识由此深入。<br />
<br />
6、递归神经网络:<br />
http://www.wildml.com/<br />
该博客讲的RNN是非常棒的系列,不可不读。<br />
<br />
7、keras框架:<br />
http://keras.io/<br />
keras框架是基于theano的上层框架,容易快速出原型,网站中提供的大量实例也是非常难得的研究资料。<br />
<br />
8、深度学习和NLP<br />
https://github.com/nreimers/deeplearning4nlp-tutorial/tree/master/2015-10_Lecture<br />
该教程是第5部分的补充,理论讲的不多,theano和keras代码讲的很多,附带的代码笔记很有参考价值。<br />
<br />
9、机器学习教程<br />
https://www.cs.ox.ac.uk/people/nando.defreitas/machinelearning/<br />
牛津大学的机器学习课程,讲到了大量深度学习和强化学习的内容,适合于复习过一遍。<br />
<br />
10、搭建硬件平台<br />
http://xccds1977.blogspot.com/2015/10/blog-post.html<br />
到这里,你的理论和代码功力应该差不多入门了,可以组个GPU机器来大干一场了。可以参考笔者这个博客来攒个机器。<br />
<br />
11、去kaggle实战玩玩吧<br />
http://www.kaggle.com/<br />
<br />
12、最后补充一个比较新的资源,udacity上的一门深度学习公开课<br />
https://www.udacity.com/course/deep-learning--ud730写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com10tag:blogger.com,1999:blog-486244449122404425.post-44097978955888135842015-11-19T22:26:00.000+08:002015-11-19T22:26:36.606+08:00使用深度学习库keras做文本分类<script src="https://gist.github.com/xccds/8f0e5b0fe4eb6193261d.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com3tag:blogger.com,1999:blog-486244449122404425.post-61711596893091086372015-10-17T11:41:00.001+08:002015-10-18T08:09:08.105+08:00如何搭建一台深度学习服务器在计算机时代的早期,一名极客的满足感很大程度上来源于能DIY一台机器。到了深度学习的时代,前面那句话仍然是对的。<br />
<br />
<b>缘起</b><br />
在2013年,MIT科技评论将深度学习列为当年十大科技突破之首。其原因在于,模型有其为庞大的网络结构,参数够多,学习能力够强,能配合大数据达到惊人的效果。而且,能自动学习特征,避免了“特征工程”这种繁琐的手工劳动。对于图像、音频和文字处理领域有极大的意义。因为最近在尝试用深度学习做文本挖掘,所以需要一台深度学习服务器(相信我,如果用CPU来跑,你的人生显得好短)。<br />
<br />
那么就有三个选择项:<br />
A、购买组装好的服务器,例如NVIDIA DIGITS <a href="https://developer.nvidia.com/devbox">DEVBOX</a><br />
B、购买云服务,例如Amazon的<a href="https://aws.amazon.com/cn/ec2/pricing/">GPU服务</a><br />
C、自己攒一台深度学习服务器。<br />
A项从性价比上不合算,而且不一定买的到。B项的云服务对于研究探索性质工作而言也比较贵,机器配置也不一定合适,所以我们就C项了。<br />
<br />
<b>硬件选择:基本思路是单显卡机器,保留升级空间</b><br />
<br />
显卡选择:<br />
先解释一点,深度学习为什么需要显卡计算?<br />
GPU 是为大规模的并行运算而优化;<br />
GPU 上则更多的是运算单元(整数、浮点的乘加单元,特殊运算单元等等);<br />
GPU 往往拥有更大带宽的显存,因此在大吞吐量的应用中也会有很好的性能。<br />
这里有一个很有趣的<a href="http://www.kaixin001.com/repaste/2562247_5071464908.html">解释视频</a>,解释了GPU和CPU的计算区别。<br />
<br />
所以显卡选择最重要,因为准备基于CUDA计算(CUDA (Compute Unified Device Architecture) 是NVIDIA开发的GPU并行计算环境。),所以只能选择Nvida系列的。在英伟达产品系列中,有消费领域的GeForce系列,有专业绘图领域的Quadro系列,有高性能计算领域的Tesla系列,如何选择?<br />
<br />
有论文研究,太高的精度对于深度学习的错误率是没有提升的,而且大部分的环境框架都只支持单精度,所以双精度浮点计算是不必要,Tesla系列都去掉了。从显卡效能的指标看,CUDA核心数要多,GPU频率要快,显存要大,带宽要高。这样,最新Titan X算是价格便宜量又足的选择。<br />
<br />
CPU选择:<br />
在深度学习任务中,CPU并不负责主要任务,单显卡计算时只有一个核心达到100%负荷,所以CPU的核心数量和显卡数量一致即可,太多没有必要,但是处理PCIE的带宽要到40。<br />
<br />
主板选择:<br />
需要支持X99架构,支持PCIe3.0,还要支持4通道DDR4内存架构。如果要搞四显卡并行,PCIE带宽支持要达到40,并且支持4-Way NVIDA SLI技术。<br />
<br />
内存:<br />
达到显存的二倍即可,当然有钱的话越大越好。<br />
<br />
电源问题:一个显卡的功率接近300W,四显卡建议电源在1500W以上,为了以后扩展,选择了1600W的电源。<br />
<br />
机箱散热:<br />
因为各种部件相当庞大,需要有良好散热功能的大机箱,选择了Tt Thermaltake Core V51机箱,标配3个12cm风扇。未来如果需要还可以加装水冷设备。<br />
<br />
以上就是主要硬件环境的选择和安装。<br />
<br />
<b>软件环境安装:</b><br />
<br />
主要安装了Ubuntu系统,CUDA环境,以及theano、keras环境<br />
<br />
1、安装ubuntu 14.04(不要安装麒麟版本)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>通过官网下载iso文件刻录U盘安装,在SSD硬盘上自动安装完成。<br />
2、安装cuda 7.5 deb文件(自带显卡驱动)<br />
2.1 获取CUDA安装包,在NVidia官网下载local deb文件。<br />
2.2执行如下命令安装:<br />
$ sudo dpkg -i cuda-repo-ubuntu1410-7-0-local_7.0-28_amd64.deb<br />
$ sudo apt-get update<br />
$ sudo apt-get install cuda<br />
2.3设置环境变量:sudo gedit /etc/profile<br />
$ export PATH=/usr/local/cuda-7.5/bin:$PATH<br />
$ export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH<br />
2.4重启机器:用其中一个样例进行验证测试<br />
$ cuda-install-samples-7.5.sh ~<br />
$ cd ~/NVIDIA_CUDA-Samples_7.5/5_Simulations/nbody<br />
$ make<br />
$ ./nbody<br />
或者在sample目录中make测试项目1_utility,再运行./deviceQuery<br />
<br />
3、安装python以及theano工具<br />
3.1 直接下载安装anaconda套件64位版本。<br />
下载后用conda升级到最新。anaconda自带openblas,使numpy和theano计算能达到最大效能<br />
3.2 修改了theano配置文件,使之缺省由gpu运算<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>在主目录下新建.theanorc文件<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.theanorc中输入下面的内容<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>[cuda]<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>root=/usr/local/cuda/bin/<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>[global]<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>floatX = float32<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>device = gpu0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>[nvcc]<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fastmath = True<br />
3.3 安装完成后参考如下地址进行测试<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>THEANO_FLAGS=floatX=float32,device=gpu python `python -c "import os, theano; print os.path.dirname(theano.__file__)"`/misc/check_blas.py<br />
3.4 安装keras<br />
通过anaconda安装pip install keras<br />
注意keras依赖的theano是dev版本的,需要从github下源码来安装。注意本系统此时有两个python,所以要写路径<br />
sudo /home/user/anaconda/bin/python setup.py develop<br />
<br />
4、设置远程服务器调用<br />
4.1 安装ssh,启动服务<br />
4.2 设置notebook server<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>在ipython中如下命令设置密码:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>from IPython.lib import passwd<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>passwd()<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>记下生成的字符串。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>创建一个ipython配置文件,比如起名叫myserver<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>ipython profile create myserver<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>vim ~/.ipython/profile_myserver/ipython_notebook_config.py<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>编辑文件,加入下面几项:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c = get_config()<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c.IPKernelApp.pylab = 'inline' #启动inline模式<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c.NotebookApp.ip = '*'<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c.NotebookApp.open_browser = False<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c.NotebookApp.password = u'sha1:yourhashedpassword' #把第二步的密码考进来<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>c.NotebookApp.port = 6868 #自己设一个端口号<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>启动服务<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>ipython notebook --profile=myserver<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
4.3 远程浏览器调用<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>远程中浏览器登陆http://192.168.3.31:6868/,输入密码,即可进入ipython notebook。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>如果需要保持连接,则<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nohup ipython notebook --profile=myserver<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>杀掉连接<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lsof nohup.out<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>kill -9 "PID"<br />
<br />
完工!<br />
<br />
<b>最后的硬件配置:</b><br />
CPU: Intel X99平台 i7 5960K<br />
内存: DDR4 2800 32G(8G*4)<br />
主板: GIGABYTE X99-UD4<br />
显卡: GTX Titan X<br />
硬盘: SSD+普通硬盘<br />
<br />
<b>系统和软件</b><br />
操作系统: Ubuntu 14.04.3 x64<br />
CUDA: 7.5<br />
Anaconda 2.3<br />
Theano 7.0<br />
Keras 2.0<br />
<br />
<b>参考资料:</b><br />
http://timdettmers.com/2014/08/14/which-gpu-for-deep-learning/<br />
http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/<br />
http://graphific.github.io/posts/running-a-deep-learning-dream-machine/<br />
http://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html#ubuntu-x86_64-deb<br />
http://deeplearning.net/software/theano/tutorial/using_gpu.html#cuda<br />
<br />
之前网上找到另一种安装theano方式是<a href="http://deeplearning.net/software/theano/install_ubuntu.html">自行安装组件</a>。但尝试未成功,有可能是因为CPU等硬件不同,可能需要自行编译安装openblas,numpy, scipy, theano等环境,极为繁琐。最后还是直接用Anaconda方便。<br />
<div>
<br /></div>
写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com11tag:blogger.com,1999:blog-486244449122404425.post-25401694735031336552015-08-27T22:30:00.004+08:002015-08-27T23:02:42.511+08:00基于深度学习的中文分词尝试最近折腾deeplearning和NLP比较多,其实就是在看Stanford的<a href="http://cs224d.stanford.edu/syllabus.html">cs224d课程</a>啦。抽空尝试了一下使用词向量和神经网络做中文分词。<br />
<br />
使用的数据是参考资料中的中文分词资源,即Bakeoff中微软研究院的中文语料库,它的训练文本带有每个字的标注(BEMS),同时带有测试文本和测试脚本。此外使用了补充的语料库,即sogou新闻语料库,不带字标注,但可用来学习字向量。<br />
<br />
使用的工具是python中的gensim库和keras库,gensim可用于学习词向量,keras是基于theano的深度学习库。在本例中只使用了普通的MLP方法。<br />
<br />
整体工作的步骤如下:<br />
- 步骤1:使用sogou的语料库建立初始的字向量,向量维度为100,迭代50次。<br />
- 步骤2:读入有标注的训练语料库,处理成keras需要的数据格式。<br />
- 步骤3:根据训练数据建模,使用左右各3个字做为上下文,7*100个神经元为输入层,隐藏层为100,输出层为4,神经网络结构为[700->100->4],总共进行了约50次迭代。<br />
- 步骤4:读入无标注的测试语料库,用训练得到的神经网络进行分词标注<br />
- 步骤5:使用自动脚本检查最终的效果<br />
<br />
最终测试脚本输出的summary如下,F值为0.913。<br />
=== SUMMARY:<br />
=== TOTAL INSERTIONS:<span class="Apple-tab-span" style="white-space: pre;"> </span>2872<br />
=== TOTAL DELETIONS:<span class="Apple-tab-span" style="white-space: pre;"> </span>2896<br />
=== TOTAL SUBSTITUTIONS:<span class="Apple-tab-span" style="white-space: pre;"> </span>6444<br />
=== TOTAL NCHANGE:<span class="Apple-tab-span" style="white-space: pre;"> </span>12212<br />
=== TOTAL TRUE WORD COUNT:<span class="Apple-tab-span" style="white-space: pre;"> </span>106873<br />
=== TOTAL TEST WORD COUNT:<span class="Apple-tab-span" style="white-space: pre;"> </span>106849<br />
=== TOTAL TRUE WORDS RECALL:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.913<br />
=== TOTAL TEST WORDS PRECISION:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.913<br />
=== F MEASURE:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.913<br />
=== OOV Rate:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.026<br />
=== OOV Recall Rate:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.673<br />
=== IV Recall Rate:<span class="Apple-tab-span" style="white-space: pre;"> </span>0.919<br />
<br />
具体代码可以参见<a href="https://github.com/xccds/chinese_wordseg_keras">github</a><br />
<br />
后续折腾畅想:<br />
- 本例中带标注的语料库相当大,可以直接在这个上面先训练字向量试试。<br />
- 有空时还可以测试下jieba分词的效果评估。<br />
- 用RNN等其它的方法试试效果。<br />
<br />
参考资料:<br />
[<a href="http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E8%B5%84%E6%BA%90">中文分词资源</a>]<br />
[<a href="http://www.52nlp.cn/the-character-based-tagging-method-of-chinese-word-segmentation">中文分词标注法</a>]<br />
[<a href="http://suanfazu.com/t/word2vec-zhong-de-shu-xue-yuan-li-xiang-jie-duo-tu-wifixia-yue-du/178">word2vec原理</a>]<br />
[<a href="http://blog.csdn.net/itplus/article/details/17122431">基于word2vec的中文分词</a>]写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com1tag:blogger.com,1999:blog-486244449122404425.post-52409258212469106812015-05-22T09:35:00.001+08:002015-05-22T09:35:19.002+08:00使用word2vec进行文本分类<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/ae012b5484c50defc4c0" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com1tag:blogger.com,1999:blog-486244449122404425.post-88889784236717432072015-05-22T09:31:00.000+08:002015-05-26T22:01:15.332+08:00用代码来理解boosting方法提升方法是集成学习中预测能力最强的一种方法。在R和Python中都有相应的扩展库和丰富的函数。不过对于初学者来讲,理解这种方法不是很容易。本文基于R的决策树包实现两种基本的提升树,即回归提升树和分类提升树。有助于理解提升方法的原理,以及各项参数的作用。公式推导可以见<a href="http://chiffon.gitcafe.io/2015/05/26/gbm.html">这篇文章</a>。<br />
<br />
<script src="https://gist.github.com/xccds/432b8752a2f9c14e3148.js"></script>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com1tag:blogger.com,1999:blog-486244449122404425.post-13645142704922444882015-04-21T20:46:00.000+08:002015-04-21T20:46:23.454+08:00用spark进行数据挖掘<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/6dfd67737f53aa40f50a" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-7509273292632067112015-04-18T11:13:00.001+08:002015-04-18T11:13:10.499+08:00用非负矩阵分解对文本词项矩阵降维在前年的一个<a href="http://xccds1977.blogspot.tw/2013/10/blog-post.html">贴子</a>中,谈到了使用奇异值分解来对一个文本词项矩阵进行降维。本文是使用同样的数据,但是使用不同的工具来处理,也就是非负矩阵分解。nmf的好处在于比svd更容易解释,而且自带正则功能。<br />
<br />
<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/f2c870f08fe41e0fe164" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-29846329275904893832015-04-17T09:47:00.001+08:002015-04-17T09:48:01.877+08:00R和python的整合以前写的一个东西,贴上来给需要的朋友看看。<br />
<br /><iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/d692e468e21aeca6748a" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-27791022130301403092015-04-04T19:31:00.000+08:002015-04-05T08:59:18.835+08:00中国政治坐标系数据的一点分析清明节有点空闲,凑巧又看到一份很<a href="http://zuobiao.me/">有趣的数据</a>,下文是对这份数据的一点点分析结果。<br />
<br />
1、数据整理<br />
整体数据并不大,读到R里面首先做了点处理。<br />
- 将选项("强烈同意","同意","反对","强烈反对") 映射为分值(2,1,-1,-2)<br />
- 对出生年份进行转换,计算出在2015年的年龄并分为10个年龄组(0,18,22,25,30,35,40,50,60,70,120)<br />
- 怀疑70岁以上的人可能是乱写的,删除之。<br />
- 将其它字符型也转为数字编号<br />
- 将18岁以下而填写过高学历和过高收入的数据删除。<br />
- 删除有缺失的数据。<br />
<br />
2、有趣的发现<br />
这个数据可以做的分析点有很多,我只做了其中一小部分,观察各种题目的相关性如何。因为已经是离散数据了,所以使用了标准化后的互信息来计算变量之间的相关性。这个数字应该是在0-1之间,发现大部分的回答中这个值并不高,多在0.1以下。不过均通过了联列表检验,说明还是存在相关性的。<br />
<br />
- 在50个问题中,哪两个问题的回答之间最相关?<br />
发现第3题和第6题的回答相关性最高(0.13)。<br />
[1] "发生重大社会安全事件时.即使认为信息公开会导致骚乱的风险.政府仍应该开放信息传播."<br />
[2] "由高校自主考试招生比全国统一考试招生更好."<br />
<br />
- 哪个问题和学历的相关性最高?<br />
第41题相关性较高,得到相关性为0.009<br />
[1] "两个成年人之间自愿的性行为是其自由.无论其婚姻关系为何."<br />
<br />
- 哪个问题和年龄的相关性最高?<br />
第35题相关性较高,为0.01。而且这个题目和收入的相关性也是最高的。<br />
[1] "那些关系到国家安全.以及其他重要国计民生的领域.必须全部由国有企业掌控."<br />
<br />
- 哪个问题和性别的相关性最高?<br />
第30题相关性较高,为0.077。让人比较惊奇的是,女性回答不给予补贴的比例比男性高。<br />
[1] "改善低收入者生活的首要手段是国家给予财政补贴和扶持."<br />
<br />
- 哪些问题和收入有相关性?<br />
这次使用了GBM模型,计算了问题回答对收入的重要性。发现如下三个问题是最重要的。(除了年龄、学历、性别因素之外)<br />
[1] "条件允许的话应该武力统一台湾." (负相关)<br />
[2] "两个成年人之间自愿的性行为是其自由.无论其婚姻关系为何."(正相关)<br />
[3] "国家领导人及开国领袖的形象可以作为文艺作品的丑化对象." (正相关)<br />
<br />
3、其它<br />
最后还做了一个总体的分布图。根据出题者的思路,1-20题为政治方面,21-40题为经济方面,41-50题为文化方面,可以计算每个人在这三个方面的平均得分。我尝试将这三个维度进行散点图绘制。基本上是一个略有点扁的圆形。大部分人在中间,少数人在边缘。<br />
<br />
当然后续有兴趣的同学也可以继续搞点聚类之类的事。或者是按照不同属性(收入、时间)来看看圆形的变化。以上全部参考代码<a href="https://gist.github.com/xccds/b4021fb49226a70b9a8c">在此</a>。<br />
<br />
这份数据除了能了解国人整体的政治观点之外,还有两个奇特的用法。一个是用坐标距离来大致判断两个人是否可以做朋友。还可以用于大致判断某个人未来的收入。所以女性同胞们,<b>千万不要去找那些要武力统一台湾的当自己男朋友。</b>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com5tag:blogger.com,1999:blog-486244449122404425.post-61594947506469773742015-03-12T22:27:00.001+08:002015-03-13T21:27:36.518+08:00树莓派折腾第一季:建立私人NAS1、实验条件:<br />
<br />
- 树莓派B+<br />
- micro SD卡<br />
- 读卡器<br />
- 无线网卡<br />
- 5V2A电源<br />
- 移动硬盘<br />
- USB hub<br />
- HDMI转VGA<br />
- 显示器<br />
- 键盘<br />
- 鼠标<br />
- Mac book air<br />
<br />
2、实验步骤:<br />
<br />
- 烧录系统到SD上。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>参考官网步骤,但注意读卡器有时会出问题,选择高质量的设备。<br />
- 启动设置Raspbian系统(raspi-config)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>设置各种参数,例如ssh enable之类的,方面后面远程登陆。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>注意:把locale设置好,否则后面你还得用dpkg-reconfigure locales<br />
- 配置以修正显示的问题<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>参考地址:http://www.chengxuyuans.com/Windows/61812.html<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>注意:多次尝试以适合自己的显示器<br />
- 配置无线网卡<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>参考地址:http://rpi.linux48.com/rpi-wlan.html<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>http://blog.appdevp.com/archives/188<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>注意:要买正确的网卡,再设置一下静态网址。<br />
- 进X看是否可以上网了,再试一下ssh, scp之类的。<br />
- 安装samba<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>参考地址:http://xwlogic.github.io/2014/08/NAS/<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>注意:先要更新软件源;挂载移动硬盘的时候得有电;设置samba很多参数,得保证可写。<br />
- 设置挂载方式<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>参考地址:http://blog.sciencenet.cn/blog-430991-692444.html<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>注意:如果移动硬盘的格式不是linux,而是exfat之类这种,分享出来的没有写权限,用chomd也不能修改,此时需要特别在fstab中设置挂载细节。<br />
- 其它平台登陆服务器<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>这样就可以在mac book中的finder里登陆这个服务器 smb://192.168.1.10<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>也可以在安卓手机上使用软件来登陆这个服务器。安卓上好用的软件是ES文件浏览器<br />
- 增加下载工具<br />
还需要在树莓派上安装一个下载工具,使之变成一个自动下载器。<br />
参考地址:http://www.linuxidc.com/Linux/2014-02/96269.htm<br />
注意: 安装aria2还是很方便的,配合百度网盘转aria2的chrom插件更是如虎添翼。<br />
<br />
3、实验小结<br />
<br />
- 一开始的设备一定要全,后面可以不需要键盘鼠标,只用ssh了。<br />
- X窗口不是很顺滑,机器在终端玩比较好。<br />
- Raspcherry pi cookbook这本书不错。<br />
- 机器自带mathematica这种逆天神器,再配合linux/python。教小孩数学、计算机的确不错。<br />
<br />写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com2tag:blogger.com,1999:blog-486244449122404425.post-19929152210219826812015-02-08T12:00:00.004+08:002015-02-08T12:00:52.528+08:00在ipython notebook上运行spark周末无事,看到了<a href="https://districtdatalabs.silvrback.com/getting-started-with-spark-in-python">这篇文章</a>。于是照猫画虎尝试了一番,顺便把官网上的文档看了一些。记录以下以备忘。(目前只尝试了spark在单机上的运行)<br />
<br />
<b>安装spark</b><br />
只需要去官网下载预编译好的最新版本即可,然后回来解压<br />
tar -xzf spark-1.2.0-bin-hadoop2.4.tgz<br />
放到自己选定的目录中,加一个软链接<br />
ln -s /srv/spark-1.2.0 /srv/spark<br />
然后设置环境变量,~/.bash_profile or ~/.profile<br />
export SPARK_HOME=/srv/spark<br />
export PATH=$SPARK_HOME/bin:$PATH<br />
<br />
之后在终端上运行pyspark应该可以看到欢迎画面了。<br />
<br />
<b>设置notebook</b><br />
为了在ipython notebook中运行spark需要设置一个启动文件。先设置一个profile<br />
ipython profile create spark<br />
在路径下加一个py文件 $HOME/.ipython/profile_spark/startup/00-pyspark-setup.py<br />
<br />
文件中放如下内容,注意和自己的目录有关。<br />
import os<br />
import sys<br />
# Configure the environment<br />
if 'SPARK_HOME' not in os.environ:<br />
os.environ['SPARK_HOME'] = '/srv/spark'<br />
# Create a variable for our root path<br />
SPARK_HOME = os.environ['SPARK_HOME']<br />
# Add the PySpark/py4j to the Python Path<br />
sys.path.insert(0, os.path.join(SPARK_HOME, "python", "build"))<br />
sys.path.insert(0, os.path.join(SPARK_HOME, "python"))<br />
<br />
之后在启动notebook时要加一个profile参数<br />
ipython notebook --profile spark<br />
<br />
<b>hello world</b><br />
在notebook中尝试了spark的hello world任务,即word count。<br />
from pyspark import SparkContext<br />
sc = SparkContext( 'local[4]')<br />
lines = sc.textFile("some.txt")<br />
words = lines.flatMap(lambda line: line.split())<br />
pairs = words.map(lambda s: (s, 1))<br />
counts = pairs.reduceByKey(lambda a, b: a + b)<br />
result = counts.collect()<br />
#counts.saveAsTextFile("wc")<br />
<br />
后面有空再去研究如何用spark做数据分析和机器学习。<br />
<div>
<br /></div>
写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com1tag:blogger.com,1999:blog-486244449122404425.post-49186754368093125492015-02-01T22:25:00.001+08:002015-10-17T14:38:39.610+08:00python数据挖掘模型的API部署前文谈到了如何把一个R语言的挖掘模型进行在线部署,也就是生成一个API。本文则是同样的思路,只不过是来尝试将python的数据挖掘模型部署成一个API。由于python是通用型的编程语言,部署起来方便一些。下面的例子仍是一个简单的模型,用来预测iris种类。在mac系统中完成,使用了python的几个包:<br />
<br />
flask 一个轻量级的web框架<br />
flask.ext.restful 快速生成restful api<br />
numpy 数值计算包<br />
pickle 用来保存模型<br />
sklearn 用来建模<br />
<br />
只需要四个步骤:<br />
<br />
步骤1:建立模型<br />
步骤2:模型写入pickle文件<br />
步骤3:构建一个基于flask的API<br />
步骤4:通过API调用模型<br />
<br />
第一步是用sklearn建模。<br />
<br />
from sklearn.tree import DecisionTreeClassifier<br />
import pandas as pd<br />
from pickle import dump<br />
df = pd.read_csv('iris.csv')<br />
X = df.ix[:,:4].values<br />
y = df.ix[:,4].values<br />
model = DecisionTreeClassifier()<br />
model.fit(X,y)<br />
<br />
第二步是将模型写入到pickle文件中<br />
<br />
dump(model, open('model.pickle','wb'))<br />
<br />
第三步是构建一个API,写一个server.py文件<br />
<br />
from flask import Flask, request<br />
from flask.ext.restful import Resource, Api<br />
import pandas as pd<br />
from pickle import load<br />
<br />
app = Flask(__name__)<br />
api = Api(app)<br />
model = load(open('model.pickle','rb'))<br />
<br />
class Model(Resource):<br />
def post(self):<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = pd.DataFrame(request.json,index=[0]) # df<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = model.predict(res) # array<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = res.tolist()[0] # str<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = {'Species':res} # dict<br />
return res<br />
<br />
api.add_resource(Model, '/<string:todo_id>')</string:todo_id><br />
<br />
if __name__ == '__main__':<br />
app.run(debug=True)<br />
<br />
保存好py文件后启用它。<br />
python server.py<br />
<br />
API会在如下地址监听<br />
Running on http://127.0.0.1:5000/<br />
<br />
第四步是调用这个API。另开一个终端,输入<br />
curl -H "Content-type: application/json" -X POST http://127.0.0.1:5000/ -d '{"Sepal_Length":4.9,"Sepal_Width":3,"Petal_Length":1.4,"Petal_Width":0.2}'<br />
<div>
<br /></div>
成功返回<br />
<div class="p1">
{</div>
<div class="p1">
"Species": "virginica"</div>
<br />
<div class="p1">
}</div>
也可以在python中实验。<br />
from requests import post<br />
import json<br />
<br />
<div class="p1">
url = 'http://127.0.0.1:5000'</div>
<div class="p1">
data<span class="s1"> = </span>'{"Sepal_Width": 3, "Petal_Width": 0.2, "Sepal_Length": 4.9, "Petal_Length": 1.4}'</div>
<div class="p1">
</div>
<div class="p1">
headers = {'content-type':'application/json'}</div>
<div class="p1">
</div>
<div class="p1">
post(url, data=json.dumps(data), headers=headers).json()</div>
<br />
上面的代码是用了flask的一个扩展库,如果直接用原生的flask也可以写<br />
from flask import Flask, request, jsonify<br />
import numpy as np<br />
import pandas as pd<br />
from pickle import load<br />
<br />
app = Flask(__name__)<br />
<br />
model = load(open('model.pickle','rb'))<br />
<br />
from flask import Flask, request,json<br />
app = Flask(__name__)<br />
<br />
@app.route('/model', methods = ['POST'])<br />
def api_message():<br />
if request.headers['Content-Type'] == 'application/json':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = pd.DataFrame(request.json,index=[0]) # df<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = model.predict(res) # array<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = res.tolist()[0] # str<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>res = {'Species':res} # dict<br />
return jsonify(res)<br />
else:<br />
return "415 Unsupported Media Type ;)"<br />
<br />
if __name__ == '__main__':<br />
app.run(debug=True)<br />
<br />
最后在shell中执行curl测试,那么将是输入json,输出json了<br />
curl -H "Content-type: application/json" -X POST http://127.0.0.1:5000/model -d '{"Sepal_Length":4.9,"Sepal_Width":3,"Petal_Length":1.4,"Petal_Width":0.2}'<br />
<div>
<br /></div>
写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com2tag:blogger.com,1999:blog-486244449122404425.post-24305935292537597702015-01-31T21:48:00.000+08:002015-01-31T21:48:09.966+08:00基于opencpu构建R语言的RESTful API一个R语言模型的落地应用有几种方式:可能是一个简单的分析报告,可能是将预测结果输出到数据库,即离线模型,也可能需要实时读入数据进行实时预测输出。第三种情况是最有用,也最难处理的情况。因为要把R和其它通用型语言进行整合并不容易。例如使用Rserve在java中整合R代码就需要开发人员即懂java也懂R,开发量会比较高。一种比较好的思路是将R计算部分作为一个API,其它语言时通过API来调用R的部分。<br />
<br />
下面的例子就是一个很简单的预测iris种类。在mac系统中,基于opencpu框架完成,opencpu能将R语言的对象转为http的资源,极大的方便了R语言模型的部署。一共只需要四个步骤。<br />
<br />
步骤1:建立模型<br />
步骤2:模型写入R包<br />
步骤3:将R包安装到opencpu服务器上<br />
步骤4:通过API远程调用模型<br />
<br />
第一步是R语言建模。<br />
library(rpart)<br />
m = rpart(Species~., data = iris)<br />
save(m, file='model.rda')<br />
模型保存为一个rda文件在硬盘上。<br />
<br />
第二步是写一个R包,如今用rstudio写一个R包是非常简单的事了,建立好一个新项目test之后,在R代码中写入预测函数如下。<br />
library(rpart)<br />
predfunc = function(input){<br />
input = as.data.frame(input)<br />
result = predict.rpart(m,newdata = input,type='class')<br />
as.character(result)<br />
}<br />
可以在R里面验证一下函数是否正常。<br />
newx = data.frame(Sepal.Length=5.1,<br />
Sepal.Width=3.5,<br />
Petal.Length=1.4,<br />
Petal.Width=0.2)<br />
predfunc(newx)<br />
然后新建一个data目录,将rda文件放入目录中,build&reload去建立这个名为test的R包。<br />
<br />
第三步是安装R包到opencpu服务器上,我事先在本机上安装了opencpu,只需要像安装普通R包一样安装即可。<br />
install.packages(opencpu)<br />
这样在第二步reload时就直接安装好了test的R包。<br />
<br />
第四步是实验API调用是否成功。在终端里进R,调用opencpu,即library(opencpu)会自动启动服务,并显示<br />
[httpuv] http://localhost:4678/ocpu<br />
OpenCPU single-user server ready.<br />
<br />
调用模型时,用curl实验即可。另开一个终端,输入<br />
curl http://localhost:4678/ocpu/library/test/R/predfunc/json -H "Content-Type: application/json" -d '{"input" :[ {"Sepal.Length":1.1, "Sepal.Width" : 2.5, "Petal.Length":0.4, "Petal.Width":0.9}]}'<br />
<br />
成功返回<br />
[<br />
"setosa"<br />
]<br />
<br />
如果需要把这个模型提供给远程调用,需要安装服务器版本的opencpu。具体参见https://www.opencpu.org/posts/scoring-engine/写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-59788402621417081402015-01-07T12:49:00.000+08:002015-01-07T12:49:02.416+08:00theano玩转卷积神经网络<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/083b1d2ddf1ffc04c6f1" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-89937993796206903402014-12-31T20:43:00.000+08:002014-12-31T20:46:55.088+08:002014年的回顾前几天在twitter上感言:新的一年,继续hard模式的人生。这个hard模式有两个意思。<br />
<br />
一个意思是说在墙内的生活很hard。这年月在大局域网内搞什么事都不容易。写博客,发电邮,看电影,搜资料,这些大小事情都被GFW拦住。未来之中国,真是猪栏之中国!<br />
<br />
另一个意思是说学习的状态很hard。不断的把自己往非舒适区推,不断的学一些新的东西。很有意思。有人说,把兴趣和工作合二为一,才能真正的做到极致,我深以为然。工作内的八小时和工作外的八小时,都在做同一类的事情,类似武侠小说中,那些对武道的终极追求者。(当然本人还是近女色的)<br />
<br />
感言完毕,下面是2014年的流水账了。<br />
<br />
年初的时候换工作到了一家电商公司1号店,接触到互联网数据。做了些枯燥的取数需求,也做了一些看似高端的模型,了解数据仓库和BI的东西,实战经验丰富了不少。感谢数据海洋的推荐。<br />
<br />
后来春节期间为supstat编写R语言的中级培训材料,主要是以机器学习为纲,顺势又把这些算法捣实了一下。supstat的vivian人很好,祝她在纽约平安。<br />
<br />
5月份和李舰到台湾参加东吴大学主办的一个会,顺便把台北玩了一下。认识了谢邦昌这位数据挖掘界的大佬,还有台北商业大学的邹老师。台北的饭还是很好吃的,有机会再去台北逛一逛。感谢主办方赞助的机票。<br />
<br />
下半年时候开始花时间学python,对于它的数据模块已经运用自如。非常喜欢它的notebook,我甚至写了一个R和python的对比slide,准备在R会上讲的。不过李舰还是给了个命题作文,只讲了下数据科学。<br />
<br />
2014年完成的一件大事就是把书稿写完了,李舰和我合著的《数据科学中的R语言》,历经三个寒暑,多轮修改,总算可以在各位的有生之年读到了。快哉快哉。感谢李颖编辑的耐心。<br />
<br />
至于其它都不值多说了,或者先做了再说吧。我的博客仍然在更新,它是我的一个线上笔记(其实是不会用github)。敏锐的读者可以观察到,博客的主题已经改为《数据科学中的R和python》。工具增加了,研究的方向没有变。主题下面是对数据科学最好的一句提炼:Data Science is the art of turning data into actions。诸位有兴趣往数据科学坑里跳的,可以关注两个方面的修炼。一方面是有形的技能:理论、工具、实战。另一方面是无形的气质:好奇、创造、求败。在有涯的人生时间里,成为数据相关所有领域的专业余者(Pro-Ams,这个词要感谢志平)。<br />
<br />
2015年的目标是:有knowledge、有money、有happy。成为超一流的数据科学家。<br />
<br />
就这样子吧,借用一句话当尾巴:真正的英雄主义,是认清生活的本来面目,仍然热爱它。写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com6tag:blogger.com,1999:blog-486244449122404425.post-61328416647346132092014-12-29T11:48:00.001+08:002014-12-29T11:48:36.071+08:00用gemsim包做LSA和LDA<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/6276408bfa984f545342" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0tag:blogger.com,1999:blog-486244449122404425.post-20265576384922946512014-12-28T12:02:00.003+08:002014-12-28T12:02:24.619+08:00用word2vec找评论同义词<iframe frameborder="1" height="800px" marginheight="px" marginwidth="0px" name="My iFrame" scrolling="yes" src="http://nbviewer.ipython.org/gist/xccds/7e537599040c43fdd32e" style="border: 0px #000000 none;" width="600px"></iframe>写长城的诗http://www.blogger.com/profile/00652199274036685555noreply@blogger.com0