星期日, 三月 01, 2009

Life is like a dog-sled team. If you aren't in the lead, the scenery never will change

Life consists not in holding good cards but in playing those you do hold well.
人生不在于拥有好牌,而在于打好你手中的牌。

Life is a process of accumulation. And you may fall sometimes, but even if you fall, you should understand how to grasp some sand in your hand.
人生是一个积累的过程。你总会摔倒,即使摔倒,也要懂得抓一把沙子在手里。

Life is like music. It must be composed by ear, feeling and instinct, not by rule.
人生如一首乐曲,要用乐感,感情和直觉去谱写,不能只按乐律行事。

Life is like a dog-sled team. If you aren't in the lead, the scenery never will change.
人生像狗拉雪橇,如果你不是领头犬,风景永远不会改变。

星期五, 二月 27, 2009

双信封悖论和围城效应

双信封悖论和围城效应
from 阅微堂 by zhiqiang

问题:你有两个信封可以选择,每个信封里有一定数量的钱,已知其中一个信封里的钱是另外一个信封的两倍。你可以选择一个信封,打开之后你能看到其中的钱的数量。现在你可以选择是否更改你的选择。

推断:你应该更改你的选择

1. 假设你打开信封后发现里面钱的数量为A。
2. A是较小的钱数的概率为1/2,为较大的钱数亦为1/2。
3. 如果A是较小的钱数,则另一个信封里钱数为2A;
4. 如果A是较大的钱数,则另一个信封里的钱数为为A/2。
5. 所以另一个信封里的钱数的期望为 E = 2A×1/2+A/2×1/2=5A/4,大于A。
6. 你应该更换你的选择。

想想看,这个问题和推断是不是有点像围城效应?

很显然,上面的推断结果是有问题的。关键在于第二条,如果上面推断中的第二条成立的话,我们假设P(A)为两个钱包里的钱数为(A/2,A)的概率,那么将有P(A)=P(2A),从而有一个定义在一个无穷集上的均匀分布,这是不可能的。

上面这个问题以前就讨论过,最近一个同学问起这个悖论的变种:

问题:你有两个信封可以选择,每个信封里有一定数量的钱,已知其中一个信封里的钱是另外一个信封的两倍。而且两个信封里的钱的数量是 (10^n,10^{n+1})的概率是2^{-n},其中n=1,2,\cdots, +\infty。你可以选择一个信封,打开之后你能看到其中的钱的数量。现在你可以选择是否更改你的选择。

推断:你应该更改你的选择

1. 假设你打开信封后发现里面钱的数量为A。
2. 如果A=1,另外一个钱包有10块钱,你应该更换你的选择。
3. 如果A>1,另一个钱包为10A的概率为1/3,有A/10块钱的概率为2/3。
4. 另一个钱包的期望钱的数量为17A/5,大于已选的钱包的钱数A。
5. 你应该更换你的选择。

这个推断几乎没有问题,一句话的总结就是,在一个期望无限收益的游戏里,玩家不可能得到满足(达到期望值)。

商务信函中 as opposed to 的用法

  最近在商务信函中看到 as opposed to 出现频率比较高,于是查阅了下资料,这个词组的含义是“相对于..., 不是...”,要理解也不困难,举个简单的例子: 甲乙两人对话,甲说,这是一头牛,乙说,这是一头羊,而不是一头牛,口语化或者 casual style 说起来就是: It's a lamb, not a cow. 用公务的句式可以写成: It's a lamb, as opposed to a cow.
  这里要说明的是,as opposed to 多是用于会话或信函来往中一方对另一方的反馈,你必须是清楚地明白某件特定的事,而非对方所提出的那件,就好像乙知道这是只羊,而非甲说的牛。可见,在没有对话的互动情景下就不必使用 as opposed to, 比如甲自言自语说,这是头驴,不是马,这时候就不需要说 It's a mule, as opposed to a horse,因为这句话完全可以有更多种说法,比如,这是头驴,不是骡子,或者,这是头驴,不是羊,或者,这是头驴,不是牛,等等等等,有多少飞禽走兽就 会有多少种说法,也就是说没有特定的对比对象,在这样的情况下, It's a mule, not a horse 就足够了。
  Please call me POPO, as opposed to Plod:)

星期四, 二月 19, 2009

Java Related

----------------------------------------------------

1.参数by value 非 by reference

2.不变的data 和 object reference用final

3.缺省所有的non-static 函数都可overridden

不允许客户overridden的函数用final

4.array与vector 之间要慎重

array可以容纳 primitive type 也可容纳 object reference

5. polymorphism优于instanceof(运行期确定对象的隶属class)

6.必要时才选择instanceof

7.一旦不需要object reference就 = null

8.不要总依赖java garbage collection

"内存问题纯属庸人自扰"--------------掌嘴。

Runtime rt=Runtime.getRuntime();

long mm=rt.freeMemory();

System.out.println(mm);

//.........

System.gc();

//..........

System.out.println(mm);

9. reference vs. primitive means primitive vs. wrapper

10. == vs. equals()

不要依赖equals()的缺省实现

11. overridden equals()要深思熟虑

12.overridden equals()时优先考虑getClass();

13.调用 super.equals()唤起base class的相关行为

14. equals()中慎用 instanceof

15. 想try/catch置于循环之外

------------------------------------------

Java Performance

1. 把焦点放在 datastruct 和 Algorithm上

2. StringBuffer.append() 优于 String.concat()和+

3.不要依赖 compile-in-time

4.理解运行期Runtime优化技术

5. 将对象的creation cost减至最小

6.尽可能用 stack 变量

Class StackVars{

private int inst_var;

private static int static_var;

void stackAccess(int var){

int j=0;

for(int i=0;i

j++;
}

void instanceAccess (int val){

for(int i=0;i

inst_var++:

}

void staticAccess(int val){

for(int i=0;i

static_var++

}

}
7.多使用static final private 促成 inlining,在编译器被statically resolved

8.instance变量init一次就好

9. primitive vs. wrapper

10.不要用Enumeration 或Iterator 遍历 Vector

<1> Iterator

<2> ListIterator

<3> Enumeration

<4> get() //it's the best

11. 用System.arraycopy()来cp array

12. array vs. Vector和 ArrayList

1 3. 尽量reuse Object

14. 手工优化 javap -c



星期三, 二月 11, 2009

和机器学习与计算机视觉相关的数学

[转载]
感觉数学似乎总是不够的。这些日子为了解决research中的一些问题,又在图书馆捧起了数学的教科书。从大学到现在,课堂上学的和自学的数学其实不算 少了,可是在研究的过程中总是发现需要补充新的数学知识。Learning和Vision都是很多种数学的交汇场。看着不同的理论体系的交汇,对于一个 researcher来说,往往是非常exciting的enjoyable的事情。不过,这也代表着要充分了解这个领域并且取得有意义的进展是很艰苦 的。 记得在两年前的一次blog里面,提到过和learning有关的数学。今天看来,我对于数学在这个领域的作用有了新的思考。对于Learning的研 究,
1、 Linear Algebra (线性代数) 和 Statistics (统计学) 是最重要和不可缺少的。这代表了Machine Learning中最主流的两大类方法的基础。一种是以研究函数和变换为重点的代数方法,比如Dimension reduction,feature extraction,Kernel等,一种是以研究统计模型和样本分布为重点的统计方法,比如Graphical model, Information theoretical models等。它们侧重虽有不同,但是常常是共同使用的,对于代数方法,往往需要统计上的解释,对于统计模型,其具体计算则需要代数的帮助。以代数和统 计为出发点,继续往深处走,我们会发现需要更多的数学。
2、Calculus (微积分),只是数学分析体系的基础。其基础性作用不言而喻。Learning研究的大部分问题是在连续的度量空间进行的,无论代数还是统计,在研究优化 问题的时候,对一个映射的微分或者梯度的分析总是不可避免。而在统计学中,Marginalization和积分更是密不可分——不过,以解析形式把积分 导出来的情况则不多见。
3、Partial Differential Equation (偏微分方程),这主要用于描述动态过程,或者仿动态过程。这个学科在Vision中用得比Learning多,主要用于描述连续场的运动或者扩散过程。 比如Level set, Optical flow都是这方面的典型例子。
4、Functional Analysis (泛函分析),通俗地,可以理解为微积分从有限维空间到无限维空间的拓展——当然了,它实际上远不止于此。在这个地方,函数以及其所作用的对象之间存在的 对偶关系扮演了非常重要的角色。Learning发展至今,也在向无限维延伸——从研究有限维向量的问题到以无限维的函数为研究对象。Kernel Learning 和 Gaussian Process 是其中典型的例子——其中的核心概念都是Kernel。很多做Learning的人把Kernel简单理解为Kernel trick的运用,这就把kernel的意义严重弱化了。在泛函里面,Kernel (Inner Product) 是建立整个博大的代数体系的根本,从metric, transform到spectrum都根源于此。
5、Measure Theory (测度理论),这是和实分析关系非常密切的学科。但是测度理论并不限于此。从某种意义上说,Real Analysis可以从Lebesgue Measure(勒贝格测度)推演,不过其实还有很多别的测度体系——概率本身就是一种测度。测度理论对于Learning的意义是根本的,现代统计学整 个就是建立在测度理论的基础之上——虽然初级的概率论教科书一般不这样引入。在看一些统计方面的文章的时候,你可能会发现,它们会把统计的公式改用测度来 表达,这样做有两个好处:所有的推导和结论不用分别给连续分布和离散分布各自写一遍了,这两种东西都可以用同一的测度形式表达:连续分布的积分基于 Lebesgue测度,离散分布的求和基于计数测度,而且还能推广到那种既不连续又不离散的分布中去(这种东西不是数学家的游戏,而是已经在实用的东西, 在Dirchlet Process或者Pitman-Yor Process里面会经常看到)。而且,即使是连续积分,如果不是在欧氏空间进行,而是在更一般的拓扑空间(比如微分流形或者变换群),那么传统的黎曼积 分(就是大学一年级在微积分课学的那种)就不work了,你可能需要它们的一些推广,比如Haar Measure或者Lebesgue-Stieltjes积分。
6、Topology(拓扑学),这是学术中很基础的学科。它一般不直接提供方法,但是它的很多概念和定理是其它数学分支的基石。看很多别的数 学的时候,你会经常接触这样一些概念:Open set / Closed set,set basis,Hausdauf, continuous function,metric space, Cauchy sequence, neighborhood, compactness, connectivity。很多这些也许在大学一年级就学习过一些,当时是基于极限的概念获得的。如果,看过拓扑学之后,对这些概念的认识会有根本性的拓 展。比如,连续函数,当时是由epison法定义的,就是无论取多小的正数epsilon,都存在xxx,使得xxx。这是需要一种metric去度量距 离的,在general topology里面,对于连续函数的定义连坐标和距离都不需要——如果一个映射使得开集的原像是开集,它就是连续的——至于开集是基于集合论定义的,不 是通常的开区间的意思。这只是最简单的例子。当然,我们研究learning也许不需要深究这些数学概念背后的公理体系,但是,打破原来定义的概念的局限 在很多问题上是必须的——尤其是当你研究的东西它不是在欧氏空间里面的时候——正交矩阵,变换群,流形,概率分布的空间,都属于此。
7、Differential Manifold (微分流形),通俗地说它研究的是平滑的曲面。一个直接的印象是它是不是可以用来fitting一个surface什么的——当然这算是一种应用,但是这 是非常初步的。本质上说,微分流形研究的是平滑的拓扑结构。一个空间构成微分流形的基本要素是局部平滑:从拓扑学来理解,就是它的任意局部都同胚于欧氏空 间,从解析的角度来看,就是相容的局部坐标系统。当然,在全局上,它不要求和欧氏空间同胚。它除了可以用于刻画集合上的平滑曲面外,更重要的意义在于,它 可以用于研究很多重要的集合。一个n-维线性空间的全部k-维子空间(k
8、Lie Group Theory (李群论),一般意义的群论在Learning中被运用的不是很多,群论在Learning中用得较多的是它的一个重要方向Lie group。定义在平滑流行上的群,并且其群运算是平滑的话,那么这就叫李群。因为Learning和编码不同,更多关注的是连续空间,因为Lie group在各种群中对于Learning特别重要。各种子空间,线性变换,非奇异矩阵都基于通常意义的矩阵乘法构成李群。在李群中的映射,变换,度量, 划分等等都对于Learning中代数方法的研究有重要指导意义。
9、Graph Theory(图论),图,由于它在表述各种关系的强大能力以及优雅的理论,高效的算法,越来越受到Learning领域的欢迎。经典图论,在 Learning中的一个最重要应用就是graphical models了,它被成功运用于分析统计网络的结构和规划统计推断的流程。Graphical model所取得的成功,图论可谓功不可没。在Vision里面,maxflow (graphcut)算法在图像分割,Stereo还有各种能量优化中也广受应用。另外一个重要的图论分支就是Algebraic graph theory (代数图论),主要运用于图的谱分析,著名的应用包括Normalized Cut和Spectral Clustering。近年来在semi-supervised learning中受到特别关注。