Categories
读书有感

Bootstrap + subsample: simple, efficient, then elegant?

继续昨天。早晨一起来,看到施老师的一句简短评论,瞬间人就清醒了。然后跟做错了事的小孩子似的,惴惴不安的跑到office里面,翻墙,开始下paper。

现在的节奏基本上是白天开会写代码,晚上回家看paper,哎,不看心里总觉得好惶恐。还好中间等车等了蛮久的,顺便就借着六七点昏黄的路灯把这篇不算太长的paper看完了。有趣的是等车的时候碰到一位同事,然后我俩就开始呱唧呱唧的聊起来统计推断了...不知道当时旁边的路人是不是一道黑线,幸好当时把ebay的牌牌藏在了衣服里面...

这篇不算长的paper是:Bootstrapping Big Data,UC Berkeley 计算机系一群人鼓捣出来的。idea很简单(符合第一标准,simple),就是在大数据上(无放回的随机抽样)取一些subsamples,然后在这些subsamples上面做bootstrap,然后把结果取平均数。

这样的好处显而易见,天生的分布式算法,把数据随机分布到各个计算节点就可以了。然后bootstrap也不用占那么大的内存了,空间时间都省掉了,所以符合第二标准:efficient。

最后,就是还是比较effective的,有着良好的渐进收敛性质。和直接的bootstrap相比,它不仅保持渐进一致,而且有着更高的收敛速度,还是天生并行的...过年回济南的时候joke童鞋(高中同学)去火车站接我,然后我们就兴致昂扬的聊起来大数据和算法并行问题了...是不是有点天雷滚滚?哇咔咔,大过年的...好久没见竟然是如斯叙旧,汗。

此外,还可以结合binning的思路做一些weighted calculation,这样又进一步节省了时间。

不知道这样是不是就足够的elegant了...我看了一眼converging rate 还是比较好看的。伪代码思路也是简单得很。还可以用在各种现成的线形非线性、参数非参数模型上,真是瞬间变身并行高富帅。貌似和前段时间看到的rmr2包里面做OLS并行的思路有点像,待我细细研究一下。

algorithm

唯一的concern就是这东西更适合hadoop而不适合teradata,哎。我没法在TD上控制节点的分配,这个比较讨厌。Hadoop可以直接写并行map reduce,就会方便很多了。

 

先看了这一篇简介,后面慢慢地研究一些理论证明什么的,有点too good to believe...还是先找点数据测试玩玩吧^_^
efficiency

Categories
读书有感

「Data Manipulation with R」若干笔记

最近两天读R的手册效率奇高无比,果然是和跟taiyun说起的一样,“有需求便有动力”。昨天一上午看完了ggplot2的手册,虽然有些晦涩难懂,但是还是很好的体系理解。p.s. ggplot2新手推荐「Cook Book for R」,先用起来再慢慢回头看原理嘛。ggplot2也是延年益寿的利器,嗯...默认的图都看起来好专业,嘻嘻。

回到本文的正题。看完了ggplot2之后,下一本被我扫荡的手册就是「Data Manipulation with R」,基本的数据整理操作。虽说数据整理是一件很没有技术含量只是耗时间的事情,但是正因如此节省起来时间也是大把大把的,顿时觉得人生加速运行了好多。说来惭愧,用R也有些年头了,一直没有静下心来好好的研究基本的R数据操作方式,总是遇到问题才会亡羊补牢似的上网开始搜,好在现在stackoverflow.com这些网站累积了大量类似的问题,所以搜起来也算方便。但终究不是个长久之计,当忍者太久了总觉得还是应该老老实实的学习一下王道正术。于是,开始花些时间细细的研读起在R里面收拾数据的那九九八十一招。

简单记录一些以前忽略的函数之类的。很多来自神奇的plyr包,如果直接?调不出来帮助那就先加载这个包吧。

  • expand.grid() : 最开始用R的时候,数据都是教材里面给的,整理的规范的很,基本就是调用一个lm()之类的函数扔进去就可以了,所以习惯于直接用factor类型相乘。后来发现经常要建立一些factor相乘出来的矩阵/data.frame之类的东西,却一直不知道怎么办。终于找到了这个函数,嘻嘻。哎,我是有多么懒才一直没有去搜这个需求啊。
  • cut():yihui兄前阵子提到的非常elegent的函数之一(另一个是with(),哎我居然连这个都一直没注意过),基本就是把连续变量离散化,即numeric型的数据转换成factor型的万能钥匙。
  • which():可能以前也没大用到类似的需求,所以没注意。一般来说,对于逻辑型的数据(很多数据筛选问题最后都可以归为逻辑型数据问题),只是选择出来符合条件的元素还是比较容易的,所以一直没留意这个函数。简而言之,就是这个函数返回的不是符合条件的元素的值,而是他们的位置(比如在一个vector中的位置,即下标)。这样有时候还是比较方便的~
  • with():这个就不多说了,基本拯救了需要attach(), detach()的地方,不用常年打dataframe的名称了。p.s. 不知道是什么缘故,很多R的教程上会用attach/detach,但实际中其实很不建议使用啊,容易把object搞混的。
  • arrange():当你需要对一个data.frame进行按照多列依次排序的时候,就不需要依次order了。说来有趣,它的函数帮助里面简洁明了,“This saves a lot of typing!”,可以少打字的都是好东西,嗯嗯。
  • cat():其实也用到过,只是很多时候更习惯paste(),毕竟不是所有的时候都要直接输出。不过需要的时候,还是比print()加paste()方便一些吧。看思考习惯了。
  • substring():常年只会用substr(),其实这两个函数蛮像的,只是参数不同。部分情况下substring()会更方便一些,不过反正有length(), nchar()这种东西,其实问题不大。
  • aggregate(), cast():前几天gaotao回复的时候提到的函数,其实某种程度上我现在更喜欢data.table()了...
  • apply类:sapply(), apply(), lapply(), mapply(),基本就是消灭显式循环的利器(当然消灭循环不仅仅是美观目的,还是提高效率的不二法宝,后面更是各种并行处理的基本架构函数,比如RHadoop重写的那堆函数)。当然,其实有的时候我会更倾向于把显式循环写出来(如果循环量不大比如<10而且每一次循环都还挺快的话)。这么做虽然效率上牺牲了一点,但是提高了代码可读性啊,就不用写很多注释提醒自己为什么当时这么弄了。由此可见我的编程水平基本停留在翻译脑子里面的逻辑化思维过程的模式,并没有实质性的在程序本身架构的角度来思考编程逻辑。咳咳,人家是做分析的,不是码农,效率的问题交给专业人士去解决吧,我更喜欢专注于思考分析的逻辑(多么苍白无力的狡辩,从来不肯在编程上原理上多花功夫的孩子飘过)。

暂时就是这些,最喜欢的就是R这种无限的可能性,总有人会贴心的帮你写好很多函数,然后傻傻的打一个?,看看函数怎么调用怎么附上参数就可以了。这才是美好的人生嘛,不喜欢过多关注那些脏活累活背后的原理,计算机自己辛苦去好了(当然还有那些辛勤的R包开发者们,嘻嘻,谢过大家的努力劳动)。不是有句话么,「科技都是为懒人服务的」。越来越赞同taiyun这次在北京R会上的惊人之语——省时间就是延年益寿。