在食神这部电影中,薛家燕以极为夸张的方式表现了黯然销魂饭有多么好吃。各位可脑补一下这个场景,然后将赞叹的对象换成knitr包。knitr包是谢益辉创建的一个用于生成动态报告的R语言扩展包,和它相类似的功能在之前是由Sweave来完成的。关于Sweave的用处,谢大牛曾经在统计之都写过一个专门的文章。并由此引出了“可重复性研究”(Reproducible Research)这个概念。
可重复性研究本质上是要求研究过程的开源和透明。所有的数据分析过程,从数据获取、转换处理到分析,最后生成报告,均由一份代码文件描述完成。这样的做法不仅使用户本身能从重复性工作中抽身出来,也能使其它人分享你的研究过程,并从中获益。knitr包就是能让用户在这一份文档中同时写Latex代码和R代码,并使之完美结合。在knitr官网上,也详细提供了这个扩展包的由来、特点以及各种示范帮助。
使用knitr生成报告并不难,象我的话,使用环境是windows7+CTeX套装+RStudio+R+knitr。先在RStudio的Sweave选项中设置用knitr来解释Rnw文档。然后新建一个Rnw文件,可同时编写LaTex和R代码。Rnw文档中的R代码由Chunk来标记注明。点击compile PDF就可以生成最终的报告。报告中对R代码会自动进行语法高亮,R运行的结果也自然附上。当然你可以在Chunk中进行设置,隐藏代码或是运行结果。
只要有一定R语言基础和LaTex的基础,knitr很容易掌握,笔者研究了大半天就捣鼓出来一个还过得去的PDF(用散点图示范ggplot2的核心概念)。各位若感兴趣,可以到这里下载这个PDF文件,以了解knitr的效果。原始代码在此。
从R-blogger网站上看,knitr包广受关注和好评,而且在即将开始的第五届R语言会议中,统计之都的魏太云也将向各位介绍knitr包的特点。敬请期待吧!
06.15补充:研究了一下markdown标记语言,的确可以在五分钟内掌握,并生成不错的web文档,当然最好可以有一点网页的基础。这里是和上面那个PDF内容相同的一个示例。
星期三, 五月 23, 2012
星期六, 五月 19, 2012
用glmnet包实施套索算法(LASSO)
这两种方法的共同点在于,将解释变量的系数加入到Cost Function中,并对其进行最小化,本质上是对过多的参数实施了惩罚。而两种方法的区别在于惩罚函数不同。但这种微小的区别却使LASSO有很多优良的特质(可以同时选择和缩减参数)。下面的公式就是在线性模型中两种方法所对应的目标函数:
星期四, 五月 17, 2012
尝试用animation包来玩GIF动画
谢益辉创建的这个animation包实在是很好玩,上面这个GIF动画就是用lattic包绘制的静态图形构建的。要在R里面玩动画除了要安装animation包之外,还需要安装配套软件。例如安装ImageMagick,以方便生成GIF文件。动画生成原理很简单,基本上就是在saveGIF里面嵌套一些循环绘图的代码,但要注意的是:对于lattice或是ggplot2绘图命令,最后一定要使用print,不然出不了图。另外要在设置参数里面写清楚ImageMagick的安装路径。
rpart包和party包的简单比较
决策树模型是一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。决策树模型的基本计算步骤如下:先从n个自变量中挑选一个,寻找最佳分割点,将数据划分为两组。针对分组后数据,将上述步骤重复下去,直到满足某种条件。
在决策树建模中需要解决的重要问题有三个:
- 如何选择自变量
- 如何选择分割点
- 确定停止划分的条件
在R语言中关于决策树建模,最为常用的有两个包,一个是rpart包,另一个是party包。我们来看一下对于上述问题,这两个包分别是怎么处理的。
星期二, 五月 15, 2012
分享几本数据挖掘书籍
The Elements of Statistical Learning: Data Mining, Inference, and Prediction
广受推崇的统计学习书籍,重视理论基础,图文并茂,各种算法讲解清晰。但没有涉及实务中的问题,如特征选择。
星期四, 五月 10, 2012
用ggplot2包来绘制地图
自从四月份进行重大升级之后,0.90版的ggplot2包更新了很多新功能。之前的博文谈到了升级版的二维直方图。今天我们要谈的是绘制地图的新功能。其图形元素主要是通过geom_map来实现,在它的帮助文档中只描述了如何绘制美国地图,而美国地图是系统内maps包所自带的地图数据。其它图家地图数据则要从外部导入,本文则尝试从
GADM 获取中国行政区域数据,然后用ggplot2包进行绘图。GADM是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。
本例的目的是结合地理数据和水资源数据,以说明中国人均水资源拥有量的分布情况。基本步骤是先导入地理信息数据,将其转为ggplot2可以处理的数据框格式,将水资源数据整合进来,最后绘制成图。在下图中,红色代表了人均水资源拥有量较低的地区,黄绿色代表较高的地区。多年以来,华北地区都是有名的缺水地区,而长江以南水资源相对较为丰富,这一点很容易观察出来。而西藏、青海人口数量少,使人均水资源偏高。此外,根据全国水资源公报的数字,全国平均的人均水资源量是2200立方米。我们可以根据这一数字,将低于平均数的省份单独显示出来。顺便说下,公鸡的另一只腿可不是我吃了,数据原本如此。
本例的目的是结合地理数据和水资源数据,以说明中国人均水资源拥有量的分布情况。基本步骤是先导入地理信息数据,将其转为ggplot2可以处理的数据框格式,将水资源数据整合进来,最后绘制成图。在下图中,红色代表了人均水资源拥有量较低的地区,黄绿色代表较高的地区。多年以来,华北地区都是有名的缺水地区,而长江以南水资源相对较为丰富,这一点很容易观察出来。而西藏、青海人口数量少,使人均水资源偏高。此外,根据全国水资源公报的数字,全国平均的人均水资源量是2200立方米。我们可以根据这一数字,将低于平均数的省份单独显示出来。顺便说下,公鸡的另一只腿可不是我吃了,数据原本如此。
星期日, 五月 06, 2012
为KNN分类器增加Cross-Validation功能
有这么一句很有趣的话,如果一个东西走路象鸭子、叫起来象鸭子、吃起来也象鸭子,那它就是一只鸭子。这是一种很符合我们直觉的思维方式:将未知的对象和已知的东西相比较,如果各个属性相近,我们就把它们归为一个类别。这就是KNN分类器的思想。
KNN即是kth Nearest Neighbor。如果我们已经拥有一些已知类别的数据,要对一些未知类别的数据进行分类。基本思路就是将数据看作是在多元空间中的点,先计算未知点和周围k个已知点之间的距离。然后根据周围k个已知点的类别进行投票来决定未知点的类别。例如设k为3,对某个未知点找出其周围最近的三个已知点,如果这三个点有两个属于A类,一个属于B类,那么根据多数原则,将未知点的类别预测为A类。
KNN算法的优势在于算法简单,稳健性强,可以构成非线性的判别边界,模型参数简单,只有距离测度和k参数。其弱点在于计算量较大,对异常点较为敏感,对不平衡数据也很敏感。R语言中class包的knn函数可以实行基本的KNN算法。
星期四, 五月 03, 2012
日历中的夏天
看着有节,摸着无节--打一生活用品
不知不觉,夏日已慢慢临近。姑娘们飞扬的裙角,小贩叫卖的西瓜,蚊蝇嗡嗡的声音,以及翻过的一页日历,都提醒着你--夏天快来了。夏季有着不同的定义,根据中国人的日历,我们所俗称的夏季从“立夏”开始,到“立秋”结束。在气候学上,若连续五天平均温度超过22度,则算作夏季的开始,若五天平均温度低于22度则算作入秋。而天文学上的夏季一般是指6、7、8三个月。
我们想知道:哪一种夏季的定义更合乎我们的感觉?还是用数据可视化来说话吧。这项任务基本上有两个步骤,一是获取某城市的2011年日平均温度数据,二是根据数据绘制日历热图(Calendar Heatmap)。
关于机器学习的几个视频资源
最著名的视频课程可能就是斯坦福大学的机器学习公开课,在网易公开课栏目可以观看全部的20节课程。其中15节已经翻译有中文字幕。缺点是视频不算很清晰,而且好象全是黑板推算,理论性很强。
http://v.163.com/special/opencourse/machinelearning.html
另外的一个就是Coursera提供的课程,其主讲人仍然是斯坦福大学的Andrew Ng。视频制作非常精良,和前者的区别在于起步简单些,先从线性代数和一元回归讲起。使用的是Octave(类似Matlab)作为实现工具。另外Coursera有班级、作业、考试,最后还会给你一张证书。
https://class.coursera.org/ml/class/index
星期二, 五月 01, 2012
用RJSONIO包调用天气数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于阅读和编写,同时也易于机器解析和生成。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。目前有许多API服务提供了JSON的数据格式。
如果我们要在R语言中处理json数据,可以采用的扩展包有rjson和rjsonio两个包。从本人感觉来看,rjsonio包要更为友好一些,读取之后可以直接转为简单的list格式,方便调用数据。rjson的话也可以转为list,但其中层次关系复杂,不大方便处理。下面我们用一个例子来看看如何用RJSONIO包调用数据。我们希望编一个函数从wunderground的API调用本地城市的天气预报。其基本步骤如下:
- 若用户未输入城市名,则根据本机IP地址来返回当地天气;
- 若用户输入了城市名,则先用google API得到城市经纬度;
- 再用经纬度作查询参数,来返回该城市天气。
订阅:
博文 (Atom)