Beta

It’s a beautiful thing when free data meets free algorithm.

今天看到老同学@JulieJulieJulieJulie浪漫求婚,真的很浪漫、很唯美、很感动。正如评论说的,我们又相信爱情了!于是,小兴奋,睡不着,爬起来补一篇文章。


正文开始

最近在数据挖掘专业网站 KDnuggets 上刊出了2011年度关于数据挖掘/分析语言流行度的调查,不出意料R、SQL、Python果然排在了前三位。当然有看官说了,参与调查的样本数量太少,而且以登录KDnuggets网站的用户为主,样本的信息显然是有偏的。实话说,我也对KDnuggets网站的Poll持保留态度,但它的结果毕竟代表了某一类人群的使用偏好,尤其是在语言角度。

我们看排名前5位的语言:

  • R:世界范围内的标准统计语言,以快速更新的算法,灵活的编程,广泛的扩展,绚丽的图形著称,遵循GPL协议的开源软件
  • SQL:大部分企业使用的,数据仓库、集市的通用查询语言,在大型数据应用上有极大的优势,同时也是数据分析/挖掘的基础
  • Python:传说中的Google的三大开发语言,适用于粘合一些复杂应用,我这里工作暂时没有涉及过
  • Java:太多的应用都基于Java的,不然Oracle也不会花上74亿美元收购SUN了
  • SAS:曾经的数据分析领域老大,当然现在市场份额依旧非常高。但SAS昂贵的使用费用迫使更多的分析工作者转到了开源领域,比如R

后四种语言同R语言还都有一些关系,闲扯起来还真是没完没了,这里就不再赘述,各位可以在搜索引擎上搜索R+XXX。 如果我们将范围限制在数据挖掘这个主题,R同SQL的关系则变得非常非常紧密。

众所周知,R的强项在于灵活的算法,以及开发速度,但其所有的计算都是在内存中进行,一旦数据量达到了内存上限,基本上就是叫天天不灵, 叫地地不应了。所以在使用R做数据挖掘时,就必须考虑使用其他的数据工具弥补R在这方面的劣势。尤其是在商业应用上, 不能搭建R环境的条件下,SQL语言是提供挖掘结果的不二选择。

支持SQL的商用数据库比如Oracle、DB2性能优异,但对系统的占用非常厉害,假如本地装了Oracle,又开了点其他应用,2G的内存很快就会吃到1.5G甚至以上, 再想用R做分析那只能用“捉襟见肘”这个词来形容了。当然如果在办公条件下有相应的服务器环境最好, 在某些应用环境下,甚至可以通过本地多开R进程来达到并行计算的目的。

或者本地分析比较多,但数据量又时常上到百兆,虽然R也能够处理,但依然建议将数据移植到本地构建的轻量数据库环境,比如MySQL环境。 从我的经验上看,虽然MySQL对比Oracle、DB2来说小巧很多,但在同R语言配合的本地应用上,性能更加有保证。

有了支持SQL的数据库环境,就要聊一聊R语言到底和SQL有什么关系:

  • 各大数据库厂商已经开发了相关的支持R语言的数据挖掘套件,比如Oracle的RODM,Teradata的 teradataR等。
  • R本身就可以通过扩展包来对数据库执行SQL,这时你可以把R语言作为调度环境。R的计算过程结果可以直接作为参数传递到数据库中,并将相应的结果返回,供R环境使用。
  • 通过sqldf包,在R内部使用标准SQL对数据进行预处理,包括group by,order by,join,where等操作。
  • 当然R最重要的用途是将数据挖掘的结果转义为标准SQL语言,利用数据库来实现挖掘结果。当然有人说了,不是有pmml可以将模型嵌入到数据库么?!扯!到现在我也没见pmml成为应用标准,老老实实的将模型结果转义到SQL才是王道。比如用于概率预测的Logistic回归或者分类模型的Tree-based Models,这些模型的转义工作都不难,这样最终的工程实施都脱离了R环境,更具通用性,且利用了数据库的高速性能。

说句题外话:不知道哪位看官见过70万字符长度的庞大SQL语句——是的,你没看错,70w,R转义的,可以执行,对于数据库而言不过是半分钟的事情。

在2008年,第一届中国R语言会议上,来自于艾瑞咨询的张翔为大家展示了一组极具震撼力的泡泡图,而这段视频便是Hans Rosling 在2006年 TED 上的演讲,讲述的是1956年-2006年之间各国间的经济发展变化。虽然个人认为泡泡图的实现的技术并没有太多技术含量,但惊讶于Hans Rosling大智若愚的演讲能力,甚至再看完五六遍之后,仍然还会被其感染。

再后来, Hans Rosling将这款数据展示产品卖给了Google,而Google又将其整合到Visualisation API 里,于是我们可以调用Google的API来使用这些有趣的图形展示功能。

更令人鼓舞的是:前不久,Markus Gesmann, Castillo两位老大,写了googleVis这个R扩展包,将Hans Rosling的泡泡图同R语言完美的整合在了一起:)

下面就是在R语言里,通过googleVis包,对我国2006年至今的货币供应量(M0、M1、M2)Motion Chart(将横坐标设置为time以后,点击Play)

碎碎念:从泡泡的跳动上看,央行投放的货币供应量(亿元)在2009-2011年间,增加的最为剧烈,当然这个时间段也是房价近十年间增长最为迅速的两年。 而现在呢,房市开始限购,国内房地产市场已经撑不住超发的货币,因此广泛的通货膨胀开始蔓延。引用郎咸平的几段话:

  • 我们近几年发了76.5万亿的货币,是GDP的2.5倍,而美国的货币量除上GDP只是0.6,只有我们的四分之一
  • 唯一的解释只能是货币的购买力在下降,这就是经济学里的通货膨胀

最后,关于googleVis包的使用请移步至这里

三天前,在统计之都论坛上问到了如何做Matrix67 博客上的平滑马赛克图,我是好事之徒,颠颠地跑去瞧了一眼。

恩,蛮有意思的,而且非常黄,非常暴力!但比较悲剧的是我不会用 Mathematica,只好用 R 实现了一下。

本来标题党一些,叫做《一千二百个女人和我的故事》,想想还是算了吧,虽说是用了 1200 个漂亮女人组成了我的头像,但我一个也不认识,哈哈。

用的原图我就不贴了,实际上我是戴着眼镜的,马赛克平滑以后,不明显了。最后是代码,非常简单,不到 20 行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
setwd('D:/doc/image/me')
library(ReadImages)
library(sqldf)
me <- read.jpeg('fun.jpg')
meid <- data.frame(z = 1:1200, y = as.numeric(me))
meid <- sqldf('select * from meid order by y')

setwd('D:/doc/image/others')
tmp <- NULL
for(i in dir()) tmp[[i]] <- read.jpeg(i)
id <- sapply(tmp, mean)
id <- data.frame(n = names(id), m = id)
id <- sqldf('select * from id order by m')
idx <- cbind(id, meid)
idx <- sqldf('select * from idx order by z')

setwd('D:/doc/image')
png('me.png', height = 1000, width = 750)
par(mfcol = c(40,30), mar = rep(0,4), xpd = NA)
for(i in idx$n) plot(tmp[[i]])
dev.off()

## 处理图片 ##
setwd('D:/doc/image/others')
shell("convert *.jpg -crop 120x120+10+5 thumbnail%03d.png")
shell("del *.jpg")
shell("convert -type Grayscale *.png thumbnail%03d.png")

大概所需要的时间:构思写代码 1 个小时,下载和整理图片时间长点,3个多小时(当然你本地资源和 Matrix67 一样丰富的话另说,哈)。

重更新代码

以前的包不能用了,另外不太优雅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
library(glue)
library(imager) # mac 需要 X11 的支持
library(jpeg)

## 处理图片 ##
setwd('/Users/liusizhe/bitbucket/code/imagemagick')
## system("convert source_gray.png -colorspace gray source_gray.jpg")
## system("convert source_gray.jpg -resize 50 source40.jpg")

size = 300
s <- 1:size
center <- sample(1:20, size = size, replace = TRUE)
## 基本思想是将照片等距加亮,这样就可以表达所有主体图片了
## -crop 250x250+5+10 的意思是(裁剪)
## 图片的中心店为准,向右 5 个像素点,向下 10 个像素点,取 250x250的图片出来
## 这里为了保证图片不会过于相似,所以做了随机“晃动”
for (i in s){
cmd <- glue('convert input1.jpg -set option:modulate:colorspace hsb -modulate {s[i]},100 -resize 320 -crop 250x250+{center[i]}+{center[i]} image/modulate{s[i]}.jpg')
system(cmd)
}
me <- readJPEG("source40.jpg")

## 将前面生成的图片读到一个 list
tmp <- list()
for(i in dir('/Users/liusizhe/bitbucket/code/imagemagick/image')){
tmp[[i]] <- load.image(paste('image/', i, sep = ''))
}

## 找到主图每个像素点同生成的等距加亮图片,距离最近的那个
id_mean <- sapply(tmp, mean)
image_order <- outer(as.numeric(me), id_mean, '-') |>
abs() |> apply(1, which.min)

## 绘制图形
## 这里要注意 height 和 width 必须和 me 的像素一致
jpeg('me.png', height = nrow(me)* 50, width = ncol(me)* 50)
par(mfcol = dim(me), mai = rep(0,4), xpd = FALSE)
for(i in image_order) plot(tmp[[i]], axes = FALSE)
dev.off()

## 删除 image 目录下的临时文件
system("rm image/*")

前几天COS论坛上还在说中科大的R镜像还没弄好,今天再看CRAN,中科大的镜像已然可以正式使用。

中国的 R 语言镜像近几年来变化比较大,最早是东南大学,但不知道什么原因消失了。而后国内镜像主要集中在香港的 geoexpat 和厦门大学,再后来加入了中科院的两个所(包括CTeX),到今日加入中科大镜像。个人一直觉得,人大作为中国R语言的倡导者,却一直没有提供镜像,挺遗憾的(人大文科氛围太浓烈)。

SAS

4月30日,dapangmao 在 SAS圈子更新了一篇博客——SAS,一个华丽时代的结束,具体内容见文末。不过有些奇怪的是,评论没有硝烟,不知道是因为 SAS 太封闭还是大家争累了。

MySQL

以前工作环境一般都是直接面对服务器上的Oracle、DB2,数据库安装、调试甚至数据源这些一般不用考虑。这两天项目需要,导了一些数据在本地。说来数据量也不大,1.5GB。一般的分析软件还不能直接搞定,于是乎倒腾上了MySQL。这个轻量级数据库挺有意思,注释和R是一样的(#),其前端工具 heidisql 不支持查询结果直接粘贴到word,却支持 Copy selected rows as LaTeX table,大大的逗了我一下。以前我老说 R 和 LaTeX 是天然的搭档,现看来 MySQL 也是 ^_^

SAS 一个华丽时代的结束

来源:http://www.mysas.net/sns/space.php?uid=808&do=blog&id=853

我是从 2000 年左右开始接触 SAS 的。当时还是本科生,带我的师兄要发表英文文章,杂志要求用SAS,所以需要用SAS做几个ANOVA和t-test。那时候用的SAS是存在十几张软盘上的一个dos程序,还请了高手帮我们破解,很是花了一番功夫。印象深刻的是,第一SAS的data step有一个内循环,初学者不需要基本的循环知识就可以上手,第二可以把数据直接考到程序里面,不需要像其他软件那样需要指定路径,读取硬盘上的文件。所以SAS尤其适合像大胖猫这样不是出身计算机相关领域,但是又想要做一些统计分析的业余选手。后来认真学SAS是05年以后的事情了,来到美国可以用正版的SAS,学习SAS也方便很多了。这时候的SAS是8.2版本了,该有的都有了,Proc SQL也变得很流行。再以后,变化就不大了,9.1有了hash object,9.2有了画图的SG procedures,SAS的老本行,广义线性模式,也升级到了Proc GLIMMIX。今年下半年,9.3也应该面世了。

一直在 SAS-L 潜水,觉得最近几年邮件组里人气掉的厉害,讨论的话题也一直没有什么变化,倒是跟oloolo这样的新生代大侠学到了一些新的编程风格。Oloolo大侠把一些新的算法和数据挖掘方法整合进SAS,让人耳目一新。还有经常出没SAS-L的 Liu Wensui大侠,也是华人中间的SAS高手。刘大侠的Blog也是学习SAS的好地方,他用macro封装输入-计算-输出的模式是我们规范SAS编程的好榜样,而且他很早就开始使用SAS和R的混合编程(可惜他的blog最近关门了,无缘瞻仰了)。

SAS的疲软,一部分原因是因为SAS自身的因素。SAS开发过SAS/AF和SCL,后来都失败了。一个有经验的SAS Programmer没法转变成为一个SAS Developer。 把所有的模块(Base/STAT/ETS/IML 等等)和系统(PC,UNIX,z/OS)弄过一遍就没有什么好学的了。想自己在SAS里面开发自定义模块,困难重重。另外有很大一部分原因是因为R的挑战。R最近几年的发展让人目不暇接,已经成为定量金融,生物信息学和网络分析领域的行业标准。而这三个领域恰恰是发展最快的三个领域。学习R,很快就能开发自己的package,放到CRAN上面就可以扬名立万。所以从职业生涯考虑。有能力的新人不愿意学习SAS,造成了好的SAS Programmer青黄不接。

R 的突飞猛进,一个方面因为它是开源的,学习起来很方便,不像SAS要考虑买许可证或者满世界找盗版。想用什么package,敲几个指令就行了。另外一个方面是因为原来制约R发展的内存瓶颈消失了。像Matlab和R这样的矩阵语言,里面的garbage collector不能像通用型编程语言(Java,Python等等)那样快的清空物件,所以内存很容易不够用。现在是64位时代了,买个4G以上的内存不贵。流行的分布式计算(Map/Reduce, Hadoop, Hive)和云计算也帮助解决了这个矛盾。在Amazon,Facebook,Google的数据中心里面,很容易从几千台机器里面集中几T的内存,跑跑R没有问题。大胖猫用过Amazon的EC2服务,价格很公道,也不用掏钱买另外的机器。而SAS对于比较大的数据,则只有望洋兴叹了。

SAS 每年的营业额大概是20亿美元,人数只有它1/3的Teradata的营业额也是这么多。要想提高营业额和利润,把注意力集中在电信,银行,保险,医药这些高端客户,是SAS必然的选择。SAS和Teradata都是历史悠久的老公司,SAS从60年代一个做田间统计的小软件发展到现在横跨各个领域的大家伙,的确不易;Teradata是关系型数据库的开创者,Oracle和Sun都是 这个领域的后起之秀。SAS和Teradata的确也有互补之处;也许未来两者合并,更加符合股东的利益。SAS正在开发的并行procedure就是为Teradata专门设计的。SAS的老板,Dr. Goodnight或者不愿意失去对SAS的控制权,但现实上现在的市场恐怕容不下专门的分析软件公司了。统计软件界另一个和Goodnight齐名的传奇人物,Dr. Nie,果断卖掉SPSS是一个正确的选择,借助IBM的国际影响力,SPSS在世界其他国家卖的还不错。将近七十岁的老聂看到R的潜力,重新创业,现在他的Revolution R看上去发展势头不错。如果他还呆在SPSS,现在的情况就很难说了。

由于 SAS 是行读入的,所以特别适合整数据,我经常没事到各个论坛找些题换几种做法做做,其实跟电脑游戏一样好玩。感谢SAS帮我学会了统计和编程,伴我度过异国他乡的漫漫长夜。虽然属于SAS的华丽时代不会再有,但我仍会纪念开创那个时代的伟大的SAS程序员。Old SAS programmers never die, they just fade away.

2011年3月11日日本福岛9.0级大地震以后,紧接着是海啸,跟着福岛核电厂接连发生爆炸。如果开始还可以说是电影《日本沉没》的剧情的话,那核电站爆炸的后果,可就有点像《生化危机》前奏的味道了。

民众对于核辐射污染的担心要远超过地震和海啸。就拿前几天国内发生的碘盐抢购事件来说,虽然主要原因是民众对政府的不信任(对比日本灾民的有序和平静),但很大的恐慌来自于人们对核辐射的危害的恐惧。

从各国对核武器的态度以及实际行动上看,核武器和核污染基本不沾边。一旦发生了核污染,那必定是和核能电站有密切关系。而这几年,我国政府既要保证高速经济增长所需要的电力能源,又要尽力控制二氧化碳排放,那大力发展核能便是上上之选了。本来这等国家大事和我等小民也没什么关系,不过上次回老家,偶然听说河北要建四座核电站,其中一座就在离我老家不足4公里的位置

枕头边上放一个随时爆炸的定时炸弹,这事不关心也不成了。随手翻了翻网上的资料,发现前期的选址和研究审批已然结束。(我等一厢情愿的认为,这种事情是应该公投的,至少要听证一下吧。从现在我周围人态度上看,肯定不可能通过。如果通过了,我们那儿将继重污染企业首钢搬迁后,又一次为伟大祖国首都——北京做的巨大贡献)。

核能是潘多拉盒子,这次日本的核泄漏给大陆敲响了警钟,有评论说,两会上刚刚获得通过的“十二五”规划中的核能规划后续也可能会有很大变动。和普通人一样,我也怕核辐射,更怕核辐射毁掉家园。核能电站的建设需要有极专业的考证和后续严谨的政府管理,如果我是日本人,我相信这两点。但不幸的是,我是中国(大陆)人,这两条我都不信任。一个最基本的常识上——核能电站不应该建设在地震带上。

最近花了一些时间,零零散散地收集了一些数据,附一些分析。还是那句话,我等小民虽说不能决定此等国家大事,但心里明白明白也是有必要的。首先是世界范围,各国拥有核电站的数量:

可以看到,世界范围核电排名前四的国家分别是美国、法国、日本,俄罗斯联邦,我国排名第十,和发达国家确实有段距离;这排名前四的几个国家的核电基本都是在1970-1990时间段建设,而近十年发展速度明显降了下来。但反观中国大陆,大部分核能电站都是在2000-2010年期间修建,并且在规划中的核电站(反应堆)更多。

而从日本核电站事故上看,核能电站修建在地震多发地带是非常不明智的,即便是有多重的防护措施。我们关注一下,地震多发地带和核电站分布重合的程度。下图标记了1973年至2010年,世界范围内的1级(包含)以上地震分布(红色为实际的地震发生地点,蓝色为当年发生地震的密度),以及每年各国存量核电站(绿色点标记)的情况:

左下角的小图是1973年至今所有世界一级以上地震发生的高概率区域,从这个小图上看,日本、美国西海岸、南美洲西海岸是高发地震区域。最近发生在这三个区域的大型破坏地震有:智利2010年8.8级、日本2011年9.0级、美国加利福尼亚州2003年6.5级(不过加州的这次好像还不够,有报道说可能还会发生更大级别的地震)。

美国的大部分核电站都修建在东部地区,而在地震高发的西部地区,核能反应堆的数量明显很少,最大程度的降低了地震对核能电站的影响;而日本就比较郁闷了,整个国家都处在地震高发区上,核电站修的又很密集,出现3月11日的事件有其必然性。

那对于我国呢,不言自明:修在唐山这种时不时就震一下的地方是绝对不应该的,修的话向内陆靠一靠,离地震发生高概率区域远一些!

最后在扯一句,大地震似乎总和核爆有关系,包括中国汶川、日本福岛,随便搜一搜可以罗列关于很多核试验的传闻。也许渺小的人类看到的毁灭性的灾难都是一个样子吧。

附:

数据

0%