星期五, 三月 30, 2012

新书推荐:Machine Learning in Action


如果你经常阅读原版书籍,那你应该对那些印制精美的封面有很深刻的印象。例如O'Reilly的软件开发系列,都是采用最为简洁的黑白铜版画,主题是一两只珍稀动物。而另一家著名出版商Manning出的软件系列图书,封面上的图案均选自1799年初版于西班牙马德里的一本各地服装简编。这些丰富生动的图片表明了世界各个区域的独特个性。使用这种封面设计意在让这本简编中的图片重现于世,由此来庆祝计算机业的创意、进取和乐趣。

Manning的实战系列(IN ACTION),是为了使用户能快速上手,以解决实际中遇到的问题。基本上该系列书不大适合零基础的入门读者;目标读者是那些对书中知识有基础的了解,并有过简单的模仿实践,但是无法真正将该技术应用于实践的中初级读者。《Machine Learning in Action》正是这样一本中级进阶图书。它将基本的机器学习理论与实际的运用工具(Python)相结合。该书回避了复杂的数学原理(如果你需要机器学习背后的数学知识,可以参考The Elements of_Statistical Learning),提供了大量的案例和代码来实现各种机器学习算法。你可以略加改动就可以将这些代码用于数据处理、分析和可视化工作中。即使你不用Python也很有参考价值。

星期二, 三月 27, 2012

用R来进行布丰投针实验

在3月14日也就圆周率日那一天,果壳网推出一篇文章《圆周率日特献:π究竟牛B在哪里?》。其中就提到了布丰(Buffon)用投针实验来计算π的近似值。不过这篇文章并没有详细说明如何用软件来做这个实验,也看到网上有朋友在问具体的过程。所以本文尝试用R来实现这个实验,算是狗尾续貂以作消遣。另外,Maxtrix67魏太云都对这个问题有过精彩的论述,有兴趣的朋友可以参考一下。

简单来讲,投针实验是指假设有两根平行的线,它们之间的距离是1。随意抛掷一根长度为0.5的针,那么投针便有机会与平行线相交。如果总的投掷次数为N,发生相交的次数为X,那么可以用N/X来估计π的值。具体的故事和公式还可以参考这个文章

星期一, 三月 26, 2012

Twitter的数据科学家是如何工作?

本文翻译自technologyreview对Edwin Chen的一篇访谈文章Edwin Chen是一位在Twitter工作的数据科学家,在为Twitter工作之前,他在麻省理工学院学习纯数学和语言学。在这个访谈中, Edwin Chen给我们分享了一些数据科学中的神秘艺术。数据科学可能是目前美国增长最快的领域。现在还没有关于数据科学的教科书或大学课程,然而它整合了许多领域的技术,从华尔街量化交易到网络上的广告定位,以及现实世界中的供应链优化。通常从事数据科学的人士都需要受过严格的数学训练。

在Twitter数据科学家都做什么?
我们做很多事情,比如说构建机器学习模型,并完善大规模数据的处理框架;进行数据可视化或是统计分析;寻找更好的方式来理解我们的用户。有很多不同的工作,它取决于每个人的技能和兴趣。例如,在某些时间,我可能会尝试新的广告定位算法,以MapReduce方式来挖掘海量的推文。为数据建立互动的可视化图形。编写报告解释一些新的发现,在MTurk进行一些实验。

星期六, 三月 24, 2012

如何使用reshape包进行数据汇总

在数据分析过程中,利用各种图表进行数据探索是必要的前期工作。描述性统计中就包括了直方图、散点图等工具来探索连续数据,对于分类数据,则可以采用条形图、交叉分组表等工具。Excel中所谓的“数据透视表”,其实就是一个交互式的交叉分组表。在R语言中可以很容易的用table()等函数得到相应的结果。对于一些更为复杂的任务,就需要其它的函数或包来完成。本例先以iris数据集为研究对象示范一些基本函数的用法,再介绍reshape包的强大功能。

iris数据集中有五个变量,其中Species表示鸢尾属花的子类,其它四个变量分别是花瓣和萼片的长度和宽度。你可以用head(iris)来观察原始数据的一些样本。我们的第一个任务是想计算不同种类花在四个指标上的平均值。用到的函数有tapplybyaggregate这篇文章对它们有所涉及。

星期三, 三月 21, 2012

R语言编程入门之七:程序查错(完)


写程序难免会出错,有时候一个微小的错误需要花很多时间来调试程序来修正它。所以掌握必要的调试方法能避免很多的无用功。

基本的除错方法是跟踪重要变量的赋值情况。在循环或条件分支代码中加入显示函数能完成这个工作。例如cat('var',var,'\n')。在确认程序运行正常后,可以将这行代码进行注释。好的编程风格也能有效的减少出错的机会。在编写代码时先写出一个功能最为简单的部分,然后在此基础上逐步添加其它复杂的功能。对输出结果进行绘图或统计汇总也能揭示一些潜在的问题。

星期一, 三月 19, 2012

如何用21点来击败赌场?


21点也许是世界上最受欢迎的扑克牌游戏之一。玩家要尽量使手中牌的点数和达到21点,或是接近21点,但不能超过,再和庄家比较点数和的大小以定输赢。熟悉概率的诸位都知道,在赌场的各类游戏中,庄家有着绝对的优势。但二十一点却是唯一有机会击败庄家的游戏,也是最需要冷静和计算的游戏。其秘诀就在于记牌和算牌,即玩家要记住所有打出去的牌,然后再决定如何打剩下的牌。

为什么记牌能够有用,其原因在于条件概率。假设赌场使用一副牌来玩21点,庄家发出牌来,你拿到两个10(包括了J、Q、K),庄家亮牌也是10,翻出底牌来还是10,那么下一轮里10出现的概率已不再是4/13,而是12/48,即1/4,略低于4/13。所以在21点的各轮之间(在重新洗牌之前),出现10点的概率不再是独立的。前一轮出现过的牌,会影响到下一轮。因此,如果我们能记住前面出过什么牌,就能大致预测以后的赌局,从而占到一定的优势。

星期日, 三月 18, 2012

ggplot2的新特性:升级版的二维直方图

ggplot2包可称得上是R语言中最为复杂和炫目的绘图包了。本博客也用了一系列文章对该包进行了介绍。在最近的3月初,其版本从0.89升级到了0.90,升级后的新版本提供了许多新的功能。其中之一是加强了对二元变量统计指标的显示能力。在之前的版本中,只能在图形中显示一元变量的统计指标(stat_summary)。对于二元变量只能显示简单的计数指标(stat_bin2d)。新版本相当于在二者基础上的升级,其主函数为stat_summary2d或者stat_summary_hex。下面我们先来熟悉下老版本中的两个函数,再介绍新函数。还有一点要注意的是,R内核需要升级到2.14以上才能使用新的ggplpot2。

本文的例子是R中内置的钻石数据(diamonds),其中用到的变量包括价格(price),重量(carat)以及某种尺寸指标(depth)。先绘制carat和price之间的散点图来了解二者关系,从下图可见,由于数据量过大,尽管使用了透明度参数,散点仍非常密集。

星期五, 三月 16, 2012

R语言编程入门之六:循环与条件

循环
for (n in x) {expr}
R中最基本的是for循环,其中n为循环变量,x通常是一个序列。n在每次循环时从x中顺序取值,代入到后面的expr语句中进行运算。下面的例子即是以for循环计算30个Fibonacci数。
x <- c(1,1)
for (i in 3:30) {
    x[i] <- x[i-1]+x[i-2]
}

while (condition) {expr}
当不能确定循环次数时,我们需要用while循环语句。在condition条件为真时,执行大括号内的expr语句。下面即是以while循环来计算30个Fibonacci数。
x <- c(1,1)
i <- 3
while (i <= 30) {
    x[i] <- x[i-1]+x[i-2]
    i <- i +1
}

星期三, 三月 14, 2012

数据挖掘工程师面试指南


数据挖掘领域是一个独特的行业,通常的招聘面试方法可能不大适用于本行业的特点。在招聘一个合格的数据挖掘工程师时,公司一般关注以下三个方面:
  • 他聪明吗?聪明意味着能透过复杂的信息建构问题并以正确的方式加以解决。聪明人还能从失败中获取经验。
  • 他能否专注于项目?专注意味着在各种困难的环境内,仍能独立或合作完成项目。
  • 他是否能与团队一起工作。团队合作需要很好的沟通能力,工作中涉及到的概念、问题、模型、结论等都需要成员之间正确的沟通方能加以明确。
为了解候选人是否具有数据挖掘工程师的潜质,需要一小时的面试,主要通过以下五个环节:

星期日, 三月 11, 2012

需要几次相亲才能找到靠谱的她/他?

谈到相亲就不得不提到著名的麦穗问题。说有一天,苏格拉底带领几个弟子来到一块成熟的麦地边。他对弟子们说:“你们去麦地里摘一个最大的麦穗,但要求只能摘一次,只许进不许退,我在麦地的尽头等你们。”可以看得出,相亲这种活动就有点类似于摘麦穗,在等待和决断之间达成平衡是解决问题的重点。

将上述的麦穗问题进一步抽象就是一个经典的概率问题。若一个袋子里有100个不同的球。每个球上标明了其尺寸大小。我们每次随机无放回的从袋中取一个球出来,观察其大小属性之后需决定要或是不要。如果要,取球就此停止。如果不要, 再继续取球,但不准再回头要原先的球。这样下去,直到100个球取完为止。目的就是取到那个最大的球。

对于这个概率问题,一种思路就是取1到100之间的某个数字n,以它作为分割点将整袋球划分为两组,第一组即从第1个到第n个球,第二组即从第n+1个到第100个球。我们以第一组为观察对象,找到第一组中最大的球M,记录其大小但并不行动。然后从第二组中寻找大于M的第一个球,选取该球。那么n应该设为多少,才能使取到最大球的概率最高呢?Ross在其《概率论基础教程》中已经给出了解析解,n应该取在1/e,也就是所有数目的37%处。

星期四, 三月 01, 2012

重磅推荐:《机器学习之黑客帝国》


好吧,我承认这个书名翻译的有点霸气,但它的确是配得上这个名头。《Machine Learning for Hackers》是由O'Reilly出版的关于机器学习领域中R语言应用的新书。 在这里所谓的“黑客”并非是喜欢侵入计算机的那帮人,而是那些“喜欢用新技术来解决问题”的人。而机器学习通常与数据挖掘、知识发现等术语一同使用,往往被认为是一个黑箱,它们广泛利用各种算法来进行数据预测或分类。

这本书利用了统计分析方法来打开这个黑箱,并解决现实生活中的预测和分类问题。该书并没有过分纠缠于公式与原理,也绝不仅是提供一个菜单式操作的傻瓜书。该书取中庸之道,以机器学习的原理应用为重点,结合大量R语言编程和案例,使读者更好地理解如何解决问题,以及为什么可以这样做。本书重点不仅覆盖了各种建模方法,而且而示范了真实的数据分析工作中会遇到的障碍,例如数据清理和转换。