这本书的全名为《女士品茶:20世纪统计怎样变革了科学》,英文原名为 The Lady Tasting Tea: How Statistics Revolutionized Science in the Twentieth Century 。从副标题已经可以看出来它讲的内容是什么了,而从主标题也可以看出这应该会是一本很有趣的书。事实也确实如此。
我最近发现这本书之后它就几乎占满了我所有的空余时间,本来准备看完以后再来推荐,但是现在看到一半已经实在是忍不住了。总的来说这是一本好书,我最开始发现它也是在 newsmth 的统计版上看到有人推荐,而且书的作者 David Salsburg 本身也是牛人,我们会发现并不是所有的科学家都是那种自己思维极度活跃跟正常人根本无法沟通的,其实有许多牛人写的科普类读物是非常易懂并且非常有趣的,并且这些看似随意的文字描述的背后其实有着坚实的理论基础,完全的外行人会觉得这是一本有趣的书,另一方面,在该领域有很深造诣的人,又会从字里行间读到其背后隐藏掉的复杂数学,可以看作对自己所学知识的一次整理。
当然我是属于前一类读者,虽然有听说过 Pearson 、Fisher 之类的名字,但是对于统计学的产生和发展以及一些更深层次的应用和理论并不是特别了解。所以我就完全把它当作一本休闲读物来看了——确实是非常有趣的。此外,我觉得等以后自己对这个领域有了更多的一些了解之后再回来看一遍这个书,估计又能尝到另一番味道呢。如果容许我剧透一下的话,里面会有各种 8g 趣闻,比如但凡学过“数理统计”这门课的人应该都知道有一个叫做“t 分布”的东西,如果不是特别死板的老师的话,通常会告诉大家叫 t 分布这个名字是因为发表该分别的家伙以 student 署名,不过如果你想知道这个以 student 署名的家伙到底是谁,以及为何要这样匿名来发表,就需要看这本书了。
看论文看到崩溃之后,去 Proggit 逛了一圈,发现那边也很热闹,一连看到几个有趣的帖子,于是决定推荐几个:
“Emacs is an OS” 的说法其实早就不陌生了,虽然大多数时候我会选择坚决捍卫这句话,但是其实自己也是把他当作一句有趣的玩笑来看待的。进入这个 thread ,看到有人说 Emacs 目前还不能编辑视频——这是理所当然的啊,我也这么觉得,不过下面立即有人给了这样一个链接:Acturally… ,自己点过去看吧,我决定再把 Emacs 打开来拜一拜!
(more…)
在 Matlab 里使用 mex 来编译 C/C++ 代码失败,这个问题算是困扰了我好几个月了,主要是我的环境比较恶劣:系统是 Arch Linux ,感觉这个系统比较喜欢追求最新版本,比较无视老版本软件的兼容性问题吧。再加上系统是 64 位的,出现各种兼容性问题似乎也觉得是理所当然的,然后像 Matlab 这样的软件通常使用较老版本的 GCC ,而 GCC 更新的时候又做了一些大改动,总之结果是我每次试图编译的时候都得到类似这样的错误:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libgmpxx.so.4)
因为 GCC 新版本里把 GLIBCXX_3.4.11 这个符号去掉了,所以挂掉了。搞得我每次需要运行 mex 编译的代码都要放到另外一台 Windows 机器上跑。也 Google 了很多次都没有找到解决方案。今天一怒之下用了最暴力的方法:/opt/matlab/sys/os/glnxa64/libstdc++.so.6 其实是指向该目录下的另一个文件 libstdc++.so.6.0.9 的软连接,我将他改成指向系统里的新版本的 libstdc++:/usr/lib/libstdc++.so.6.0.13 ,结果问题解决了。那个目录下还有一个 README ,说了这几个文件是从 GCC distribution 里拷贝过来的。于是这样用新版本覆盖应该不会有太大的问题吧?
至少目前还没有出什么问题的。
2009 年快要过去了,虽然我总是觉得奥运会明明就是今年举行的,但是日历上确实写着 2009 年。大家都写总结了,于是我也写吧,又不想用“总结”这么土的标题,就打开播放列表,找来找去看到“飘着”这首歌,回想自己这一年,也许这个词是很贴切的呢,寒假没有回家,也就飘在学校了,上半年住在玉泉校区,几乎每天飘来紫金港,下半年搬到紫金港校区,也几乎每天飘去玉泉。所以,就这个标题吧,很合适呢,歌也是很好听的。
说起来要写总结还真不是一件容易的事,我自己的记忆向来比较混乱,又是喜欢大幅度跳跃式的搜索,所以需要借助一些辅助的东西,比如 blog 、记事本、零碎的日记等等。其实这个新 blog 的开始大致就是从 2009 年开始的,所以目前的 Post 几乎就可以代表 2009 年了。
2009 年的第一篇 blog 就是关于 2008 年的总结,在那里提到了要给 2009 年定计划,然而最后其实也没有什么计划,甚至连新年愿望也没有什么想法,然而一下子就又该新年了,似乎是到了每天都要感慨光阴似箭的年龄,所以今年写总结的气氛明显感觉比去年要沉重一些呀。
2009 年其实发生的事情还是比较多的吧,一个寒假和一个暑假让我明白了不少事。
最近学校的 CC98 论坛简直慢得令人发指,总是让我感觉又回到了蓝田时代——洗完脸刷完牙回来了一个页面还没有打开。加上考试周到了,又特别喜欢灌水,所以老是想去刷新页面看有没有新帖子,其实主要也是看的俱乐部水楼、晚安楼之类的地方,不过每次等半天页面终于出来了,发现没有新帖也觉得相当浪费时间和感情。想起 quark 之前有做过一个监视 98 的新帖子,然后用 notification-daemon 给出提示的东西,于是我想也做一个类似的东西好了,让它自己在后台刷新,网络慢点也没有关系,至少我不用一直等在那里了,有新帖的时候再关注一下好了。
不过在 Windows 下没有 notification-daemon 可以用,而且诸如 Python、Ruby 之类的脚本在 Windows 下跑起来都觉得相当别扭。记得之前看过一个叫做 Growl for Windows 的东西(这家伙的缩写真有点那个……),好像就是 Mac 下的那个 Growl 的 clone 。于是去仔细看了一下,似乎支持一套标准的协议,而且各个语言的 binding 都很全。
几乎所有脚本语言都提供了方便的 HTTP 客户端处理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地进行 HTTP GET 和 POST 等各种操作。并且还允许以类似于插件的形式加入一些 handler ,来定制 request 和 response ,比如代理的支持和 cookie 的支持都是这样添加进来的。具体来说,通过如下方式构造一个 opener :
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
然后这个 opener 就可以处理 cookie 了,相当方便,并且可定制性也……好吧,总之,现在我希望能在客户端手动插入一些 cookie 值,但是不管是 HTTPCookieProcessor 还是 cookielib 里的 CookieJar 都没有提供类似的方法可以来实现。
在上次讲调试的小课堂里我曾经提到过我前一阵子遇到过一个 Matlab 的问题,具体症状是,开启 Matlab 来做计算,过了大约一天以后,再去看,就会发现系统处于完全无响应的状态,完全挂掉了,键盘有一个灯在闪烁。
碰到了好几次之后我相当崩溃,这个 bug 几乎处于不可调试的状态,首先要重现 bug 就很麻烦,虽然几乎都能重新,但是我不可能一直坐在那里盯着屏幕等一天(具体需要几个小时来重现我也不太清除),而且 bug 出现之后系统会挂掉,唯一的办法是强制重启,这个时候所有现场都被销毁了。另一方面,阅读代码的必杀技也没法用,因为我的程序是一段不长的 Matlab 代码,在这样的脚本语言里,内存都是自动管理的,我能想到的危害最大的操作大概就是申请超大内存了,一般会有两个结局:如果 swap 空间还能承受得了的话,会使用 swap 空间,并导致系统奇慢无比,不过并没有挂掉;如果 swap 空间都不够用了,那么 Linux 系统会把这个进程 kill 掉,而不是同归于尽。总的来说,不太可能是这段 Matlab 脚本导致了这么严重的问题,如果真有问题的话,估计是出在 Matlab 了,并且还是非常强悍的 bug ,会让系统彻底挂掉。
本文是“漫谈 Clustering 系列”中的第 8 篇,参见本系列的其他文章。
系列不小心又拖了好久,其实正儿八经的 blog 也好久没有写了,因为比较忙嘛,不过觉得 Hierarchical Clustering 这个话题我能说的东西应该不多,所以还是先写了吧(我准备这次一个公式都不贴
)。Hierarchical Clustering 正如它字面上的意思那样,是层次化的聚类,得出来的结构是一棵树,如右图所示。在前面我们介绍过不少聚类方法,但是都是“平坦”型的聚类,然而他们还有一个更大的共同点,或者说是弱点,就是难以确定类别数。实际上,(在某次不太正式的电话面试里)我曾被问及过这个问题,就是聚类的时候如何确定类别数。