R 语言的黑白势是什么?
工欲善其事,必先利其器,作为一个战斗在IT界第一线的工程师,C/C++、Java、perl、python、ruby、php、javascript、erlang等等等等,你手中总有一把利用自如的刀,辅佐你披荆棘。
应用场景抉择常识的储蓄与东西的选择,反过来,无论你选择了什么样的东西,你必然会尽力地把它改革成切合本身应用场景所需的谁人样子。从这个原理来说,我选择了R[1]作为数据挖掘人员手中攻城陷池的那把云梯,并尽力地把它改革本钱身但愿的谁人样子。
关于R的一个较量精确的描写是:R是一门用于统计计较和作图的语言,它不光是一门语言,更是一个数据计较与阐明的情况。统计计较规模有三大东西:SAS、SPSS、S,R正是受S语言和Scheme语言影响成长而来。其最主要的特点是免费、开源、各类百般的模块十分齐全,在R的综合档案网络CRAN中,提供了大量的第三方成果包,其内容涵盖了从统计计较到呆板进修,从金融阐明到生物信息,从社会网络阐明到自然语言处理惩罚,从各类数据库各类语言接口到高机能计较模子,可以说无所不包,无所不容,这也是为什么R正在得到越来越多各行各业的从业人员喜爱的一个重要原因。
从R的普及来看,海外的普及度要明明好于海内,跟盗版windows的泛滥会影响Linux在中国的普及一样的原理,破解的matlab与SPSS的存在也影响了R在中国的利用人群。但在海外高校的统计系,R险些是一门必修的语言,具有统治性的职位。在家产界,作为互联网公司翘楚的google内部也有不少的工程利用R举办数据阐明事情,这里[2]有一个google campus的授课视频,内容就是用R作为东西来报告数据挖掘的观念与算法。
跟着连年来R利用者的增加,关于R的报道也屡有见于报端,如2009年头美国纽约时报就有一篇很好的报道:Data Analysts Captivated by R’s Power[3]。报道中述说了R的成长汗青以及由于数据挖掘需求的增长而日益普及的近况,它虽源于S但其成长却远远地高出了S,已经成为高校结业学生所选用的第二大东西语言,google与Pfizer的员工也先容了R在本身公司中的应用。另外,报道中google首席经济学家Hal Varian说:R的最让人惊艳之处在于你可以通过修改它来做所有的工作,而你已经拥有大量可用的东西包,这无疑让你是站在巨人的肩膀上事情。
以下就R的几个主要应用场景以及我在实践中的履历对这个并不算主流的编程语言作一些先容。
统计计较:R之最强项
R从它出生的第一天就是为了做统计计较的,当时它被界说为一个统计计较与作图的东西,固然成长到此刻它已经被赋予了越来越强大的成果,但此刻R的开拓人员里,照旧以各个高校统计系的老师与学生为主,他们自然最相识本身最需要的是什么。
在统计计较中,我们经常需要按照样本数据作线性回归,获得必然的纪律性,R中实现这个成果十分简朴,以下是一个一元线性回归的例子:
x <- 1:10
y <- x+rnorm(10, 0, 1)
fit <- lm(y ~ x)
summary(fit)
注明一下,R里的“<-”标记意义为赋值,大大都环境下它可以用“=”号来取代,但某些非凡的场所不行以,本文会遵循“<-”这种官方利用的写法。这个例子的前两行筹备了两列数据:自变量x与因变量y,第三行的函数lm即按照提供的样本数据举办线性回归计较,获得的模子功效可以用第四行打印出来。函数lm除了可以做这种简朴的一元线性回归,还可以做多元线性回归,同时返回模子的各类统计量。
做统计的往往免不了要做各类百般的图形,R的另一个根基特点就是对图形的强大支持,以下代码展示了一个箱线图的作法,代码来自boxplot函数的manual,该图显示了几列数据的分位数、中值、均值、奇异点等信息及其比拟位置。更具体的关于R的作图成果可以参看[4]。
boxplot(mpg~cyl,data=mtcars, main=”Car Milage Data”, xlab=”Number of Cylinders”, ylab=”Miles Per Gallon”)
呆板进修:让你的数据发挥它应有的浸染
呆板进修、数据挖掘规模面对着一些抽象自大量现实糊口的问题,好比关联法则挖掘、聚类、分类这三大问题。作为一个完备的工程计较包,R毫无疑问对它们都提供了足够的支持。
关联法则问题源于“买了这件商品的顾主还买了什么”这个问题,此刻已经遍及应用于客户行为阐明以及互联网用户行为阐明中。关联法则挖掘规模最经典的算法为apriori,R的第三方包arules[5],就是专门用于做关联法则挖掘的。以下例子需要你已经安装了arules包。
library(arules)
data <- paste(“item1,item2″,”item1″,”item2,item3″, sep=”\n”)
write(data, file = “demo_basket”)
tr <- read.transactions(“demo_basket”, format = “basket”, sep=”,”)
data(“Adult”)
rules <- apriori(Adult, parameter = list(supp = 0.5, conf = 0.9, target = “rules”))
最后一行的apriori函数接管一个transaction工具的输入,输出关联法则工具rules,为利便起见,这里用于计较的transaction工具Adult是通过第5行从arules包中现成载入进来的,第2~4行说明白怎么从一个文本文件中读入数据并生成一个transaction工具。
聚类算法利用最遍及的高效算法无疑是kmeans,R在其默认载入的stats包中就包括了这个函数,以下是一个来自kmean说明文档的例子:
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
cl <- kmeans(x, 2)
plot(x, col = cl$cluster)
points(cl$centers, col = 1:2, pch = 8, cex=2)
代码第1行生成两组两维的正态漫衍的数据,第一组均值为0,第二组均值为1,两组数据方差都为0.3。第2行对该数据举办聚类,第3和第4行把聚类功效画出来。
分类器是模式识别规模的研究主题,也是人类认知勾当的中心。多年来的学术研究积聚下来许多种范例的分类器,而个中较量靠谱的分类器根基都能在R中找到对应的实现。诸多分类器中以svm更为著名,它也被一些人称为是单分类器的王道。以下是一个操作svm对著名的iris数据集举办分类的进程,运行该例子需要你已经安装了e1071这个包[6]。
library(e1071)
data(iris)
x <- subset(iris, select = -Species)
y <- iris$Species
model <- svm(x, y)
summary(model)
pred <- predict(model, x)
table(pred, y)
第5行代码挪用svm函数,计较由x作为特征y作为种别标签的分类器模子,第7行把模子应用于原数据举办预测。
以上例子的演示并非想让列位读者就地学会各个差异规模中这些成果函数的用法,而是一方面展示一些实际的R代码以及它办理问题的方法,另一方面说明白R在这些常见的呆板进修规模的积聚。在R辅佐下去办理这些或者不是我们专业的问题,可以省去我们大量反复造轮子的精神,写出来的代码也足够的短小精壮,节减时间之余也让你对本身算法逻辑的全局尽收眼底。
高机能计较:向量化与并行/漫衍计较
作为现代数据挖掘人员从业者,大概第一个需要体贴的是所利用东西的可伸缩性(Scalability),详细来说就是在面临大数据量场景时的计较本领。
一个拥有高机能计较本领的计较包,首先它必需能充实操作汗青上积聚下来的那些著名的数值计较包,好比blas、lapack;另一方面,它必需具有精采的可扩展性,即它必需利便开拓人员并行化本身的算法,很幸运这些特性R都具备了。
雷同于R、scilab与matlab那样的工程计较包,凡是城市以向量化计较(Vectorization)作为其根基的计较特点(纵然python的numpy包也是如此),因为向量化的处理惩罚方法是现代大型计较机的根基特性,在计较机规模,无论硬件照旧软件,都提供了对向量化的支持,硬件上如Intel的MMX, SSE等指令集都提供了对向量化的支持,更多可以看到wikipedia上的先容[7]。软件上如blas等著名的计较包,天然地就可以对向量化的呼吁自动实施并行计较。
所谓向量化,是一种非凡的并行计较的方法,对比于一般措施在同一时间只执行一个操纵的方法,它可以在同一时间执行多次操纵,凡是是对差异的数据执行同样的一个或一批指令,可能说把指令应用于一个数组/向量。以下列出R中常常利用几种向量化运算,都是十分稀松泛泛的操纵,但它们本质上都是同时对一批数据应用沟通的操纵,所以都可以颠末向量化处理惩罚方法的改革:
正如我们所知,CRAN包罗了各类你能想像获得的东西包,虽然也有不少并行计较的包,这些包被归纳在R高机能计较相关的包列表中[8]。
关于R的向量化及并行计较更具体的内容可以参考我的一篇博客[9]。
编写接口与东西包:最有用的包肯定是你写的那一个
一个开源软件的最强大之处在于大量从业人员的孝敬,R最让人激奋,进而选择它作为事情平台的一个重要原因则是复杂而无所不包的的CRAN,在哪里险些能找到所有你能想像获得的与阐明研究相关的东西包,可以说丝绝不逊色于perl的CPAN。之所以拥有一个如此强大的第三方支持,一方面在于R自己在统计计较与计较本领方面的支持,另一方面则在于开拓一个R扩展是如此地容易,乃至于每一个利用R作为本身常用东西的人,城市按捺不住强烈的激动要写一个本身的包,以满意事情需要。假如本身的这个包感受写得不错,又为许多人所需要,就可以提交到CRAN。这是造成CRAN如此复杂的原因,但同时也造成了CRAN的软件包良萎不全。但大大都环境下,这些包城市是你的得力助手,出格是那些著名而广为利用的包,假如以为它们不满意你的需要,那么安心地对它们举办修改吧,因为它们都是开源的。
下面展示一个简朴的R扩展包的建造进程:
1、生成包布局:新建一个目次mypkg,同时作为包名,在mypkg中新建几个目次与文件,mypkg的目次布局如下图所示。R自带的函数package.skeleton可以自动帮你生成这些目次,但它需要一些现成的函数工具或文件作启动,为了顺序说明整个进程,这里没有利用。
2、目次说明:必须的是DESCRIPTION文件、man目次和R目次,剩下的都是可选的。DESCRIPTION文件描写包的meta信息;R目次下面存放R剧本文件,内里的函数可导出作为包函数库提供应外部利用;假如要在包里放一些试验数据,可以放在data目次里,常用是以csv名目存放,在R终端里data(***)可以载入,这里留空;man目次是R的辅佐文档,有必然的名目要求,这里也留空,生成包时会有一些告诫,可以不消管;src存放c/c++/fortran源代码,必需同时安排Makefile或Makevars文件指导编译措施事情,这里留空;zzz.R可以在载入包时做一些工作,这里也留空。
3、添加成果:DESCRIPTION文件的内容可以参考任意一个R包对应文件的写法,依样把信息修改本钱身相应的信息即可。以下只写一个简朴的R函数作为说明,在R目次下添加一个名为helloword.R的文件,文件内容如下:
helloword <- function(x, y)
{
return(x*y)
}
4、安装:在呼吁行中运行R CMD build mypkg,会编译生成一个mypkg_0.1.tar.gz安装包,个中的数字是我在DESCRIPTION里写的版本号;运行R CMD INSTALL mypkg,就可以把包安装到系统里。
5、试验:运行R,进入R终端;library(mypkg),载入刚建造的包;search(),可以看到mypkg包已经被载入;在R终端运行helloworld(2,3),返回6,试验乐成。
一个具有必然成果的包就这样做好了,是不是很简朴。假如有其它需要,只要往R目次或src目次添加文件,然后从头生成并安装就可以了。R与c/c++之间的接口挪用也十分利便,限于篇幅,无法更仔细地说明,更具体的内容可以参考我的几篇博客[10-13]。
R在中国的成长
R在中国的普及此刻并不十分地遍及,主要照旧学校及研究机构在利用,但连年来跟着R的声名鹊起,也已经有越来越多各个规模的家产界从业人员选择R作为本身的事情平台,个中统计之都[14]是一个海内R用户的聚焦地。本年的6月份在人民大学进行了第3届R语言集会会议,从前三届集会会议的人员构成来看,R的中国用户群一直泛起较大的增长趋势,用户漫衍的规模也越来越富厚。第三届R语言集会会议参会者人来历可以从集会会议纪要中看到[15]。相信跟着数据挖掘广为各个公司接管,R也会走近家产界的各行各业中。
R在豆瓣中的应用
有一段时间,我一直在寻找介乎于matlab与系统语言(如C, Fortran)的中间物,但愿它既能拥有系统语言的高机能,又能利便数据挖掘人员的日常事情,于是我找到了R,这不只是一门语言,它更是一个抱负的计较情况。它一方面利便我对新算法原型的构建、调试、评测,另一方面并没有让我失去系统级语言的计较优势,甚至在实现并行计较方面拥有了更多的选择。此刻我利用R编写我们本身的东西包,举办算法原型结构、矩阵运算、并行算法等离线应用,为相似性计较、推荐系统等上层应用提供底层的支持。
一个R写的协同过滤推荐的例子
最后用一个R实现的协同过滤推荐的例子来竣事本文,协同过滤是推荐系统中一个根基的算法,具体内容可以参考这里[16]。由于大量地回收了向量化的计较方法(包罗各类矩阵运算),所以算法的实现相当简捷,有大概是史上代码最少的协同过滤推荐引擎 data <- read.table(‘data.dat’, sep=’,’, header=TRUE)
user <- unique(data$user_id)
subject <- unique(data$subject)
uidx <- match(data$user, user)
iidx <- match(data$subject, subject)
M <- matrix(0, length(user), length(subject))
i <- cbind(uidx, iidx)
M[i] <- 1
mod <- colSums(M^2)^0.5
MM <- M %*% diag(1/mod)
S <- crossprod(MM)
R <- M %*% S
R <- apply(R, 1, FUN=sort, decreasing=TRUE, index.return=TRUE)
k <- 5
res <- lapply(R, FUN=function(r)return(subject[r$ix[1:k]]))
write.table(paste(user, res, sep=’:’), file=’result.dat’,
quote=FALSE, row.name=FALSE, col.name=FALSE)
代码我就不细加注释了,有乐趣相识其道理的同学可以看这里[16]。