Jun 292013
 

在SnowLeopard上安装MacFusion Install MacFusion on Snow Leopard Snow Leopard (OS X 10.6)已经是比较老的的系统。在这个系统上装MacFusion需要些额外的准备: 1. 装Fuse for OS X 链接 2. 装MacFusion 链接 之后,要按照这个方法(链接)把sshfs 拷贝到MacFusion 的路径里。

May 302013
 

如何做Research Research Principles Revealed   看了Jennifer Widom research_principles 的幻灯,觉得有些方面值得学习。 1. 同事和合作者 交流思想,互相启发,优势互补。比如Jennifer 擅长Details,而合作者Stefano注重Intuition。 2. 注重框架里的假设 学习知识的时候有不同的层次。一般来讲是从抽象到具体,比如一个领域的知识分划到不同的章节,每个章节讲具体的知识细节。 这就需要仔细品味每个章节的特点和章节之间的异同。 对于做研究来讲,更重要的是知识的假设。特别是这些假设不成立的时候,如何发展或变通现有的理论,这样或许能做出新的研究。  

Apr 202013
 

转载一篇有意思的文章。这篇文章写于2010,修改过4次,这没准说明好文章是改出来的? http://csbabel.wordpress.com/2009/05/20/the-unknown-and-critical-thinking/   思维的特点和缺陷 人类总是喜欢歌颂自己的大脑,比如:思想的威力,逻辑的威力,数学的威力(数学来自于思考),科学的威力(科学来源于思考),还有“意识”这个“人类与动物最大的区别”[i]……blah blah……不过,几乎没有人关心过这种想法究竟来自于人体的哪个器官。 心理学中有一个研究偏见的试验是这样设计的,向随机抽样的一群人发放问卷,询问他们两个问题:1、你身边有偏见的人占多大比例;2、你自己有没有偏见,是否严重。结果,远超半数的人回答得非常一致:1、身边绝大多数人有严重偏见;2、我自己没有任何偏见。 人类的大脑就是如此:一生都在不停地犯各式各样的错误,同时还对本身保持一个较高水平的评价。之所以犯错误,是由人类的大脑运作方式决定的,这几乎是无法避免的。比如人类有一种本能化思维方式:类比[ii]——也就是说,习惯于将自己先前总结出来的规律,施加在未知但看起来相似的事物上,而不事先考虑同样的规律是不是起作用,同样,大脑也不去辨别这两种情形是不是真的“相似”。这其中的“道理”大约是这样的:“卷心菜的味道不错,圆生菜和卷心菜长得差不多,那么圆生菜的味道应该也差不多?”举个程序员们喜闻乐见的例子:你在emacs里按Ctrl-X,C按得挺熟练觉得很爽,于是到了gedit和notepad里八成也会试试看灵光与否,或者到win32 cmd下敲find -exec/xargs,或者到LISP里写visitor,或者到Python里写GetSubString(index1, index2, step)函数……在这方面,成年人和婴儿的区别仅在于知识库中积累的数据不一样多而已(所以成年人才不再去尝试已消化过的食物的味道[iii])。在用类比去探索时,我们不认为这有什么不对,但是在已经探索过的人群看来,这非常可笑并且没有必要。 试错法也是人类重要的思维方式[iv]。其中的“道理”大约是:“我不知道是不是行得通,但是做错了代价也不大,所以我想试试看”。低幼儿童会用剪刀去剪房间里的所有物体,其实也是一种试错。前面举的emacs的例子,也可以说是在试错。面对重要的东西,我们往往不会去试错[v],但问题在于每个人对于“重要与否”的评估存在着差异,导致对待同一个事物,某人觉得不重要,可以试错;但另外一个人就会对这种试错非常反感,甚至愤怒。 通常来说,在面对未知事物的时候,我们的第一印象往往是错误的,但我们会(自以为是地)认为自己是正确的。随着对事物的更多了解,每一时刻我们都会(不自觉地)修正自己对事物的看法,但每一次我们都会认为自己完全了解该事物了,认为自己达到终极正确了,同时也会忽略自己刚刚还在犯错误这一事实。这其中的“道理”大约是这样的:“我已经修正了足够多的错误了,那么这里面就不会再有大问题了吧?”在软件开发中,程序员面对BUG也经常如此。心理学中的名词“面试者错觉”(interview illusion)就是在总结这样的一种现象,因为在企业面试的时候,这种现象最显著。 归因错误(更确切地:fundamental attribution error)也是人类易犯的思维错误。其典型特征是:将好的结果归功于自己,将坏的结果归罪于别人。比如:约会迟到,那是因为堵车太厉害;如果准时到达,那是因为自己是一个讲信誉的人,故而“能够有计划地处理一切意外情况从而做到守时”。类似地还有:如果自己不守交通法(比如在“白实线”并线),那是因为有急事需要赶路;如果看到别人同样地行为,则是认为对方是一个“没有素质的人”。再回来头说软件公司的例子:处在组织中任何位置的人,包括CEO、VP、PM、Lead、QA & developer,也都会犯这种错误:一旦出了问题,大官儿会将问题推给小官儿,小官儿推给程序员,程序员推给外部条件,比如语言有缺陷,OS不稳定,SDK出BUG,Partner还延期……等等等等。如果最后成功了,程序员则会说“其实都是我们干的活儿”,CEO会说“那是因为我领导有方”,中层managers会说“CEO什么实际事情都不管,程序员们全都太懒,都是(因为)我们这些最难做人的中层经理们在不停地push”…… 人类的趋利避害本能,导致思维模式中不可避免地会有将“必要条件”当“充分条件”的现象,比如放置很久的食物并不一定都腐败变质了,但我们都会选择扔掉。更进一步地,我们会将既不充分也不必要的条件也当作充分条件。比如我们在黑夜里会异常小心,虽然“黑夜”与“犯罪”既不充分也不必要;或者,看到别人手中拿着刀子,首先想到的是“不要伤害到我”。其实动物们也何尝不是如此。如果羚羊会说话,它大概会这样告诉你:“这里闻起来有狮子的味道,我不确定这里是不是有狮子,但是喝过水之后赶紧跑掉总没有坏处。”为什么不会有严格按逻辑推理行动的羚羊呢?比如一只这样思考的羚羊:“这里闻起来有狮子的味道,但这有可能是已经走开的狮子留下的;‘有狮子的味道’仅仅是‘有狮子’的必要条件,并不充分(甚至可能不必要),如果看到狮子了(充分条件),那我就会逃跑,否则我就待在河边喝水……”由于进化方向的随机性,究竟有没有这样的羚羊我们无法判断[vi],但是我们观察到现在的世界上并没有这样的羚羊。我们可以认为:即使曾经有过这样讲逻辑的羚羊,它们也已经灭绝了,因为比起“正常”的羚羊来,这种羚羊没有生存优势。对于羚羊的正确选择是:不严格遵守逻辑,按照“未来预期最大化”和“未来风险最小化”的原则行事。这是一种合理且最优的生存策略,是一种rational choice in an uncertain world(感谢Pongba提供)。在自然选择中生存下来的我们人类,也是同样:严格的逻辑思维不可能是天生的,只能依靠后天的训练。 类似这样的例子还可以举出很多很多……所有的这些本能地、习惯成自然的思维方式(包括但不限于刚刚提及的),会导致这样一种(显而易见的)结果:我们在面对不了解的领域的时候,往往会出现认知上的偏差(以上的说理并不充分。如果有人不认同我也很正常。我也无法做到充分说理,因为我的这一份大脑无法真正说服别人的那一份大脑,除非两者在思想和认识上已经有一定的共同基础)。这些认识上的偏差会导致很多问题。将这些偏差列举出一些来,也正是我写此文的目的。 不要盲目质疑权威[vii] 可能是大家过去都被无良的“权威”欺骗了很多年吧(在某些方面还被欺骗着)。在当今的年代,质疑权威变成了一种时尚(比如屡有民科的种种质疑见诸报端)。但对于懂得如何求知的人,有一条原则还是一直没有变化的:在发表与主流相反的观点前,要多作调查和思考。不要凭自己的直觉去胡乱质疑[viii]。因为在“绝大多数情况下,你都不太可能是遇该问题的幸运第一人”。如果仅凭直觉去质疑,往往会闹出笑话。甚至伟大如爱因斯坦者,在他做出过巨大成就的物理学上,曾经靠直觉指导学术研究,高举反对量子物理的大旗,但还是被无情地击败(Aspect experiment),被后人作为了反面典型,甚至有人笑称: “如果爱因斯坦自191x年开始以钓鱼为业度过余生,对科学界也没有任何损失”。[ix] 再举几个例子。比如,下面的这个科学事实[x],它和多数(未受正确汽车安全教育的)人的直觉相违悖: a)仅使用安全气囊而不系安全带,会增加死亡和受伤的可能性。 b)安全气囊仅在与安全带一起使用时才能最大程度地挽救生命。 c)安全气囊对儿童有致命的伤害作用。 参考资料:安全带能将乘员的头部伤害减少6成,安全带+安全气囊一起能减少8成(数据来源:NHTSA)。同时,安全气囊造成儿童死亡率上升35%(数据来源:IIHS)。 又比如:近视的遗传率为90%(标准的说法为0.9)。也就是说,一个人到底近视与否,在90%的程度上是由他的父母的基因决定的。 再比如,我们平时“尝”到的各种味道,除掉有限的五种味道之外[xi],其它的都是由鼻子“闻”到而不是舌头“尝”到的。这五种舌头可以感受的味道为:酸、甜、苦、咸、鲜(一部分的上腭也可以识别这些味道)。除此之外,其它的味道都是被鼻子“闻”到的(蒸发后的唾液携带着少量食物分子进入鼻腔从而被闻到)。吃芥末的感受会让人真实体会到这一过程。 还比如,我们直觉上认为大部分为黑色的屏幕会省电,而且传统的CRT屏幕也是这样的。但是对于新型的LCD显示器,屏幕颜色对于省电则变得基本上无关紧要,因为LCD是靠背光照明,无论屏幕颜色是黑是白,它的背光是一直全开的。如果想要追究起来,白色屏幕比黑色屏幕会更省电,因为黑色屏幕是要通过电压驱动液晶分子才能得到的,而白色屏幕是未驱动时的“本来面目”(仅对TN而言的;IPS/OLED则是黑色省电)。想要让LCD显示器省电,关闭它才是王道(手动关闭/自动超时关闭)。 对于权威,不是不能质疑,事实上,许多开创性的理论都是经过质疑权威而发明的。质疑应该通过批判性思维产生,其基础则是知识和实验。关于批判性思维在这里不讲太多,请参考托马斯·杰斐逊编写的学生誓言:我保证使用我的批评才能。我保证发展我的独立思想。我保证接受教育,从而使自己能够自作判断(卡尔·萨根:http://www.cnread.net/cnread1/kpzp/s/sagen/mgcm/025.htm)。 不要放大局部经验 “不要将局部经验(或经历)当成普遍事实”。单讲这一句话不会有太多的人反对,但具体到了某件事情上,这种思维缺陷就容易出现了。每个人都有自己特定的经历,大脑会将这些经历总结归纳成经验和规律,并且不自觉地用它当成金科玉律去衡量接触到的新事物[xii]。对于我们的大脑来说,新事物都是不那么可信的——至少不如自己的经验可信。如果新事物和自己的已有经验冲突,多半我们是要去怀疑它。在怀疑的过程中,因为有了“一票否决/证伪”这样一个逻辑利器,我们的大脑更倾向于相信自己的旧有经验。举个鲜活一点的例子:一个朋友生了小孩后,经常和她的婆婆(来自某省落后的乡村)发生冲突,而冲突的内容几乎都是在育儿方法上。比如有一次,婆婆坚持要给孩子的屁股上擦香油,说如果不这样做的话,长大之后会“屙不净屎”。我想多数人看到这里会觉得比较有趣,也不会认为婆婆的这种“经验”是正确的。但从婆婆的角度来看,这是她大半辈子攒下来的经验,是她的长辈和亲朋代代相传、奉为圭皋的经验,也是她在儿子身上“试验”成功的经验。而媳妇采用的育儿方式是新事物,那是她不愿意去相信和接受的东西。婆婆的“逻辑”大约是这样的:“你说你那方法科学,那怎么还有生出来就活不了的?你说我的方法不科学,我不还是把我儿子养活这么大了?”[xiii] 回到程序员的问题上,这种应用局部经验的情形也不少。比如:“我上次这样试验过,行不通的”,或者“我这样编译过,没问题的”。“行不通”是因为什么行不通?是方法有错还是环境在干扰[xiv]?“编译过没问题”,是表面上没问题还是真的没问题,是编译器的特性还是标准中的规定[xv]? 个人经验和科学理论的冲突是不可避免的,关于如何处理这种冲突,可以按科学界通用的证据原则去处理。并且,证据原则中有如下一些证据强弱的判断式:双盲>单盲,盲法>不盲,试验>观察,随机试验>非随机试验,对照实验>无对照实验,前瞻性观察>回顾性观察,系统性观察>非系统性观察( 个案系列、个案、经验),“个案系列”>个案,专业人员观察>非专业人员观察(上面这段话是引用的,从笔记里Ctrl-Y的,出处忘了)。 不要捍卫一知半解 我们都不必要、也不可能在所有领域内都做到深入了解,像“全才”一类的称呼离现在这个社会越来越遥远了(毕竟早已不是达芬奇所处的年代了)。不管你了解多少个领域,在一个领域上了解得有多深入,都不可能覆盖到所有的知识领域。所以,出现对某个领域一知半解的情况,是一个很正常的事情。比如程序员们都懂一点颜色的表示法——如何用RGB值组成颜色(做过视频处理的人估计还懂ycrcb)。但是如果用Chromatology的高度去要求,估计没有几个人能够合格了(比如D65光源的意义……)。 或者用生活中的例子:一般人都会使用相机,在不少论坛里还能碰上许多“摄影爱好者”或者职业摄影师。但你要是搬出《大不列颠摄影教程》跟他探讨镜头的像场性质(场曲、边缘解像等)、慧差、球差、色差(两种)等性质,那么多数人都会变哑巴[xvi]。 或者另一个例子:几年前,在LCD显示器刚刚开始普及时,很多人都在谈论面板的反应时间,厂商也在想方设法提高该指标,但是有多少人知道反应时间是如何定义的?真正的响应是不是按标注的反应时间?(http://www.tomshardware.com/cn/953,review-953-5.html) 再举一个例子,在中国有不少人会开车,在有些国家多数人都会开车。但是如果你去讨论“主减速比”、“传动比”和“刹车点”、“走线”、“换档时机”,估计多数人会感到难以理解,只有少数竞速爱好者会喜欢这样的话题。但他们也只是比普通人多知道了那么一点儿点儿,比如多数竞速爱好者对于自动变速箱中的“锁止离合器”都没有任何概念。(再比如:铝合金副车架的晶间腐蚀) 多数人对自己存在的不足,在内心深处是能够感觉到的。如果自己能够坦然面对,一般也不会有人嘲笑你(以下情况暂且不计:1、懂得太少又想冒充高手;2、遇到有人格缺陷的高手)。但是这里面有一个“面子”问题,一个人“丢了面子”就想要“找回来”。所以才会发生这样的事情:如果一个人感觉到自己在知识上被打败了,那么他就会设法从其它方面“找回面子”(往往是用诡辩)。比如,如果你和一个纯C语言的“高手”讨论OO,那么他多半会用OO的缺陷和误用来反驳,或者用OO语言中的缺陷来反驳(如执行速度太慢,或语言太复杂,以致于“为了避免复杂性也要用C”,嘻嘻),以此方式来掩饰他在OO上的不足。或者当你去和一个汇编高手讨论LISP语言的威力,那么他多半会用执行速度来避开讨论的中心,或者用“本质上来讲都是图灵机(或者本质上都不是图灵机——因为内存不是无限)”来试图抹杀差异。 (多说一句:“从本质上来说都是……”这种red herring非常好用,诱惑性极强,一个想要理性辩论的人需要努力抵制这种诱惑,like what Gabriel […]

Mar 242013
 

Interesting slides from PyCon 2013 今年PyCon在加州的Santa Clara召开。我虽然没去,但一如既往的关心。 挑出和我相关的一些有意思的幻灯,在此分享。 1. BeautifulCode Raymond Hettinger是一个善用Python的高手,他的code非常简洁,有Python的风味。 这个幻灯里,他介绍很多Python中常用的简洁的写法,包括怎么用iterator, list comprehension. 我感觉有意思的是defaultDict (不需要再用dict.get()), decorator(修饰方法,类比CSS)和context(干净的获取和释放资源) 原始链接 2. Python: A “Toy” Language David Beazley是一个Python作家,对Python GIL有过详细的介绍,以前写过如何把Generator组合成一个workflow的幻灯。 现在在芝加哥教Python。这个人擅长Python的教学,并能给出有趣的例子。这次也不例外,他介绍了如何用Python和Shapeoko (包括Arduino)来组装并使用CNC (数控机床?)。这个例子告诉我们Python可以做计算机程序之外很有用的 应用。 原始链接 3. Awesome Big Data Algorithms 作者是MSU的老师。这个Blog的背景是土壤Genetics。因为土壤中的genetics比单纯人的DNA更复杂,数据量更大,因此需要Big Data Algorithm。这个幻灯介绍三种算法:SkipList, HyperLogLog, Bloom filter(CountMin Sketch)。 SkipList是一种基于链表的数据结构,相对羽平衡二叉树,这个算法的优点是更好的支持并发操作。本质上,SkipList是一个分层次的链表。在最底层,链表元素按顺序排列。在更高的层次,(按照概率)简历一部分低层的数据的索引。这种数据结构在查找时非常有效:从高层开始查找,直到最底层顺序查找,整个查找是log(N) HyperLogLog是应用于大数据的算法,用来计算一个很大集合的基数(即合理总共有多少不相同的元素)。大致思路是用一组相互独立的哈希函数依次处理输入,然后对哈希值分块计数:对高位统计有多少连续的0;用低位的值当做数据块。比如:011000|01,就是高位有3个连续的0,低位是1,就表示第一个数据块。因为连续观测的三个0的概率大约是1/8,所以对数据块1来讲,可以把计数乘8,作为集合基数的估计。因为低位可能有0,1,2,3这四种数值,总基数可以取上述4中技术的几何平均数。在HyperLogLog中,具体的还有一些系数可以调整,使得估计更准确。 这片Blog详细介绍了HyperLogLog算法,图文并茂。 BloomFilter或CountMin Sketch是两个不同的算法,但又有紧密联系。相似之处是两个算法都需要一族独立的哈希函数。不同之处是处理的问题不同。对BloomFilter,在预处理阶段对每一个特定的输入算出所有哈希函数的值,并在这些值上做出标记。最后,当查找一个特定的输入是否出现过,只需查找这一系列的哈希函数对应值上有没有标记。对于BloomFilter,可能有False Positive,但不可能有False Negative。此外,BloomFilter可看做查找一个数据有或者没有的数据结构(数据的频率是否大于1)。CountMin Sketch在BloomFilter的基础上更进一步,它可用来估算某一个输入的频率(不局限于大于1)。具体思路是对哈希函数值对应的sketch上计数(对BloomFilter则只是标记是或否)。最后估计频率的时候,对每个估算出的频率取最小值。 原始链接 4. Why […]

Mar 152013
 

Install matplotlib using pip (Mac) 在Mac OSX下安装matplotlib并不简单 (比如Linux可以用apt-get,Windows可以直接下载Binary build),因为matplotlib需要一些底层库(例如freetype,pygtk,而pygtk又需要gobject, gobject需要cairo)。 这里总结一下我在Mac OSX下安装Matplotlib的经验。 首先安装MacPorts,具体参见Install MacPorts. 然后安装py27-pygtk 然后把pygtk的路径添加到PYTHONPATH里: 最后用pip安装 这里要指定GCC编译器的路径,否则系统默认用gcc 4.2版编译。 还需要清除CFLAG和LDFLAGS,不然安装的时候不用pkg-config,也就得不到gtk库文件的位置。 额外两个tip: 【1】 安装pip需要先安装setuptools 【2】 一个命令升级所有pip安装的软件: 此外如何在Mac OSX下用源码安装numpy和scipy? 这里有官网的说明。 特别注意的是,编译numpy和scipy要用gcc 4.0版。 另外scipy还需要cython (pip install cython)

Jan 172013
 

发布Python程序 Distribute Python script 最近需要把一个Python程序发布给其他学校的Collaborators使用,发现最主要的问题是版本不兼容:我使用的是Python 2.7版本,但其他学校可能使用2.5或者更老的2.4版本。因为我使用了大量新版的特有功能,直接把代码发布给对方是没法让对方使用的。因为老版本的Python不支持2.7版里的函数比如:os.SEEK_SET, all(), str.format() 。解决方法有两个: 1. 使用Freeze之类的工具 在Python source code里有一个Tools文件夹,里面有freeze这个工具。他可以把Python代码编译成C语言中的Python。这种方式可以解决简单的脚本,但复杂的脚本这种方法可能会带来其他的错误。 2. 重写代码 这是最根本的解决方法,把新版本特有的函数重新定义,或者用另一种方法实现。比如all() 有一个工具可以检查当前的Python的向前兼容性: https://github.com/ghewgill/pyqver 检查checkVCF.py的结果如下所示: /net/fantasia/home/zhanxw/rvtests/rvMeta/sftp.clean/checkVCF/checkVCF.py 2.5 all 2.4 set, generator expression 2.3 logging, sum, enumerate 就是说我使用了2.5特有的all()函数,如果想在2.4版的Python上运行,需要重新定义all()函数。 类似的,set(), generator expression是2.4版才加入的特性,如果要支持2.3版本,就必须改写这两个地方。    

Dec 312012
 

Writing Teaching Statement and Research Statement 申请了一些学校的职位,除了Cover Letter和CV,最主要的材料就是Teaching Statement和Research Statement。 写作之前,之中,之后,最好看看优秀的写作范例。我收集了一些如下: Teaching and Research Statements UMichigan CRLT teaching statement (including examples) Teaching Statement (Princeton) – short introductory material   Teaching Statement (Vanderbilt) – including bullet points to help you outline writing.   Teaching Statement (from Science) – another perspective Teaching Statement – Good example   Teaching […]

Dec 202012
 

      最近我学习了PEERRS相关的培训,主要包括如何正当的进行研究,COI (conflicts of interests)。 我把课后习题的答案放在这里,给自己提个醒,同时作为备份留着。  

Nov 272012
 

Two common mistakes when writing statistics software 最近在写一个软件,发现两个常见的错误: 1. 缺失 数据的处理 对于缺失数据,表示上可以是NA, “.”, -9,应该先保证软件读入的数字是正确的。 之后,在模型中,是应该丢掉数据,还是impute数据?是impute到均值还是用随机数值? 在写软件的时候必须要清楚。   2. 数值运算的维数 在统计中,常常有大量的数值运算,比如矩阵相乘。 在文章中这类运算往往会忽略维数,比如矩阵的行数和列数。 这时候软件中应加入更多的边界检查,这样就能避免程序崩溃。