星期三, 五月 23, 2012

被knitr包给震撼到了

在食神这部电影中,薛家燕以极为夸张的方式表现了黯然销魂饭有多么好吃。各位可脑补一下这个场景,然后将赞叹的对象换成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内容相同的一个示例

星期六, 五月 19, 2012

用glmnet包实施套索算法(LASSO)


当我们使用数据训练分类器的时候,很重要的一点就是要在过度拟合与拟合不足之间达成一个平衡。防止过度拟合的一种方法就是对模型的复杂度进行约束。模型中用到解释变量的个数是模型复杂度的一种体现。控制解释变量个数有很多方法,例如变量选择(feature selection),即用filter或wrapper方法提取解释变量的最佳子集。或是进行变量构造(feature construction),即将原始变量进行某种映射或转换,如主成分方法和因子分析。变量选择的方法是比较“硬”的方法,变量要么进入模型,要么不进入模型,只有0-1两种选择。但也有“软”的方法,也就是Regularization类方法,例如岭回归(Ridge Regression)套索方法(LASSO:least absolute shrinkage and selection operator)

这两种方法的共同点在于,将解释变量的系数加入到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立方米。我们可以根据这一数字,将低于平均数的省份单独显示出来。顺便说下,公鸡的另一只腿可不是我吃了,数据原本如此。

星期日, 五月 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得到城市经纬度;
  • 再用经纬度作查询参数,来返回该城市天气。