Beta

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

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日的事件有其必然性。

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

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

附:

数据

Rexer Analytics 关于数据挖掘的年度调查开始于 2007 年,本次(2010年)是第四次年度调查,原文链接在这里

调查的关键要点如下:

1.调查样本量

2010年前期,735个参与者,来自于60个国家

2.数据挖掘覆盖领域

数据挖掘覆盖很多领域,但CRM/Marketing在过去的几年一直排名第一。

3.涉及算法

决策树、回归、聚类是主要的使用方法,但其他算法也被广泛使用。虽然第一次涉及 Ensemble Models,但22%的人宣称正在使用。

4.模型

三分之一的建模人员使用了10个及以下的变量建模,同时28%的建模人员宣称模型一般使用45个以上的变量

5.工具

随着过去几年稳定的增长,开源数据挖掘软件R已经成为挖掘人员的首选(43%),其次是 STATISTICA(18%)。STATISTICA、IBM SPSS Modeler 和 R 在2009、2010年被参与调查的挖掘人员给了最高满意得分。

6.技能

数据挖掘依然主要发生在个人电脑上(而不是服务器),数据一般也是存储在本地。模型的结果依然主要依赖于软件本身。STATISTICA 用户比其他软件用户,更倾向于使用PMML标准。

7.挑战

脏数据,数据挖掘概念的普及、对数据的访问

8.未来

参与调研的人员对于数据挖掘还是非常乐观的。这个领域仍然有上升空间,只有13%的挖掘人员给自己的公司的分析能力评为“excellent”,只有8%的人认为他们的数据质量可以被认为“very strong”。

同往常一样,一些评论:
  1. 鉴于数据挖掘从业人员的总体数量,有735个样本已经很不错了。
  2. CRM/Marketing在中国国内也依然是数据挖掘最重要的应用领域。
  3. 比较惊讶的是,Ensemble Models 居然在国外的使用率已到到22%。
  4. 模型的变量问题是具体业务所决定,甚至是效率、成本的考虑,多少都是正常。
  5. R语言成为挖掘人员的首选工具是必然的(包括在 KDNuggets 上的调查也是如此)。当然如果从数据分析的本源出发的话,R语言有不可替代的天然优势。
  6. PMML标准依然可以在R语言上实现,感谢Graham Williams和他的同事。
  7. 挑战估计是每个挖掘从业人员都遇到过的问题,大家多多交流吧
  8. 数据挖掘的未来是美好的,毕竟我们生活的世界数据越来越多,扔在那儿太可惜了~~

集智俱乐部是我最近两年来比较关注的俱乐部,尤其集智在三号会所的线下活动,一帮来自五湖四海、背景迥异的年轻人,因为一个共同感兴趣的主题,各抒己见(头脑风暴),过程非常奇妙。至今依然清晰的记得第一次参加集智活动时,大家对超自然(超能力)现象的热烈讨论。说实话,当时刚听完报告,还以为进入一个邪教组织了,呵呵~~

2010年12月9日,集智俱乐部的 计算士 和 Jake 发布了头脑风暴论坛数据分析报告。报告很有趣,其中讲到了 Zipf 定律和以社会网络分析为主的网络骨架图。Jake 同时将头脑风暴论坛的数据发布,数据为XML格式文件。而我,恰恰对头脑风暴论坛的兴趣也是非常浓厚,所以这边本地将这些数据处理了一下(大家可参考这里),并作了一些简单分析同大家分享。

首先是头脑风暴论坛中最为关键的几个actors:

这里考虑了两个因素,网络的 Eigenvector Centrality 和 Betweenness Centrality(即vertex和edge信息),从上图看:jake 的地位最高,且Eigenvector和Betweenness相差较小;紧随其后的是东方隐,当然这个紧随其后是指相对概念。

由于 jake 的地位(重要到有点儿离群点的意思了),其他会员的状态不是很明显,所以考虑将 jake 这点去掉:

这样处理以后,除 jake 和 东方隐 以外的用户状态浮出。如果主观上增加“第二梯队”的概念(除去jake和东方隐两人,个人对头脑风暴论坛不是很熟悉,权且这么划分。当然也可以做个聚类啥的,不折腾了),那么属于这一梯队的ID包括

zcard2000、ruiaijun、黄淼鑫、计算士、Michael0607、天狮星11、飞鸟、yywwkk等。

问题来了,论坛上这些比较重要的actors是如何组织在一起(相互作用)的呢?

上图为重要节点的网络图,不难看出:jake 在头脑风暴论坛的地位是无可替代的,牢牢地占据论坛关系中最核心的位置,估计这种结构在COS论坛也同样存在,其中的核心不用我多言,哈~~

还有就是东方隐这个节点也非常有意思,需要关注。但详细的说明,这里就省略了,毕竟对头脑风暴论坛不像统计之都那么熟悉,硬搬着去解释,难免贻笑大方。简单陈述一下绘制关系图的原则:

  • 同计算士绘制的骨架图一样,这里也同样将一些不太重要的节点做了删除处理(subgraph),只留下了重要节点的骨架;
  • 骨架中的节点也并不是每一个都做了展示,而是通过 Eigenvector 和 Betweenness 的对比,将差异比较明显的节点做(名称)展示。而表示为红色的节点大小即为二者差异的大小。

写在最后

这篇文章实际上写的非常仓促,有很多细节考虑不是很完备,并且从数据上看,能够展现的也不止上面的一些信息(比如发帖时间的分析、还有一些条件密度类的内容,等等)。但与其无限期放在草稿箱里,不如直接放出来。因此这篇文章可能会有比较大的改动(主要是绘图部分),但什么时候,就不得而知了。如果有集智俱乐部的童鞋看到这篇文章的话,多多指正,并——欢迎在统计之都上讨论。

关于集智俱乐部

2003 年,集智俱乐部创始人张江(Jake)创办了集智俱乐部网站,该网站一直致力于宣传、普及、推广复杂系统科学,并展开广泛的跨学科交流,俱乐部渐渐聚集了一批有识之士。 5 年后的 2008 ,集智俱乐部的交流和活动开始从虚拟世界走向现实,并尝试发展一个现实世界中的学术组织。目前集智俱乐部的日常管理工作由集智核心成员负责,主要活动有开放式的讲座与交流,以及其它主题小组活动。……

前些天在准备中国第三届R语言会议(上海)的时候, 翻到以前记录在Google Notebook里的一些材料, 一篇是关于Google Codes关于R代码的规范,非常值得借鉴。

规范这个东西平时多多注意一些还是有好处的,就和作文一样,漂亮的字体总能有不错的加分。这里就不翻译原文了,摘一些 tips 供大家参考:

R风格规范

文件命名

以 .R 结尾的文件必须有实际意义,比如

GOOD: predict_ad_revenue.R 
BAD: foo.R

变量名和函数名

  • 变量名建议使用小写字母和dots,比如 variable.namevariableName 也是可以被接受的
  • 函数名起始字母为大写,不能包含dots,如 FunctionName

间隔和间距

  • 所有的二元运算符(=, +, -, <-, etc.)两端均需要有空格。
  • 不要在逗号前增加空格,但逗号后必须有一个

比如:

tab.prior <- table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[, 1])
total <- sum(x[1, ])
  • 在左括号前应增加空格,除了 function call 情况
1
2
3
4
5
# GOOD: 
if (debug)

# BAD:
if(debug)
  • 多余的空格是允许的,比如为了对齐增加可读性:

    plot(x = x.coord, y = data.mat[, MakeColName(metric, ptiles[1], "roiOpt")], ylim = ylim, xlab = "dates", ylab = metric, main = (paste(metric, " for 3 samples ", sep = "")))

大括号

左大括号不能独立成行,右大括号必须独立成行(除else情况),比如

if (is.null(ylim)) {
  ylim <- c(0, 0.06)
}

else情况的标准写法:

if (condition) {
  one or more lines
} else {
  one or more lines
}

行长度

不应超过80个字符

缩进

严格使用两个空格,不能使用 tabs

赋值

尽量使用 <-,而不要使用 =

一般性声明

如果我们遵循一致的声明,对代码的阅读和理解会更快更准确。这里包含

1. Copyright statement comment
2. Author comment
3. File description comment, including purpose of program, inputs, and outputs
4. source() and library() statements
5. Function definitions
6. Executed statements, if applicable (e.g., print, plot)

注释

  • 一定要注意在代码间增加你的注释。长注释以 # 开始,后跟一个空格
  • 短注释发生在代码后,两个空格间隔,# 开始,后跟一个空格
1
2
3
4
5
6
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
breaks = "scott", # method for choosing number of buckets
main = "Histogram: fraction budget spent by campaignid",
xlab = "Fraction of budget spent",
ylab = "Frequency (count of campaignids)")

函数定义

  • 函数的定义,优先无默认参数值的参数,有参数值的参数在后。
  • 每行一个参数是允许的,但有参数值的赋值不能断开。
1
2
3
4
5
6
# GOOD:
PredictCTR <- function(query, property, num.days,
show.plot = TRUE)
# BAD:
PredictCTR <- function(query, property, num.days, show.plot =
TRUE)

函数文档

  • 函数在定义完成之后需要紧跟注释内容
  • 注释内容包含一句话对函数的描述,每个参数(arguments)的描述,用 Args 表示;以及返回值的描述,用 Returns 表示。
  • 注释必须非常清楚,调用者可以不用读后续任何代码就可直接调用。

示例:

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
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {
# Computes the sample covariance between two vectors.
#
# Args:
# x: One of two vectors whose sample covariance is to be calculated.
# y: The other vector. x and y must have the same length, greater than one,
# with no missing values.
# verbose: If TRUE, prints sample covariance; if not, not. Default is TRUE.
#
# Returns:
# The sample covariance between x and y.
n <- length(x)
# Error handling
if (n <= 1 || n != length(y)) {
stop("Arguments x and y have different lengths: ",
length(x), " and ", length(y), ".")
}
if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
stop(" Arguments x and y must not have missing values.")
}
covariance <- var(x, y)
if (verbose)
cat("Covariance = ", round(covariance, 4), ".\n", sep = "")
return(covariance)
}

TODO注释

用于指明临时代码、短期解决方案或足够好但还不够完美的地方。username处写的是了解该问题详细情况的人的名字,并不是指实际解决该问题的人。因此,当你建立一个TODO时,写上你自己的名字就可以了。 例如:

1
# TODO(liusizhe): Remove this code after the NewService has been checked in.

R语言规范

attach

避免使用它

对象和方法

  • 在S语言体系下有两套对象的定义,S3和S4,且都可以在R中使用。
  • S3体系的方法更加灵活、交互性更好,S4更加正式和严格。两套体系方法可以参考这里
  • 尽量使用S3体系,除非有足够的理由使用S4
  • 绝对要避免混合使用 S3 和 S4 的情况

声明1:估计这篇博文的受众会很少很少……

声明2:请将下载的漫画于24小时内删除,balabala……

话说到,为了保护我已经不太好的视力,前几天购置了一台Kindle DX,用来阅读电脑上大量存在电脑中的的pdf格式电子书。这个东东确实比较强悍,除了对这些pdf文字书籍支持比较不错外(当然有些书籍需要进行一些处理),对pdf格式的漫画支持更赞。

而我是一个彻底的漫粉,闲暇之余,从网上下载jpg格式的漫画(推荐下载工具ComicAiII),悠然自得看漫画,实在惬意的很~~

不过,有些下载的漫画有些问题,比如下面的这种的:

如果直接合并为pdf在Kindle DX上阅读,纵向显示的话,上下各有很大一块白边,画面非常小;

如果横向显示,效果更差,底部有一部分不能显示。想看完两页漫画的话,需要向上下翻页反复操作:

琢磨来琢磨去,还是得手动把漫画裁剪为适合Kindle阅读的大小(Kindle DX的标准9英寸屏显示区域和32开纸大小接近),并且把裁剪后的漫画顺序调换(日本漫画的阅读习惯是从左向右)。

说白了需要对每页jpg漫画做两件事:
  • 从中间分割,将一张jpg图片变为两张;
  • 为左右两张子图的增加顺序标记。

如果将分割的两张图片,右边图增加_0,左边图增加_1,即可满足要求。拿上面的086.jpg举例:170页(即右边部分)会被命名为086_0.jpg,171页会被命名为086_1.jpg,由于有了0、1标记,这样所有更新过的jpg合并为pdf文件的话,即可保证顺序的正确。

这一过程使用ImageMagickR来实现(Windows XP平台):

假如你的火影忍者的目录为D:/漫画/Naruto04,文件为001.jpg、002.jpg……,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
setwd("D:/漫画/Naruto04")
dd <- dir()
ff <- function(x){
convert &lt;- paste("convert " , x ,
" -crop 2x1@ +repage +adjoin ",
"%d_",substr(x,1,3),".jpg",sep = '')
shell(convert)
reverse0 &lt;- paste("convert " , "0_", x ,
" ", substr(x,1,3), "_1.jpg", sep = '')
reverse1 &lt;- paste("convert " , "1_", x ,
" ", substr(x,1,3), "_0.jpg", sep = '')
shell(reverse0)
shell(reverse1)
shell(paste("del " ,"0_", x , sep = ''))
shell(paste("del " ,"1_", x , sep = ''))
shell(paste("del " , x , sep = ''))
}

for (j in dd) ff(j)
shell(paste('convert *.jpg ', '1.pdf',sep = ''))

注意:目标文件夹的所有文件将被替换!

最后要强调的是,虽然 Kindle 没有辐射,和一般的纸质书区别不大,但看多了仍然有损视力 ^_^

0%