所有由肖凯发布的文章

关于肖凯

喜欢玩R语言和博客的家伙,个人博客:xccds1977.blogspot.com,微博:@xccds

Python的七种武器

君子生非异也,善假于物也。

“物”能够延展英雄的能力。它是吕布的赤兔马,杨过的玄铁重剑,CS中的沙漠之鹰,曹操传中的凤凰羽衣。“物”也可用以治愈英雄,例如张无忌的黑玉断续膏,李逍遥的天香续命露,还有深夜里TVB的一碗面。

赤兔

对于不同的位面,有着不同的宝物定义。对古时文人来讲,笔墨纸砚,是当时具有生产力输出的四大工具。对程序员来讲,当代的“文房四宝”不外乎是:笔记本,大屏幕,机械键盘,人体工学椅,Google,Github这几种。特别是机械键盘和人体工学椅,它们是极为重要的“人机接口”。前者可以用来延展英雄的输出能力,后者可以用来治愈英雄的腰椎。

机械键盘

在数据领域也有类似的情况。一个数据项目,最重要的是定义问题,其次是拿到好的数据,再次是找到合适的方法,最不重要的可能就是选择一个工具了。但是看起来最形而下的工具,却是最具体而真实的“人数接口”。用一种顺手的工具来玩数据,我们会觉得比较舒服,输出效率更高。

市面上的分析工具大致分为两大类,菜单式的工具和命令行式的工具。前者适合于初学入门,类似于跟团旅游,提供了固定的路线。分析套路比较固定化,点几下鼠标就可以搞定也很省事。后者适合于老手玩家,类似于自由行,需要自己规划数据工作流,适用于自定义的灵活分析。大多数用户害怕命令行,然而使用命令行才能掌握真正的力量。命令行是Jedi的原力。

在命令行工具类别中,最耀眼的是R和Python这对双星。他们有非常多的相似之处,第一个相似之处是“快”。这种快不是纯计算速度快,而是从想法到结果的快。因为不论是探索数据还是建模,都需要各种尝试各种试错各种踩坑,如果要花2小时写代码,跑1分钟,不如花1分钟写程序,跑1小时。因为人的时间总是更为宝贵。第二个相似之处是扩展丰富。即有大量现成的函数模块。从想法到结果的快速实现,不能等待重新造轮子,另一方面,试错也要做很多复杂的自定义任务,将各种模块进行组合,调用各种外部交互接口,这两种开源工具都非常擅长。

二者的差异点在于Python是一种通用型编程工具,R专注于数据领域;R有更为丰富的专业统计函数,Python则长于机器学习;R有更好的可视化包,Python正在快速追赶;Python和R的核心语法非常简洁,一些R包的语法则兼收并蓄,错综复杂。当你有时间的时候,双修是最好的选择。因为这两种工具类似于筷子和勺子的区别,在不同场景下使用某种工具更为有效。

R语言这个工具与其生态系统,在统计之都上已经介绍得非常多了。下文简单介绍一下python的七个最为重要的数据分析模块,或者称之为七种武器。 继续阅读Python的七种武器

日历中的夏天

看着有节,摸着无节,打一生活用品

不知不觉,夏日已慢慢临近。姑娘们飞扬的裙角,小贩叫卖的西瓜,蚊蝇嗡嗡的声音,以及翻过的一页日历,都提醒着你夏天快来了。夏季有着不同的定义:根据中国人的日历,我们所俗称的夏季从立夏开始,到立秋结束;但在气候学上,夏季是指连续五天平均温度超过22摄氏度即算作夏季的开始,若连续五天平均温度低于22度则算作入秋;而天文学上的夏季一般是指六、七、八这三个月。

那么哪一种夏季的定义更合适一些呢?还是用数据可视化来说话吧。这项任务基本上有两个步骤:一是获取某城市的2011年日平均温度数据,二是根据数据绘制日历热图(Calendar-Heatmap)继续阅读日历中的夏天

需要相亲几次才能找到靠谱的对象?

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

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

对于这个概率问题,一种思路就是取1到100之间的某个数字n,以它作为分割点将整袋球划分为两组,第一组即从第1个到第n个球,第二组即从第n+1个到第100个球。我们以第一组为观察对象,找到第一组中最大的球M,记录其大小但并不行动。然后从第二组中寻找大于M的第一个球,取该球为最终选择。那么n应该设为多少,才能使取到最大球的概率尽可能的高呢?Ross在其《概率论基础教程》中已经给出了精确的解析(英文版第8版P345;或者陈木法的《随机过程导论》 P105),最优的n公式表达为 $n^*=\inf\{r:\sum_{n=r}^{N-1}\frac{1}{n}\le1\}$;在N充分大时,n应该取在1/e的比例处,也就是所有球数目的37%处。在解的过程中先运用条件概率得到全概率表达式,再用连续化的积分来近似离散化的概率,将积分求出后进行求导得到最终答案。看到这里各位是否有些惊讶,这个e可是无所不在啊。

继续阅读需要相亲几次才能找到靠谱的对象?