你真的适合当自由职业者吗?

你真的适合当自由职业者吗?

对于绝大多数人而言,大家基本上都是在公司,企业或者政府部门工作,借助平台和个人的力量来获得相应的报酬,那么一直从事这样的工作很可能会让人觉得日复一日,没有激情,创意不足。因此,就会有人向往一种自由自在的工作状态,看着别人发表旅游文章同时希望自己也能够过上说走就走的生活,看着别人开咖啡店的时候也想着自己啥时候也去开一个咖啡店。总之,最终要做到自己当自己的主人,不再为了一些工作上的琐碎事情所搅扰。

通常来说,自由职业者(self-employed)指的是自己雇佣自己,不属于任何组织,在自己的指导下找合适的项目做,通过自己的能力和付出来获取相应的报酬。如果要找到合适自己的项目,那么首先就要知道自己所擅长的领域是什么。有的人可能觉得自己特别擅长写作,可以靠自媒体写作来养活自己;有的人觉得自己擅长烹饪,因此可以通过开一家小店来盈利;有的人觉得自己讲课水平优秀,可以通过开一个培训班来实现财富自由。

说到这里,笔者就想到曾经在知乎上看到过一个问题,“普通人和专业运动员的差距有多大?”其中有一句话给我留下了深刻的印象,那就是“永远不要用你的业余爱好来挑战别人吃饭的本事”。意思就是你觉得你所擅长的东西其实在专业选手面前其实根本不值得一提。你觉得你自己擅长写作,但是你跟中文系,新闻转播专业的同学比起来怎么样?你觉得你擅长烹饪,但是你就能够保证做饭的水平能够超越专业厨师吗?你觉得你能够开培训班,但是你能够比专业的培训机构抢到更多的生源吗?结合自己的经历,之前也有不少的人说自己对数学有着浓厚的兴趣,特别想去攻读一个数学PHD学位,但是目前情况是只学过微积分,希望请教一下数学本科的相关书籍和学习步骤。这种时候只要向他推荐一本 Rudin 的《数学分析原理》,基本上也就没有然后了。因此,一个人觉得自己非常擅长的某个领域很可能只是一种错觉,因为在职业选手面前实在是不堪一击。

在公司的时候,基本上还不太需要担心自己没有事情可以做,按部就班地工作就能够获得相应的报酬。但是一旦成为了自由职业者,有很多的事情就必须要自己一个人去面对,例如如何选择合适的项目,如何与客户沟通,如何保证项目的合理进展,如何保证合同的顺利签署等等,所有繁杂的事情都压在了一个人的身上。在这种时候,自由职业者就必须要向市场证明自己的价值,否则很可能连一份合同都拿不到,甚至连自己的赚钱系统都无法顺利的搭建。最后很可能证明的事情就是,你之前觉得你所擅长的事情,其实在市场上根本一文不值。

就算有了自己的赚钱渠道,例如自媒体写作,开咖啡店等。怎么安排自己的工作时间就是另外一个问题了。读过PHD的人都知道,除了那些整天要去实验室做实验的PHD们,理论研究的PHD们时间一般来说是相对自由的。在自由的时间里,有多少PHD是做了有价值的事情呢?我想大部分可能还是陷入拖延症的漩涡里不能够自拔吧。每天早起就是看电视,中午玩游戏,下午稍微看看论文,然后晚上就外出吃饭聚餐。除此之外,如果家人或者朋友觉得你是自由职业者,都会觉得你十分的悠闲,时不时的可能让你去拿个快递,寄封信件,然后陪他们出去聚餐等。这样的话,其实每天的工作时间就会十分的有限,工作效率也会大打折扣。因此,即使有了工作渠道,能否制定合适的工作计划和时间安排,也是自由职业者必须面对的问题。

在读书或者工作的时候,都会有人觉得迷茫,觉得这份工作或者继续读书没有价值。在从事自由职业的时候,这种迷茫与彷徨的感觉可能会更加强烈。例如,上个月没怎么努力就赚到了5000块钱,但是这个月努力了很久,却只收到了3000块。不稳定性和不确定性很容易让一个人的内心产生迷茫与彷徨,而且这种时候身边的人也不会理解你,因为他们很可能不是自由职业者。要解决这种问题其实只能够靠自己或者进入一个自由职业者的圈子里面,看一看别人是怎么解决这类问题的。但是,即使别人告诉你他的经验,也不见得对你有多大的帮助。对于时间相对自由的工作岗位,例如拿到 tenure 的大学教授,工作不是很繁忙的职员。在保证工作稳定的情况下,可以在工作之余尝试一下自己的兴趣爱好能否挣到钱,是否在市场上具有一定的竞争力。这样做的话能够尽可能的降低自己的风险。

综上所述,要判断一个人是否适合自由职业,首先要看以下几点:

  1. 自己拥有的技能是否真的有市场,能否给自己真正带来收入;
  2. 对自己的要求是否高,在日常的生活中自律性是否足够强;
  3. 对自己的未来是否有较为清晰的规划,是否能够扛住短期没有收入的风险。

如果不清楚以上几点,那么就不适合当自由职业者;如果能够清楚的知道以上几点,可能就具备了自由职业者的基本素质。

张戎 数学人生 2017-04-04

大数据领域的近似分析方法(一)

基数估算问题

基数估算(Cardinality Estimation),也称为 count-distinct problem,一直是大数据领域的重要问题之一。顾名思义,基数估算就是为了估算在一批数据中,它的不重复元素有多少个。

这个问题的应用场景十分广泛。例如:对于 Google 主页面而言,同一个账户可能会访问 Google 主页面多次。于是,在诸多的访问流水中,如何计算出 Google 主页面每天被多少个不同的账户访问过就是一个重要的问题。那么对于 Google 这种访问量巨大的网页而言,其实统计出有十亿 的访问量或者十亿零十万的访问量其实是没有太多的区别的,因此,在这种业务场景下,为了节省成本,其实可以只计算出一个大概的值,而没有必要计算出精准的值。

从数学上来说,基数估计这个问题的详细描述是:对于一个数据流 x_{1},x_{2}, \cdots, x_{s} 而言,它可能存在重复的元素,用 n 来表示这个数据流的不同元素的个数,i.e. n=|\{x_{1},\cdots,x_{s}\}|, 并且这个集合可以表示为 \{e_{1},\cdots,e_{n}\}. 目标是:使用 m 这个量级的存储单位,可以得到 n 的估计值 \hat{n}, 其中 m\ll n, 并且估计值 \hat{n} 和实际值 n 的误差是可以控制的。

如果是想得到精确的基数,可以使用字典(dictionary)这一个数据结构。对于新来的元素,可以查看它是否属于这个字典;如果属于这个字典,则整体计数保持不变;如果不属于这个字典,则先把这个元素添加进字典,然后把整体计数增加一。当遍历了这个数据流之后,得到的整体计数就是这个数据流的基数了。

cardinality_estimation_naive_solution
Naive Solution

这种算法虽然精准度很高,但是使用的空间复杂度却很高。那么是否存在一些近似的方法,可以估算出数据流的基数呢?其实,在近几十年,不少的学者都提出了很多基数估算的方法,包括 LogLog,HyperLogLog,MinCount 等等。下面将会简要的介绍一下这些方法。

cardinality_estimation_survey_table_1
基数估计的部分算法

HyperLogLog 的理论介绍

HyperLogLog 是大数据基数统计中的常见方法,无论是 Redis,Spark 还是 Flink 都提供了这个功能,其目的就是在一定的误差范围内,用最小的空间复杂度来估算一个数据流的基数。

Spark
Spark 的 Logo

HyperLogLog 算法简要思路是通过一个 hash 函数把数据流 \mathcal{D} 映射到 \{0,1\}^{\infty}, 也就是说用二进制来表示数据流中的元素。每一个数据流中的元素 x 都对应着一个 0,1 序列。

在介绍 HyperLogLog 之前,我们可以考虑这个实际的场景。在一个抛硬币的场景下,假设硬币的正面对应着 1, 硬币的反面对应着 0; 依次扔出 0,0,0,1 的概率是多少?通过概率计算可以得到是这个概率是 1/2^{4}=1/16. 那么相当于平均需要扔 16 次,才会获得 0001 这个序列。反之,如果出现了 0001 这个序列,说明起码抛了 16 次硬币。

考虑这样一个 0,1 序列,w=w_{1}w_{2}\cdots, w_{i}\in\{0,1\}, i\geq 1,k 表示第一个 1 出现的位置。也就是说 w_{1}=w_{2}=\cdots=w_{k-1}=0. 那么在扔硬币的场景下,出现这样的序列平均至少需要扔 2^{k} 次。对于一批大量的随机的 0,1 序列, 可以根据第一个 1 出现的位置来估算这批 0,1 序列的个数。也就是说:

  • 出现序列 1XXXXX 意味着不重复的元素估计有 2^1=2 个;
  • 出现序列 01XXXX 意味着不重复的元素估计有 2^2=4 个;
  • 出现序列 001XXX 意味着不重复的元素估计有 2^3=8 个;
  • 出现序列 0001XX 意味着不重复的元素估计有 2^4=16 个。

于是,对于随机的 0,1 序列,可以定义函数 \rho(w_{1}w_{2}\cdots) 来表示 1 出现的第一个位置。i.e. \rho(1XXXXX)=1, \rho(01XXXX)=2, \rho(001XXX)=3, \rho(0001XX)=4.

简单来看,其实 HyperLogLog 的基数统计就使用了这样的思想,通过二进制中 1 出现的第一个位置来估算整体的数量。首先把这批元素通过 hash 函数处理成 0,1 序列,然后把这批 0,1 序列都放入 1 个桶,然后通过计算这个桶里面所有 0,1 序列的 \rho(w) 的最大值,就可以预估出整体的数量。i.e. M=\max_{w}\rho(w), 整体的数量预估是 2^{M}=2^{\max_{w}\rho(w)}.

  • 1 个桶:计算出 M=\max_{w}\rho(w), 预估不重复的元素个数是 2^{M}.

那么如果只有 1 个桶,其实是会存在一定的偏差的。为了解决这个问题,一种想法就是重复以上操作,从 hash 函数开始处理成 0,1 序列,每次都把这批 0,1 序列放入 1 个桶,每次获得一个 M 值。总共操作 m 次,第 j 次操作得到的值记为 M_{j}; 于是就可以对 \{M_{1},\cdots,M_{m}\} 进行均值处理,可以使用以下方法:

  • 算术平均数:M=\sum_{j=1}^{m}M_{j};
  • 几何平均数:M=\sqrt[m]{M_{1}\cdots M_{m}};
  • 调和平均数:M=m/\sum_{j=1}^{m}M_{j}^{-1};
  • 中位数:M = median\{M_{1},\cdots,M_{m}\}.

从而可以预估整体的数量为 2^{M}.

如果按照以上的步骤进行操作,就是需要重复进行多次操作,在足够多的情况下,其实是没有必要那么操作的。HyperLogLog 也是用了多个桶,但是用了一个截断的技巧。对于一个 0,1 序列 x=\cdots x_{b+2}x_{b+1}x_{b}\cdots x_{1}, HyperLogLog 从某个位置 b 开始,低位 x_{b}\cdots x_{1} 用于决定桶的序号,也就是第几个桶。桶的个数就是 m=2^{b}, 高位 \cdots x_{b+2}x_{b+1} 用于估算放在桶里面的元素个数。

每次都可以获得一个值,也就是桶里面第一次出现

  • 第 1 个桶:计算出 M_{1}=\max_{w}\rho(w), 预估元素个数 2^{M_{1}};
  • 第 2 个桶:计算出 M_{2}=\max_{w}\rho(w), 预估元素个数 2^{M_{2}};
  • ….
  • m 个桶:计算出 M_{m}=\max_{w}\rho(w), 预估元素个数 2^{M_{m}};

均值的计算,HyperLogLog 使用了调和平均数 m/\sum_{j=1}^{m}2^{-M_{j}} 来估算桶里面的元素个数,那么在有 m 个桶的情况下,整体的元素个数就可以估算为 E=m^{2}\cdot\bigg(\sum_{j=1}^{m}2^{-M_{j}}\bigg)^{-1}.

hyperloglog_algorithm_simple
原始的 HyperLogLog 算法

其中的 \alpha_{m}=\bigg(\int_{0}^{+\infty}\bigg(\log_{2}\bigg(\frac{2+u}{1+u}\bigg)\bigg)^{m}du\bigg)^{-1}.m=1 的时候,\int_{0}^{+\infty}\log_{2}\bigg(\frac{2+u}{1+u}\bigg)du 是发散的;当 m\geq 2 的时候,\int_{0}^{+\infty}\bigg(\log_{2}\bigg(\frac{2+u}{1+u}\bigg)\bigg)^{m}du 是收敛的。因此,在使用这个算法的时候最好放入 m\geq 2 个桶。

HyperLogLog 分成两块,第一块就是 add 模块,用于分桶和统计;

for v in M:
    set x := h(v);
    set j = 1 + <x(b),...,x(2),x(1)>;
    set w := x(b+1)x(b+2)...; 
    set M[j] := max(M[j], \rho(w));

在 HyperLogLog 算法中,对于集合 \mathcal{M} 中的每一个元素 v\in\mathcal{M}, 可以通过 hash 函数转换成一个 0,1 序列 h(v)=x=<\cdots x_{b+2}x_{b+1}x_{b}\cdots x_{1}>, 其中 x_{1} 表示二进制中的最低位,x_{2} 表示次低位。

然后可以通过 <x_{b}\cdots x_{1}>_{2} 来计算放在第 j 个桶,这里 j=1+<x_{b}\cdots x_{1}>_{2}. 同时将 x 的高位拿出来,也就是 x_{b+1}x_{b+2}\cdots, 计算这批序列的 \rho 函数的最大值,然后记为 M_{j}; 这一步也可以称为 merge 模块,也就是进行更新合并。

compute Z := (\sum_{j=1}^{m}2^{-M[j]})^{-1};

上一步就是 HyperLogLog 的另外一步,count 模块,于是,进一步估算出 E=\alpha_{m}m^{2}Z.

HyperLogLog 的空间复杂度特别低,大约是 O(m\log_{2}\log_{2}n) 这个量级的,其中 m 是桶的个数,n 是基数。HyperLogLog 的时间复杂度则是 O(n), 只需要遍历一遍所有元素即可得到最终结果。

  • 假设基数为 2^{k}, 二进制就是 k 位,1 最晚就会出现在第 k 个位置上;而 k 只需要 log_{2}k 个 bit 就能够存储;
  • 假设基数为 2^{64}, 二进制就是 64 位,1 最晚会出现在第 64 个位置上;而 64 需要 6 个 bit 就可以存储。

hyperloglog_algorithm_compare
算法对比

在论文中,论文 “Hyperloglog: the analysis of a near-optimal cardinality estimation algorithm” 的作者们针对各种算法进行了对比,其实 HyperLogLog 的空间复杂度是非常小的,并且误差也在可控的范围内。

hyperloglog_algorithm_theorem
HyperLogLog 的定理证明

在论文 “Hyperloglog: the analysis of a near-optimal cardinality estimation algorithm” 作者们得到上述定理,精准的给出了 HyperLogLog 算法的误差估计。因此,HyperLogLog 算法其实是有数学定理证明的。

以上只是获得了理论上的 HyperLogLog 算法,但是在实战中,其实是需要进行微调的。主要的微调部分是根据理论中的 E 值来进行调整。将 E 值进行调整的话,情况可以分成三种:

  • 小范围;
  • 中等范围;
  • 大范围;

hyperloglog_algorithm_practical
实战中的 HyperLogLog

Case(1):小范围

在小范围的情况下,E\leq 5m/2, 此时的基数相对于桶的数量而言不算太多,因此可能存在多个空桶,需要进行调整。

可以思考这样一个问题:假设有 m 个桶,同时有 n 个球,把这 n 个球随机往这 m 个桶里面扔,每个球只能够进入一个桶,那么空桶个数的期望是多少个?

Answer:假设 A_{1},\cdots,A_{m}m 个桶,

P(A_{j}=\emptyset)=\bigg(1-\frac{1}{m}\bigg)^{n} 表示桶 A_{j} 空的概率;

P(A_{j}=\emptyset \cap A_{k}=\emptyset)=\bigg(1-\frac{2}{m}\bigg)^{n} 表示桶 A_{j}, A_{k} 同时为空的概率(j\neq k);

那么空桶个数的期望就是 m\cdot\bigg(1-\frac{1}{m}\bigg)^{n},m,n 充分大的时候,约为 me^{-n/m} 个。

因此,在小范围的情况下,如果空桶的个数 V\neq 0, 那么可以更新为 m\ln(m/V). 事实上,可以通过 V=me^{-n/m} 解出 n=m\ln(m/V).

Case(2):中等范围

E 值不作调整。

Case(3):大范围

E>2^{32}/30, 那么更新为 E^{*}=-2^{32}\ln(1-E/2^{32}), 其中 E^{*}>E.

通过这样的方法,E^{*} 的误差大约在 \pm 1.04/\sqrt{m} 左右。

除此之外,\alpha_{m} 其实也可以用近似值来代替,毕竟如下公式的计算是有一定的成本的。

\alpha_{m}=\bigg(\int_{0}^{+\infty}\bigg(\log_{2}\bigg(\frac{2+u}{1+u}\bigg)\bigg)^{m}du\bigg)^{-1}.

近似的值为 \alpha_{16}=0.673, \alpha_{32}=0.697, \alpha_{64}=0.709, \alpha_{m}=0.7213/(1+1.079/m)m\geq 128.

HyperLogLog 的案例分析

有一个关于 HyperLogLog 的 demo 网站可以看到 HyperLogLog 的算法过程,其链接是 http://content.research.neustar.biz/blog/hll.html

在这个 demo 中,作者对比了 LogLog 和 HyperLogLog 的区别和运行过程,有助于大家理解整个过程。其中 LogLog 与 HyperLogLog 的区别就在与它们平均值的处理方式不一样,前者是使用算术平均值,后者是使用调和平均值。

  • LogLog\alpha_{m}\cdot m\cdot 2^{\sum_{j=1}^{m}M_{j}/m};
  • HyperLogLog\alpha_{m}\cdot m^{2}\cdot\bigg(\sum_{j=1}^{m}2^{-M[j]}\bigg)^{-1};

hyperloglog_demo_1
HyperLogLog Demo:初始化

hyperloglog_demo_2
第一个 hash 值:3852172429

3852172429 的二进制是:11100101100110110111110010001101,可以划分为100 110110111110010 001101。最后的六位是 001101,十进制就是 13,那么这个数字就会被放入第 13 个桶;而 110110111110010(从低位到高位看),\rho 函数的值就是 2;于是在第 13 个桶就会把 0 更新成 2。

hyperloglog_demo_3
第二个 hash 值:2545698499

2545698499 的二进制是 10010111101111000100011011000011,用同样的分析可得结论。

hyperloglog_demo_4
第三个 hash 值:2577699815

2577699815 的二进制是 10011001101001001001001111100111。

hyperloglog_demo_5
第四个 hash 值:775376803

775376803 的二进制是 101110001101110100111110100011。

hyperloglog_demo_6
运行结束

从以上的 Demo 运行过程可以看出,整个 HyperLogLog 的算法逻辑还是相对清晰的,其整个算法的亮点应该在于借助了抛硬币的场景,用抛硬币的结果来估算抛硬币的次数。

参考文献:

  1. Count-distinct Problem 的维基百科:https://en.wikipedia.org/wiki/Count-distinct_problem
  2. Heule, Stefan, Marc Nunkesser, and Alexander Hall. “HyperLogLog in practice: algorithmic engineering of a state of the art cardinality estimation algorithm.” Proceedings of the 16th International Conference on Extending Database Technology. 2013.
  3. Flajolet, Philippe, et al. “Hyperloglog: the analysis of a near-optimal cardinality estimation algorithm.” 2007.
  4. HyperLogLog 的 demo 网站:http://content.research.neustar.biz/blog/hll.html

统计与大数据专业究竟在学什么?

统计学是一门关于数据分析的学科,用于测量,收集,整理,归纳和分析数据的真实情况和估算情况。统计学从 17 世纪的中期逐渐发展起来,不仅存在于概率与数理统计领域,还广泛应用在各种自然学科,社会科学和人文科学上,也会被用于各种团队,企业和国家的决策。随着大数据时代的到来,统计学也与计算机,信息学等领域紧密结合,是数学科学的有力工具之一。

概率论_2
正态分布

描述统计学(descriptive statistics)又称为叙述统计,是统计学中用于描述和总结所观察到对象的基本统计信息的一门学科。描述统计的结果是对当前已知的数据进行更精确的描述和刻画,分析已知数据的集中性和离散性。描述统计学通过一些数理统计方法来反映数据的特点,并通过图表形式对所收集的数据进行必要的可视化,进一步综合概括和分析得出数据的客观规律。与之相对应的是推断统计学(statistical inference),又称为推断统计,是统计学中研究如何用样本数据来推断总体特征的一门学科。推断统计学是在对样本数据描述的基础上,对总体的未知数据做出以概率形式来描述的推断。推断统计的结果通常是为了得到下一步的行动策略。以上的两个统计学方向都属于应用统计学。

population_and_sample
总体和样本

在有的学校,统计专业是放在数学系里面的,而有的学校则是把统计和数学分开,形成数学系(Department of Mathematics)和统计系(Department of Statistics)。无论分开还是合并,一般情况下都是放在理学院(Faculty of Science)的。

NUS_Stat_Logo
NUS 统计与应用概率系

统计系和数学系的低年级课程是十分接近的,基本上还是数学分析,线性代数,概率论等一系列的课程。

Module_Level_1_2
Level 1000 和 Level 2000

到了高年级之后,所学的课程与数学系的课程就会出现明显的区别。数学系的学生会学习实分析,复分析,泛函分析等一系列课程。而统计系的学生会学习回归分析,随机过程,数据分析,贝叶斯分析等诸多课程。统计系的学生更偏向应用一些,数学系的学生课程则会更加理论一些。

Module_Level_3_4
Level 3000 和 Level 4000

从 NUS 在 2020 的 E-Open House 的资料可以看出,统计专业的学生,其就业方向也是十分宽泛的,可以考虑去银行,金融机构就职;也可以考虑去咨询公司,也可以去政府或者教育机构找到合适自己的工作。

统计的行业需求
统计专业的行业需求

对于第四年的学生,如果在国内的话,一般情况下会选择保研,考研,找工作,甚至出国留学。有的学生也会选择去找一个长达半年到一年的实习。这个就根据每个同学的实际情况而定了,但是绝大部分也就是这几个选择,或者有人也会选择 gap 一年修正一下。

简要课程安排_3
最后一年的项目

相对于数学系,统计系的课程安排更加偏向于实战与应用,并且其实用性也会高于数学系的理论课程。如果未来要从事数据分析,商业分析等方向的话,其实攻读统计系是一个还不错的选择。

在新加坡国立大学的统计与应用概率系,除了统计系这一经典的专业之外,还提供了数据科学与分析(Data Science and Analytics)这一个新兴专业供学生选择。

众所周知,随着科技时代的到来,数据的增加是非常迅速的,无论是用户自身产生的数据,还是平台方产生的数据,都是十分巨大的。数据的增大那就意味着需要使用各种各样的计算机,统计,数学方面的技术来解决现有的疑难杂症,于是大数据时代的技术也逐渐映入大家的眼帘。

DataScience_1
数据趋势

无论是国内还是国外,都在提倡智慧城市这一概念,那么在智慧城市中,大数据技术就是一个绕不开的话题。各行各业都将会使用大数据系统来做各种服务,包括推荐系统(Recommender Systems),高频交易,风险管理,移动支付等等。通过这些技术,人们的生活质量将会大大提升。通过这些产品,科技将会给人们带来诸多便利。

DataScience_3
智慧城市

而数据科学是一门交叉学科,它需要使用到计算机科学(Computer Science)数学(Mathematics)统计学(Statistics)等多种学科的技术和知识点。如果要应用在金融领域,还会要求从业者掌握金融方面的知识。因此,数据科学在这个时代背景下是具有实用性的,也是很多行业的发展趋势。

DataScience_4
数据科学

从其课程设置也可以看出,学生们所学的课程包括编程,数据结构与算法,也包括微积分和线性代数,还有统计学等诸多基础课。在高年级的时候,将会学习人工智能,计算与优化,数据库,数据处理,机器学习等课程。除此之外,在具体做项目或者实习的时候,将会根据方向的需要来学习相关的业务知识,涵盖了金融,医药,调度优化等诸多领域。

DataScience_6_Essential_Modules

DataScience_7_Elective_Modules
课程设置

整体来看,统计与数据科学专业是以实用性为目的,培养学生的理科思维,动手能力和数据分析能力的一门学科。如果学生希望学习理科并且将来学以致用的话,其实选择统计或者数据科学是一个不错的选择。

参考资料:

  1. NUS E-Open House:2020,YouTube 视频;
  2. http://www.stat.nus.edu.sg:NUS 统计系官网。

《软技能:代码之外的生存指南》

《软技能:代码之外的生存指南》是笔者刚刚进入公司工作,开始职场生涯的时候,一个偶然的机会从同事那里看到的一本书。从其内容提要可以看出,这是一本关注软件开发人员自身发展的书籍,书中讲了 7 个部分,包括:

  1. 职业;
  2. 自我营销;
  3. 学习;
  4. 生产力;
  5. 理财;
  6. 健身;
  7. 精神。

软技能_Cover
《软技能:代码之外的生存指南》

本书的作者从自身的亲身经历出发,按照以上 7 个方面给大家介绍了软件开发人员的自我发展历程,包括程序员的职场发展,程序员的自我营销策略,程序员如何培养学习习惯,程序员如何提升自己的生产力,如何培养良好的理财习惯健身将会带来多少好处,精神将会如何提升自我的能力。通过阅读这本书,程序员确实可以从作者的字里行间学习到很多东西,并且积极思考自己的职业生涯,丰富自己的业余生活,让自己的生活更加丰富多彩。

从作者的自我介绍可以得知:John Z. Sonmez 是 “Simple Programmer” 网站的创始人,他为在线培训机构 Pluralsight 开发了 50 多门在线课程,其领域涉及 iOS,Android,.NET,Java 和游戏开发等诸多主题。他还是 “Get Up and CODE” 的主持人,并且在这里讨论关于程序员健身的话题;他也是 “Entreprogrammers” 的播客主持人,他在此与其他人分享构建在线业务的真实故事。

John Z. Sonmez 是不少程序员的人生导师,通过他写的教材,讲授的课程,传递的人生故事,让不少的程序员了解到了前辈的发展历程,并且能够启发程序员如何才能够过上更加充实的生活。通过“化繁为简”的方法,传授给程序员让他们达成自身目标的力量与动力。

下面来摘选一下本书中的经典语录:

Chapter 1:职业

就业选择:列出你的选择:

  1. 雇员:对广大软件开发者而言,这是一项常见的,默认的就业选择。身为雇员的最大好处就是稳定。
  2. 独立咨询师:独立咨询师通常有自己的公司,依照合同为客户工作,但并不与任何一个客户绑定。做独立咨询师最大的好处可能就是赚钱的潜力。
  3. 创业者:创业之路可能是你职业生涯中最难,最不确定但却最具回报潜力的选择。雇员和独立咨询师都在以时间换金钱,而创业者尽管换不来预付的报酬,但是他却有机会在未来获得更大的收益。创业者的两大优势:完全自由和完全不封顶的赚钱潜力。

软技能_Table_6_1
优点与缺点

选择什么完全取决于你自己,并且你也可以随时切换路径。

成为专业人士:

  1. 一切都始于习惯。习惯是成为专业人士必不可少的部分。需要培养自己的专业习惯,需要具备时间管理技能。
  2. 坚守正道。专业人士必须对工作的优先级做出艰难的抉择。
  3. 追求品质,完善自我。你必须不断改善和提高自己的工作品质。

Chapter 2:自我营销

自我营销的正确方式就是为他人提供价值。成功进行自我营销的关键在于:如果想让别人喜欢你,想和你一起工作,你就必须要为他们提供价值。

你也许是世界上最有天赋的软件开发人员,但是如果没有人知道你的存在,你也只不过是浮云一片。

软技能_Table_19_1
自我营销的方式

打造引人注目的品牌

  1. 品牌所需要传递的信息;
  2. 品牌的一致性;
  3. 品牌的视觉符号;
  4. 品牌的曝光率。

创建大获成功的博客

  1. 打造成功博客的最大秘诀有且仅有一个—持之以恒;
  2. 只是持之以恒还不足以使你的博客大获成功,你还应该确保你写的都是高质量的内容。
  3. 重视博客内容品质的另一个重要原因是为你的博客提供更有价值的链接。
  4. 在起步之初,你的博客很可能会很糟糕。但是,随着不断尝试贡献出优秀的内容,而不是将自己脑子里的东西随意丢在网上,不考虑格式和结构还有一大堆拼写错误,你终会成功。

软技能_Table_23_1
通过社交媒体分享的内容

Chapter 3:学习

十步学习法

  1. 第 1 步:了解全局;
  2. 第 2 步:确定范围;
  3. 第 3 步:定义目标;
  4. 第 4 步:寻找资源;
  5. 第 5 步:创建学习计划;
  6. 第 6 步:筛选资源;
  7. 第 7 步:开始学习,浅尝辄止;
  8. 第 8 步:动手操作,边玩边学;
  9. 第 9 步:全面掌握,学以致用;
  10. 第 10 步:乐为人师,融会贯通

知识短板会阻碍你的进步。准确识别它们的最佳方式之一就是看看自己在哪些工作上花费了大量的时间。或者一直在进行重复性劳动。

任何你所做的重复性工作都值得彻查一番。

另一种识别知识短板的方法就是,时刻都要试图了解自己不理解或不清楚的事物。

软技能_Table_35_1
检查知识短板

Chapter 4:生产力

生产力提升计划:我的生产力提升计划的基本思路就是,我把一周的时间分配给一个一个用时不超过两小时的小任务。

  1. 季度计划:在做季度计划时,我会尽力列出我想在本季度完成的每一个大项目,我还会制定一些较小的目标。
  2. 月计划;每个月的第一天我会打印出当月的月历,并且规划出每天要完成的工作。
  3. 周计划;每周一的早晨,我会做我的周计划。
  4. 日计划及执行:要计划好这一天,我首先要把对应日期里的卡片移到“今天”这一栏,并把它们按照重要性排序。我要保证自己优先完成最重要的事情。

一些常见的时间杀手

  1. 看电视;
  2. 社交媒体;
  3. 新闻网站;
  4. 不必要的会议;
  5. 烹饪:因人而异;
  6. 玩电子游戏(尤其是网络游戏);
  7. 工间喝咖啡休息:因人而异。

软技能_Table_48_1
任何行动都比不采取行动好

Chapter 5:理财

软技能_Table_49_1
资产与负债

Chapter 6:健身

可能的健身目标:

  1. 减肥(减掉脂肪);
  2. 增肌(增长肌肉);
  3. 增加力量(不一定是增长肌肉);
  4. 增加肌肉耐力(改善运动表现);
  5. 改善心血管健康;
  6. 在某些运动上表现更好。

Chapter 7:精神

积极思考问题的根源是这样一种信念—你比你所处的环境更伟大。这种信念让你总能先看到事物好的一面,因为无论身处任何环境,你都有能力改变自己的未来。这是人类成就的最高信念,是世界上最强大的力量。

从更现实的层面来讲,积极思考就是选择从好的一面(而不是从坏的一面)去思考问题。

畏惧失败似乎是大多数人的本能。

失败不同于被打败。失败是暂时的,被打败是永恒的。

不要畏惧失败,要拥抱失败。不只是因为失败和被打败不同,还因为失败是通往成功的必经之路。

结束语

感谢你抽出时间来阅读这本书,并真诚地希望你能在本书中发现一些永久的价值。

 

时间序列异常检测—节假日效应的应对之道

在时间序列异常检测中,通常有一个较为常见的场景就是“节假日效应”。所谓节假日效应,指的就是在节假日的时候,其时间序列的走势跟日常有着明显的差异性,但是又属于正常的情况。从国内 2020 年的节假日安排可以看出,一年中有好几个关键的假日:

  1. 元旦:1 天;
  2. 春节:7 天;
  3. 清明节:3 天;
  4. 五一劳动节:5 天;
  5. 端午节:3 天;
  6. 国庆节:8 天。

在这些节假日的时候,为了调休,自然也会带来工作日上的调整。例如:在 2020 年 1 月 19 日,2020 年 2 月 1 日是需要上班的(虽然今年受疫情影响最终也没上班)。因此,在这些节假日进行调整和变化的时候,各种各样的业务指标(时间序列)通常也会发生变化,变得跟以往的走势不太一致。因此,如何解决节假日效应的时间序列异常检测就是业务上所面临的问题之一。

£¨Í¼±í£©[Éç»á]2020Äê½Ú¼ÙÈշżٰ²ÅŹ«²¼
2020 年的放假安排
清华大学的 Netman 实验室在 2019 年发表了一篇论文,专门用于解决时间序列异常检测中的节假日效应问题,论文的标题是《Automatic and Generic Periodic Adaptation for KPI Anomaly Detection》。在本文中,所用的时间序列是关于各种各样的业务指标的,包括搜索引擎,网上的应用商店,社交网络数据等等。作者们针对 KPI(Key Performance Indicator)做了时间序列异常检测,并且发明了一种方法来避免节假日效应的问题。论文针对时间序列的工作日(work days),休息日(off days),节假日(festival)做了必要的区分,然后将时间序列的不同时间段进行合理地拆分和组装,再进行时间序列异常检测,从而在一定的程度上解决节假日效应问题。

节假日效应_Fig1
实际案例(1)

在实际的案例中,我们可以看到,同一条时间序列的走势在工作日(work day),休息日(off day),春节(Spring Festival)明显是不一样的。因此,根据工作日的时间序列走势来预测春节的走势明显是不太合理的;同理,根据春节的走势来预测休息日的走势也会带来一定的偏差的。那么如何解决节假日效应的问题就成为了本篇论文的关键之一。

节假日效应_Fig3
实际案例(2)

在上图中,我们可以看到论文中使用的数据都具有某种周期性(Periodicity)。KPI A,B,C 都是具有明显具有工作日和周末特点的,在工作日和周末分别有着不同的形状;KPI D 则是关于网上应用商店周五促销的,因此在周五周六的时候,其实时间序列会出现一个尖峰(peak);KPI E 的话则是每隔 7 天,会有两个尖刺,然后并且迅速恢复;KPI F 的话则是可以看出时间序列在十一的走势跟其余的时间点明显有区别。除此之外,对于一些做旅游,电商等行业的公司,其节假日效应会更加突出一点,而且不同的业务在节假日的表现其实也是不一样的。有的时间序列在节假日当天可能会上涨(电商销售额),有的时间序列在节假日当天反而会下降(订车票,飞机票的订单量)。因此,在对这些时间序列做异常检测的同时,如何避免其节假日效应就是一个关键的问题了。

而在实际处理的时候,通常也会遇到几个常见的问题;

  1. 周期性的多样性:通过实际案例可以看出,对于不同的时间序列,其周期是完全不一样的,而且在不同的周期上也有着完全不同的表现;
  2. KPI 数量巨大:这个通常来说都是智能运维领域中的常见问题;
  3. 周期的漂移:一般来说,通过时间序列的走势我们只能够看出一个大致的变化,但是具体到细节的话,周期是存在一定的波动的。例如不一定恰好是 7 天,有可能是 7 天加减 5 分钟之类的周期。这个跟业务的具体场景有关系,也跟当时的实际情况有关。

于是,基于这些挑战,作者们希望提出一个健壮的机器学习算法来解决这个问题,本文的系统被作者们称之为 Period,正好也象征着解决节假日效应这个寓意。

Period_Fig7
Period 的整体架构

从论文中可以看出 Period 的整体架构如上图所示,包括两个部分:

  1. 离线周期性检测(offline periodicity detection);
  2. 在线适应性异常检测(online anomaly detection adaptation)。

在第一部分,每一条时间序列都会被按天切分成很多子序列(subsequence),然后将其聚集起来,把相似的时间序列放在一类,不相似的放在另外一类;在第二部分,新来的时间序列会根据其具体的日期,分入相应的聚类,然后用该类的时间序列异常检测方法来进行异常检测。

Period_Fig6
Period 的核心思路

从上图可以看到 Period 的核心思路(core idea)。在本文使用的数据中,时间序列的长度较长,一般来说都是好几个月到半年不等,甚至更长的时间。对于一条时间序列(a given KPI),可以将它的历史数据(historical data)进行按天切分,获得多个子序列(sub KPIs)。对于这多个子序列,需要进行聚类以得到不同类别。或者按照日历直接把时间序列的工作日(work day),休息日(off day),春节(spring festival)序列进行切分,将工作日放在一起,休息日放在一起,春节放在一起。把这些子序列进行拼接就可以得到三条时间序列数据,分别是原时间序列的工作日序列(work day subsequence),休息日序列(off day subsequence),春节序列(spring festival subsequence)。然后分别对着三条时间序列训练一个异常检测的模型(例如 Holt-Winters 算法,简写为 HW)。对于新来的时间序列,可以根据当日具体的日期(工作日,休息日或者春节)放入相应的模型进行异常检测,从而进一步地得到最终的结果。

在离线周期性检测的技术方案里面,是需要对时间序列进行周期性检测(Periodicity Detection)。而周期性检测有多个方案可以选择。第一种就是周期图方法(Periodogram),另外一种就是自相关函数(Auto-correlation function)。但是在这个场景下,用这些方法就不太合适了。作者们提出了别的解决方案。

在本文中,作者们提出了一种 Shape-based distance(SBD)的方法,针对两条时间序列 X=(x_{1},x_{2},\cdots,x_{m})Y=(y_{1},y_{2},\cdots,y_{m}),提出了相似性的计算方法。

X_{(s)}=\begin{cases}(0,\cdots,0,x_{1},\cdots,x_{m-s}), &\text{ if } s\geq 0 \\ (x_{1-s},x_{1-s+1},\cdots,x_{m},0,\cdots,0), &\text{ else } s<0.\end{cases}

其中 0 的个数都是 |s|. 进一步可以定义,当 s\in[-w,w]\cap\mathbb{Z} 时,

CC_{s}(X,Y)=\begin{cases}\sum_{i=1}^{m-s}x_{i}\cdot y_{s+i}, &\text{ if } s\geq 0 \\ \sum_{i=1}^{m+s}x_{i-s}\cdot y_{i}, &\text{ else } s<0.\end{cases}

于是,选择令 CC_{s}(X,Y) 归一化之后的最大值作为 X,Y 的相似度,i.e.

NCC(X,Y)=\max_{s\in[-w,w]\cap\mathbb{Z}}\frac{CC_{s}(X,Y)}{\|x\|_{2}\cdot\|y\|}.

而基于 SBD 的距离公式则可以定义为:

SBD(X,Y) = 1-NCC(X,Y).

Period_Fig8
Periodicity Drift

那么为什么需要考虑一个漂移量 s 呢,因为在一些实际的情况下,时间序列是会存在漂移的,例如上图所示。该时间序列在 10 月 30 日,31 日,11 月 1 日 都出现了一个凸起,但是如果考虑它的同比图,其实是可以清楚地看出该时间序列就存在了漂移,也就是说并不是在一个固定的时间戳就会出现同样的凸起,而是间隔了一段时间。这就是为什么需要考虑 s 的由来。

Period_Alg1
聚类的命名算法

通过相似性和距离的衡量工具,我们可以将时间序列进行聚类,然后通过上述算法也可以对每一个聚类的结果进行命名。

Period_Table1
实验数据

Period_Table2
实验数据的聚类结果

在本文中,针对以上六条时间序列,作者们做了详细的分析,也对其余的 50 条时间序列进行了实验。其使用的方法包括 HW,TSD,Diff,MA,EWMA,Donut。在 HW 中,针对不同的日期使用了不同的方法,例如 HW-day,HW-week,HW-period;其余的方法也是针对不同的日期来做的。

Period_Table3
实验方法

Period_Table12
实验效果

从实验效果来看,Period 方法的话相对于其他方法有一定的优势。

结论:Period 方法包括两个部分,第一部分是离线周期性检测,第二部分是在线适应性异常检测。通过这样的方法,可以有效地减缓时间序列异常检测受节假日效应的影响。除此之外,想必未来也会有其余学者提出相应的问题和解决方案,敬请期待。

信息与计算科学是一门什么专业?

信息与计算科学是一门什么专业?

在 2005 年刚进入大学校门的时候,数学分析和高等代数就是大一新生的必修课,当年讲高等代数的是丁老师与何老师。由于个人的姓氏英语字母是 Z,则被安排在二班,于是恰好就由何老师教授高等代数课程。刚入学没多久,何老师则在课堂上问大家,“你们当时为什么选择信息与计算科学?”下面顿时一片寂静。何老师紧接着就说可能是因为专业名字的原因,在填写志愿的时候,高中生一看这个专业的名字,既有信息又有计算,就会觉得这是一个非常偏应用的专业,于是就果断地将其填写在第一志愿上。结果入学之后傻眼了,这个专业是被安排在数学系,也就是属于数学这个一级学科。

信息与计算科学(Information and Computing Science)从名字上来看,确实像一个计算机方向的学科,但是它的原名却是计算数学,后来教育部在 1998 年改成了信息与计算科学。该专业强调以信息领域为背景,数学,信息,计算机管理相结合的数学类专业。目的是培养有良好的数学基础,能够熟练使用计算机,初步具备在信息与计算机科学领域的某个方向从事科学研究,解决实际问题,设计开发有关计算机软件的能力的学生。

在数学系的话,就不可避免地要学习各种数学系的课程,通常来说数学系的前两年都是基础课的教育,包括:数学分析,高等代数,解析几何,C++,离散数学,常微分方程,抽象代数,复变函数,数值计算等课程。

到了第三年才开始逐渐分流,学习不同的课程。如果是在数学与应用数学专业,就是学习实变函数,泛函分析,拓扑学,微分几何等课程。如果是在信息与计算科学,则是学习实变函数,泛函分析,偏微分方程数值解,运筹学,计算机图形学,信号处理等课程。在不同的专业上面,所学习到的课程内容则是完全不一样的。而该专业的编程工具主要还是使用 Matlab,毕竟用 C++ 这种编程语言写矩阵运算一类的确实不太合适。

如果是想在信息与计算科学这个专业上学习很多计算机方面的基础课,例如操作系统,计算机网络,计算机组成原理等课程,估计会让学生们大失所望。因为,信息与计算科学是属于数学这个一级学科,是数学系的专业,而不是计算机系的专业。于是,绝大部分高校还是会把它设置在数学学院下面,而不是计算机学院下。不过,确实也听说有的工科学校确实也给数学系的学生传授了很多计算机方面的知识,但整体来看信息与计算科学方面的学生所学的计算机知识还是相对偏少的。PS:当年读书的时候,该专业确实没有设置计算机方面的课程,例如数据结构等计算机的经典课程其实都是相对缺失的。

在校园招聘的时候,信息与计算科学这个名字也具有一定的迷惑性,因为总有很多面试官会认为这是一个计算机的专业,而没有意识到这个是一个数学类的方向。结果问了一堆计算机方面的问题,学生都不一定能够回答得上来。

近些年的机器学习方向很火,有的公司确实也会考虑从数学系招聘一些相关的人才。数学系所学的课程其实整体来看还是偏理论,实践方面的偏少许多,即使是信息与计算科学这个专业,教授的也是矩阵运算,偏微分方程数值解等课程,在工业界确实也有一定的应用,但是确实也算是脱离了实际。一般情况下,在工业界哪能够精准地写出一个偏微分方程或者常微分方程,最常见的都是一大堆表格数据,各种图片和文本数据,极端情况下,连数据都还没有收集好。数学系的学生实践方面的能力在刚毕业的时候确实不太行,不如计算机专业的学生上手极快,但是确实应该给予数学系的学生一定的耐心和鼓励。毕竟两者思考问题的思路和方向是不太一样的,从不同的角度看问题确实能够带来不同的启发。

提到机器学习,不知道现在的课程安排有没有做适当的改进和迭代。如果想要从事数据挖掘和机器学习相关工作的话,光靠信息与计算科学专业所教授的数学课程内容应该是远远不够的,无法满足工业界对人才的需求,因此建议在编程方面还应该补充一些 SQL,Python,C++,Java,Golang 方面的基础知识,也要掌握数据结构中的常见算法,更要把机器学习的相关课程尽量补上。只有这样,才能够在求职就业的时候占据一定的优势。只靠数学系所教的数学想找工作是非常困难的,只有把数学和计算机相结合之后才能够发挥数学系专业人才的优势。

如果学生恰好在信息与计算科学专业就读,最担心的一种情况就是不仅数学没学好,计算机方面的技能也稀松平常,最终耽误了自己。因此,在学习的时候还是建议先打好数学和计算机方面的基础,然后加强社会实践,多参与实习和各种社会活动,通过实习来了解业务问题,才能把所学到的数学知识应用到实践中产生价值。

 

傅里叶分析与调和分析

傅里叶分析

傅里叶变换(Fourier Transform)其实是数学里面非常重要的一门技术。在数学分析里面,就有傅里叶分析的身影,用于计算正整数的倒数和等于 \pi^{2}/6, 并且还有很多其他有意思的性质。

对于初学这门课程的人而言,建议阅读一代数学大师,沃尔夫奖得主 Elias M.Stein 撰写的《傅里叶分析导论》,英文名是 Fourier Analysis An Introduction。

在这本书里面,作者从波动方程和热方程开始,逐渐引入傅里叶变换的基础知识和概念,也介绍了傅里叶级数的收敛性质。其中包括单位区间上的傅里叶变换和实数轴上的傅里叶变换,最终将其推广到高维实数空间中。除此之外,作者也基于这些基础知识介绍了傅里叶分析在其他领域中的应用,包括等周定理(The Isoperimetric Inequality),同程度分布定理(Weyl’s Equidistribution Theorem),数论中的 Dirichlet 定理等等。让读者在学习傅里叶分析的同时,认识到傅里叶分析是在数学各个领域都有着重要应用场景的一门学科。

傅里叶分析导论
傅里叶分析导论

调和分析

之前在北京大学学了整整一个学期的调和分析,是由 BICMR 的苗老师主讲。在这门课上我受益匪浅,故写一篇文章来感激下这位老师,同时写一下自己学习调和分析的感受。

调和分析起源于 Fourier 这位数学家的研究,故也可以称为 Fourier 分析。其主要内容包括算子插值方法,Hardy-Littlewood 极大算子,Fourier变换,Calderon-Zygmund’s Inequality,函数空间,Ap 权等等。下面一一介绍这些基本内容。

(1) 算子插值方法

里面主要有 Marcinkiewicz Interpolation Theorem 和 Riesz Thorin Interpolation Theorem两个定理,分别是用实变方法和复变方法证明的。这两个定理则是研究算子的 L^{p} 有界性的关键定理,是整个调和分析的基础。

(2) Hardy—Littlewood Maximal Operator

这个是一个相当重要的拟线性算子,利用 Vitali Covering Theorem 和 Marcinkiewicz Interpolation Theorem 可以证明该算子是 L^{p} 有界的。证明过程不超过10行,但是证明过程相当的漂亮。

(3) Fourier Transformation

调和分析的主要工具,这个工具不仅仅在调和分析上有用,在 PDE 和随机过程中,这也是一个相当重要的工具。它把一个物理空间上的函数,转换成频率空间上的函数,从而获得了很多很好的性质。

(4) Calderon-Zygmund’s Inequality

这个定理是调和分析的经典定理之一,是处理卷积型的奇异积分的。可以看成是 Minkowskii 不等式的推广。Zygmund 把定理的条件放的很弱,只需要加上 Hormander 条件就可以得到算子的 L^{p} 有界性。然后也可以考虑其条件的充要条件。

(5) 函数空间

调和分析里面提到的函数空间包括 Sobolev space,Lipschitz space,Hardy space,Besov space 等等。 其中 Sobolev space 在 PDE 上面用处广泛,其代表作就是 Adams 的 Sobolev Space。Besov Space 里面有一个插值定理,也相当的重要,差不多 5 页吧,当时苗老师让我们全部背下来,嘿嘿。另外, Hardy Space 里面有一个相当重要的定理,就是所谓的 Duality of BMO and H^1 Space. 其证明过程大概有10页吧,是由 C.Fefferman 和 Elias.M.Stein 在上个世纪70年代给出的,方法太经典了,看完之后甚至会觉得自己没有必要学数学了。

(6) Ap weight

这个也是调和分析的分支之一,其中周民强老先生的书上有详细记载,就不一一阐述了。

以上的这些内容就是之前一个学期在北大学习所学到的东西,学了调和分析之后,基本上就不怕所谓的硬分析了。总之收获还是蛮多的,非常欣赏那位老师,一个学期讲了那么多东西。其实以上我提到的只是他讲的东西的一半内容,他后面还讲了很多 Schrodinger 方程的内容,由于本人实力有限,实在是没有能力再学后面的内容了。

ps:去 BICMR 学习是 2009 年的事了,一晃眼 11 年过去了。

参考文献:

  1.  Loukas Grafakos,GTM249,Classical Fourier Analysis
  2. Loukas Grafakos,GTM250,Modern Fourier Analysis
  3. Elias M.Stein 傅里叶分析导论

备注:

  1. 第 1,2 两本书是调和分析的经典之作,几乎涵盖了实变方法的所有内容。不过有点厚,差不多 1100 页。
  2. 除此之外,也可以阅读 Elias M.Stein 所撰写的《调和分析》,但是这本书不适合做教材,只能够作为翻阅的材料进行阅读。

在新加坡的这五年—学术篇(三)

上一篇文章写了博士生毕业答辩的一些事情,这篇文章来写一写其他的内容。

无论在哪个高校,不少的博士生在准备博士答辩之前,就已经在导师的安排下早早找好了下家。有的同学是去美国,有的同学是去日本,有的同学是去欧洲。如果实在暂时没有外出的计划和打算,同学们也就留在新加坡继续从事科研工作,例如可以留在本校做研究员(Research Fellow)继续从事之前尚未完成的工作,也可以选择去 A*Star 等科研机构跟随其他教授。对于部分能力较强的博士,则可以直接找到国内外的教职,正式拿到学术圈的入场券。

刚进师门的时候,师兄们尚未毕业,等到师兄们毕业的时候,其实也有不少的选择。有的师兄去英国做了短期博士后,有的师兄则是去了智利等南美国家从事了好几年的博士后工作。虽然相对新加坡而言,智利确实也算不上特别好的出路,但是为了科研和论文,其实去智利从事几年科研工作也是非常不错的选择。翻阅了一下 Google,看了各个国家的人均 GDP,新加坡还是属于名列前茅的,智利算是南美洲还不错的国家之一。

新加坡人均GDP
新加坡人均 GDP

智利人均GDP
智利人均 GDP

中国人均GDP
中国人均 GDP

相比智利而言,巴西实在是一个不那么靠谱的国家。虽然巴西这个国家不那么靠谱,但是他们的数学好像还是可以的,尤其是动力系统方向。在 IMPA 数学研究所和圣保罗大学(University of Sao Paulo)大学都有不少杰出的数学家,不仅有菲尔兹奖得主,还有各种各样的科研工作者。对于在新加坡生活过的学生而言,虽然去巴西能够认识一些优秀的数学家,但是这对自身的科研发展而言并不是最优的选择。毕竟未来找教职的时候,学校除了看候选人的论文之外,也会看候选人的出身。而博士出身就包括导师的人脉,学校的排名等诸多因素。

IMPA
IMPA

在 Google 上搜索了一下新加坡的博士后工资和巴西的博士后工资。根据汇率兑换工具可知:5854 巴西雷亚尔 = 7534 人民币,不如 2019 年深圳的平均工资。5000 新加坡币 = 25000 人民币,这说明新加坡的博士后收入其实是远高于巴西的博士后水平的。而且在新加坡工作的博士生,通常待遇都还不错,一般情况下也能够找到 4000 – 5000 新币甚至更高收入的工作。不到万不得已,其实没有必要去做一份 7000 人民币的工作。

巴西博士后工资
巴西博士后的工资

新加坡博士后工资
新加坡博士后的工资

巴西作为距离中国最远的国家之一,从中国香港飞到圣保罗大约需要 26 个小时的时间,至少需要在欧洲转机一次才能够继续前往巴西,而且有不少航班都是转机两次。如果在南美洲从事科学研究的话,估计回家也是一件困难的事情,一年最多只有一次机会,极有可能三年的青春都在巴西度过了。

世界地图
世界地图

在豆瓣上,有一部可以排进 Top250 的电影,叫做《上帝之城》。讲述的是巴西黑帮在里约热内卢的故事,“上帝之城”是巴西的里约热内卢这座城市西南部的一片贫民窟。这部影片所聚焦的,正是这片贫民窟 60,70,80 三个年代中发生的一件件黑帮兴衰史。

上帝之城
上帝之城

2016 年的里约奥运会,有些运动员经历了抢劫,不仅财物被抢,还有各种证件和工作物品。可见巴西在里约奥运会期间也没有把治安问题解决好,让游客和运动员都蒙受了一定的损失。

里约奥运会_1
奥运代表团

在 2018 年 9 月 2 日,巴西国家博物馆发生火灾,近九成物品被烧毁。自 2013 年以来,巴西政府一直减少博物馆的预算。国家博物馆每年维护成本需要的 50 万巴西雷亚尔,但是获得的经费只有 5.4 万雷亚尔,博物馆出现了明显的欠缺维护迹象,如剥落的墙壁和裸露的电线。2018 年 6 月,巴西国家博物馆庆祝成立 200 周年,结果却在 2018 年 9 月份被烧毁。

巴西国家博物馆
巴西博物馆

在 2020 年的疫情面前,不少国家也有很多神操作,巴西自然也不例外,其感染人数也一直在持续增加,估计短期内并不能够解决这个问题。

新型冠状病毒20200503_巴西1新型冠状病毒20200503_巴西2

新型冠状病毒20200503_巴西3
巴西的疫情

在毕业答辩的当天,曾经有一个巴西博士后的岗位放在我的面前,我没有珍惜,等我失去的时候我并没有后悔,人生最开心的事情莫过于此。因为有无数的经验告诉我,选择比努力更重要。(未完待续)

描述统计学

描述统计学(descriptive statistics)又称为叙述统计,是统计学中用于描述和总结所观察到对象的基本统计信息的一门学科。描述统计的结果是对当前已知的数据进行更精确的描述和刻画,分析已知数据的集中性和离散型。描述统计学通过一些数理统计方法来反映数据的特点,并通过图表形式对所收集的数据进行必要的可视化,进一步综合概括和分析得出数据的客观规律。

与之相对应的是推断统计学(statistical inference),又称为推断统计,是统计学中研究如何用样本数据来推断总体特征的一门学科。推断统计学是在对样本数据描述的基础上,对总体的未知数据做出以概率形式来描述的推断。推断统计的结果通常是为了得到下一步的行动策略。

本篇文章将会集中讲解描述统计学中的一些常见变量及其含义。

数据类型:

总体population),又称为全体或者整体,是指由多个具有某种共同性质的事物的集合。

样本sample),是指全体中随机抽取的个体。通过对样本的调查,可以大概的了解总体的情况。从总体抽样的时候,需要抽取一定数量的样本,如果样本太少,则不足以反映总体的情况。

population_and_sample
总体和样本

案例 1:一亿张图片所组成的图片集可以称之为一个总体,我们希望分析在这个图片集中包含汽车的图片有多少张。一种方法是一亿张图片每一张都看一遍,从而可以获得包含汽车的图片数量,这样就可以得到一个精确的数字。但是这样的工作量可能相对较大。另外一种方法是从一亿张图片中随机选择十万张或者一百万张,也就是获得了一个样本集。在这个样本集中,把每一张都看一遍,获得这个样本集中包含汽车的图片数量,进一步估算出总体中包含汽车的图片数量。这样的话,工作量相对较少,但是得到的则是一个估算数字。

ImageNet
ImageNet

案例 2:我们想知道某个国家居民的平均身高和体重,一种方法是将所有的居民都测量一遍,但是这样做的效果就是耗费的人力成本巨大。而另外一种办法就是随机抽样,抽取一定数量的居民进行身高和体重的测量。即可估算出这个国家居民的平均身高和体重。

特征类型

在机器学习领域,特征是被观测对象的某种特性和度量。一般情况下,事物的特征很多,但是提取的特征应该尽量要服从于我们的目的,如果提取了很多无效的特征,那么在机器学习实战中的价值也不会很大。通常来说,特征包括两类,第一种是离散型特征,第二种是连续型特征

discrete_and_continuous
连续与离散

离散型特征指的是该特征的数据类型是离散的(discrete)。例如人的性别,有男女两个选择,可以用 0 或者 1,或者其他记号来表示。例如某个城市是否属于某个省份,如果是的话该特征就是 1,如果否的话该特征就是 0。例如某只股票近期属于上涨还是下跌,上涨用 1 表示,下降用 0 表示。某个人当前处于婴儿,少年,青年,成年,老年的哪个阶段,分别用记号 0,1,2,3,4,5 表示,这种也是离散型特征。离散型特征的数值之间的大小关系(实数域比较)有的时候是没有意义的。例如人的性别,男(0)女(1)两个值,在实数域中 0 < 1,但是却没有意义。

连续性特征指的是该特征的数据类型是连续的(continuous)。例如某个国家一年的天气温度,温度是可以连续变化的,可以从 30 摄氏度连续地下降到 20 摄氏度,也可以连续地上升到 35 摄氏度。某个人的身高,可以从 170 cm 逐渐长高到 175 cm,这也属于连续的特征。连续特征的数值之间有大小关系(实数域比较),比如通过气温特征的值,是可以反映这个地区的温度情况。通过某个人的身高则可以反映出这个人距离上一次测量有没有变化。

特征统计量

集中趋势的度量(measure of central tendency)

集中趋势(central tendency)指的是某种平均的指标,通过这种指标可以反映一组数据的整体分布情况。在这里,这组数据并不需要有先后关系,只要是一个集合即可。对于 n 个数据所组成的集合,可以表示为 X=\{x_{1},x_{2},\cdots,x_{n}\}.

算术平均数(Arithmetic Mean)

数据的总和除以数据的个数,也就是

A_{n}=\mu=\sum_{i=1}^{n}x_{i}/n.

几何平均数(Geometric Mean)

如果该集合里面的数字都是非负数,那么可以定义其几何平均数为

G_{n}=\sqrt[n]{x_{1}\cdots x_{n}}.

从高中的数学知识可以得到几何平均数不大于算术平均数。

调和平均数(Harmonic Mean)

如果该集合里面的数字都是正数,那么可以定义其调和平均数为

H_{n}=n/(x_{1}^{-1}+\cdots+x_{n}^{-1}).

平方平均数(Quadratic Mean)

平方平均数指的是

Q_{n}=\sqrt{\frac{\sum_{i=1}^{n}x_{i}^{2}}{n}}.

Theorem. 如果 x_{1},\cdots, x_{n} 都是正数,那么 H_{n}\leq G_{n}\leq A_{n}\leq Q_{n}. 也就是说,调和平均数\leq几何平均数\leq算术平均数\leq平方平均数。

proof. n=2 的情形证明如下图。其余可以用数学归纳法等多种方法证明。

二维均值不等式的几何证明
二维均值不等式的几何证明

方差(Variance),标准差(Standard Deviation)

方差和标准差反映了数据的波动情况,方差指的是 \sigma^{2}=\sum_{i=1}^{n}(x_{i}-\mu)^{2}/n. 而标准差则有两种情况,第一种是总体的样本差(population standard deviation),总体的标准差定义为方差正的平方根,记为 SD,

SD = \sigma = \sqrt{\frac{1}{n}(x_{i}-\overline{x})^{2}},

其中 \overline{x}=\sum_{i=1}^{n}x_{i}/n.

第二种是样本的标准差(sample standard deviation),此时集合 \{x_{1},\cdots,x_{n}\} 是从一个更大的总体抽样出来的部分数据。样本的标准差记为 s, s 的定义为

s = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\overline{x})^{2}},

其中 \overline{x}=\sum_{i=1}^{n}x_{i}/n.

众数(Mode)

众数指的是这个集合 \{x_{1},\cdots,x_{n}\} 中出现得最多的数字。

k 阶矩(k Moment),k 阶中心矩(k Central Moment)

k 阶矩指的是

m_{k} = \sum_{i=1}^{n}x_{i}^{k}/n,

它称为样本的 k 阶矩,它反映了样本总体的信息。显然,m_{1} 就是算术平均数。

k 阶中心矩指的是

\mu_{k} = \sum_{i=1}^{n}(x_{i}-\overline{x})^{k}/n,

它称为样本的 k 阶中心矩,它反映了样本距离均值的情况。显然,\mu_{2} 就是样本方差。

偏度(Skewness)

偏度定义为

\sum_{i=1}^{n}\frac{1}{n}\cdot\frac{(x_{i}-\overline{x})^{3}}{\sigma^{3}}=\frac{\mu_{3}}{\sigma^{3}}.

n 个样本的样本偏度(sample skewness)定义为 \mu_{3}/s^{3}, 其中 s 是样本的标准差,i.e s = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\overline{x})^{2}}.

而另外常见的一种样本偏度定义为 \frac{n^{2}}{(n-1)(n-2)}\cdot \frac{\mu_{3}}{s^{3}}. 而偏度的结果可以是正数,负数,或者零。分别被称为 Positive Skew(右侧的尾巴更长),  Negative Skew(左侧的尾巴更长) 和 Zero Skew。当均值等于中位数等于众数的时候,该概率分布是对称的。Median(中位数)相对于 Mean(均值)是更加接近 Mode(众数)的数字,因此根据 Median 和 Mean 的大小关系也能够大致判断 Skew(偏度)的趋势。

skewness_1
偏度的两种类型

skewness_2
中位数,众数,平均数,偏度

峰度(Kurtosis)

n 个样本的样本峰度(sample kurtosis)可以定义为:\frac{\mu_{4}}{\mu_{2}^{2}} - 3, 其中 \mu_{4} = \sum_{i=1}^{n}(x_{i}-\overline{x})^{4}/n, \mu_{2}=\sum_{i=1}^{n}(x_{i}-\overline{x})^{2}/n. 减去 3 的目的是为了让正态分布的峰度为零。

Theorem. 正态分布 4 阶距的值是 3。

Proof. 需要计算 \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{+\infty}x^{4}e^{-\frac{x^{2}}{2}}dx 的值。可以使用极坐标的方法来解决,首先通过坐标变换可以得到原式子等于 \frac{4}{\sqrt{\pi}}\int_{-\infty}^{+\infty}x^{4}e^{-x^{2}}dx. 其次,令 A=\int_{-\infty}^{+\infty}x^{4}e^{-x^{2}}dx, 可以得到

A^{2}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}x^{4}y^{4}e^{-x^{2}-y^{2}}dxdy

= \int_{0}^{2\pi}\cos^{4}(\theta)\sin^{4}(\theta)d\theta \cdot \int_{0}^{+\infty}r^{9}e^{-r^{2}}dr

= \frac{3\pi}{64}\cdot 12=\frac{9}{16}\pi.

进一步得到 A=\frac{3}{4}\sqrt{\pi}. 从而原式子等于 3。i.e. 正态分布 4 阶距的值是 3。

中位数(Median)

中位数指的是将集合中的数字从小到大排序之后得到的有序数列,中间的那个数字。如果的数列的长度是偶数,则取中间两个数的平均值。

median
中位数的计算案例

带权重的算术平均数(Weighted Arithmetic Mean)

对于一组数据 \{x_{1},x_{2},\cdots,x_{n}\}, 可以设置其一组正数权重 \{w_{1},\cdots,w_{n}\}, 然后得到其带权重的算术平均数为

\sum_{i=1}^{n}w_{i}x_{i}/\sum_{i=1}^{n}w_{i}.

截断平均数(Truncated Mean)

截断平均数是舍弃掉样本中最高和最低的一些样本之后再计算得到的平均值,并且最高和最低两端舍弃的样本数量一致。舍弃的样本数量可以是整体资料数量的占比,也可以是一个固定的数量。

发散度量(measure of dispersion)

四分位距(interquartile range,IQR)

四分位距(IQR),也被称为 midspread,middle 50%,H-spread,它等于 75th 百分位数与 25th 百分位数的差值,也就是

IQR = Q_{3}-Q_{1}.

其中,对于长度为 2n 或者 2n+1 的数列而言,Q_{1} 就是 n 个最小数的中位数,也就是 Q_{1} 在有序数列从小到大排序的 25% 位置。Q_{3} 就是 n 个最大数的中位数,也就是 Q_{3} 在有序数列从小到大排序的 75% 的位置。IQR 反映了数据的集中程度,IQR 越小,表示数据越集中于 median 附近;IQR 越大,表示数据越发散于两端。

IQR_1
正态分布的箱形图

用箱形图(boxplot)作异常检测的时候,上下界分别定义为 Q_{3}+1.5 \cdot IQR, Q_{1}-1.5 \cdot IQR.

IQR_2
四分位距的案例

在上述案例中,Q_{1} = 31, Q_{2}=87, Q_{3} = 119, 从而四分位距 IQR = Q_{3}-Q_{1}=88. 异常检测的上下界分别是 Q_{3}+1.5\cdot IQR = 251, Q_{1}-1.5\cdot IQR = -101.

四分位发散系数(quartile coefficient of dispersion)

四分位发散系数也是用于衡量数据集中程度的,对于不同的序列而言,IQR 并没有在一个尺度下进行衡量,无法通过直接对比两个序列的 IQR 来判断它们之间的发散程度(需要先对两个序列进行归一化才行)。于是,有学者提出了另外一种衡量方法,就是四分位发散系数,它的定义就是

(Q_{3}-Q_{1})/(Q_{3}+Q_{1}).

例如:X=\{2, 4, 6, 8, 10, 12, 14\}Y=\{1.8, 2, 2.1, 2.4, 2.6, 2.9, 3\} 两个集合。对于 X 而言,Q_{1}=4,Q_{2}=8,Q_{3}=12, 它的 IQR=Q_{3}-Q_{1}=8, 四分位发散系数为 (Q_{3}-Q_{1})/(Q_{3}+Q_{1})=0.5; 对于 Y 而言,Q_{1}=2,Q_{2}=2.4,Q_{3}=2.9, 它的 IQR=Q_{3}-Q_{1}=0.9,四分位发散系数为 (Q_{3}-Q_{1})/(Q_{3}+Q_{1})=0.1837. 因此集合 X 的四分位发散系数比 Y 的四分位发散系数要大,XY 更加发散。

范围(range)

在统计学中,对于集合 \{x_{1},\cdots,x_{n}\} 而言,它的最大值减去最小值的差值就是范围。i.e.

range = \max_{1\leq i\leq n}\{x_{1},\cdots,x_{n}\}-\min_{1\leq i\leq n}\{x_{1},\cdots,x_{n}\}.

该值越大,表示集合的最大值与最小值的差异越大,数据更加发散;该值越小,表示集合的最大值与最小值的差异越小,数据就更加集中。

平均绝对偏差(Mean Absolute Difference)

对于集合 X=\{x_{1},\cdots,x_{n}\} 而言,平均绝对偏差(Mean Absolute Difference)定义为:

MD(X)=\frac{\sum_{i=1}^{n}\sum_{j=1}^{n}|x_{i}-x_{j}|}{n(n-1)}.

相对平均绝对偏差(Relative Mean Absolute Difference)则定义为:

RMD(X) = \frac{\sum_{i=1}^{n}\sum_{j=1}^{n}|x_{i}-x_{j}|}{(n-1)\sum_{i=1}^{n}x_{i}}.

通过相对平均绝对偏差可以对比两个集合之间的偏差程度。

中位数绝对偏差(median absolute deviation)

中位数绝对偏差定义为 MAD=median(\{|x_{i}-\tilde{x}|,1\leq i\leq n\}), 其中 \tilde{x}=median(\{x_{1},\cdots,x_{n}\}), 可以看出数据的偏移程度。

变异系数(coefficient of variation)

变异系数指的是标准差除以均值,i.e.

cv=\frac{\sigma}{\mu},

它表示了集合数据相对于均值的波动程度。

例如:X=\{10,10,10\}, Y=\{9,10,11\}, Z=\{1, 5, 6, 8, 10, 40, 65, 88\}, 通过定义可以计算出它们的变异系数 cv(X)=0, cv(Y)=0.1, cv(Z)=32.9/27.9=1.18. 变异系数越大,表示集合的数据波动程度越大。变异系数越小,表示集合的数据波动程度越小。

参考资料

  1. 集中趋势:https://en.wikipedia.org/wiki/Central_tendency
  2. 离散程度:https://en.wikipedia.org/wiki/Statistical_dispersion
  3. 描述统计学:https://zh.wikipedia.org/wiki/%E6%8F%8F%E8%BF%B0%E7%BB%9F%E8%AE%A1%E5%AD%A6
  4. 数据分析的基础—统计学之描述性统计(一):https://zhuanlan.zhihu.com/p/33544707
  5. 数据分析的基础—统计学之描述性统计(二):https://zhuanlan.zhihu.com/p/34073898

 

在新加坡的这五年—学术篇(二)

本文写于毕业答辩五周年之际。对于每个博士生而言,毕业答辩都是一件非常重要的事情,这不仅关系着博士生能否顺利拿到学位,也会影响未来的职业生涯。

在博士答辩的时候,学生不仅需要向答辩委员会展示这几年在学校的研究成果,还需要得到答辩委员会的一致认可才能够拿到博士学位。每个学校对于博士生的毕业要求不一样,不同的学校有着不太一样的制度,但是整体流程却是大同小异的。下图是 NUS 数学系对于 Graduate Programme 的学生的一些基本要求。包括在 24 个月之内通过 Qualify Exam,学习 MA5198 这门课,完成英语课程的学习,CAP 达到 3.5 以上,最后就是写完博士毕业论文。

NUS_PHD_requirement
博士生的毕业要求

毕业论文作为 Step 6 就代表着这是博士生从学校毕业的最后一步了。当时为了记录自己搞科研写论文的时候,专门使用了 Google Calendar,然后把自己的工作时长记录下来。每周搞数学科研的时长平均是 20 个小时左右,毕竟进行创新性工作是比体力劳动累很多的。一天看书八小时没啥问题,但是一天思考数学难题八个小时就是因人而异了。

工作时长
2014 年的每周工作时长

从 NUS 提交论文的流程来看,其实博士生想提交一篇论文并不是一件非常容易的事情。先不说撰写毕业论文的路程之艰辛,就说说这提交论文的流程就足以花费很长时间。根据 NUS 的学术日历,博士生们需要在一些特定的时候提交论文才会比较“划算”。为什么用“划算”这个词语呢?因为 NUS 的博士生在前四年是不需要交学费的,但是在博士第五年开始延期的时候就需要缴纳一定的学费,而学费的多少完全取决于在博士生什么时候提交论文。如果在每个学期的前两周提交论文,那么这个学期是不需要交学费的。如果在 Recess Week 之前提交论文,那么这个学期只需要缴纳一半的学费。如果提交论文的时间过了 Recess Week,那么博士生就要缴纳本学期全部的学费。所以,对于想要交论文的博士生,通常都会在 Vacation 的期间尽量把论文全部写好,然后赶在开学的前两周提交论文,这样的话一来有充足的时间撰写论文,二来不用缴纳下一个学期的学费。

NUS学校日历
NUS 的学术日历

NUS 的博士生在前四年是免学费的,但是到了第五年的时候就要开始交学费了。而学费的涨幅也是十分惊人的,记得在 2010 年的时候一年的学费大约是 13000 SGD,而到了 2020 年的时候一年的学费已经涨到了 40000 SGD。虽然学费涨幅惊人,但是只要博士生能够按时毕业,就可以避免缴纳高额的学费。这可能也是督促博士生按时毕业的一个好方法。

NUS学费
NUS 的学费

言归正传,在进行答辩之前需要在学校和院系提交博士生的毕业论文。第一次提交论文初稿的时候需要提交四份打印稿,并且装订成册。方便答辩委员会的成员阅读和翻阅。当时打印论文的时候,是由大峰哥带路去 Queenstown 打印,价格比学校的 YIH 稍微便宜一点,时间也会相对快很多。

对于博士生的答辩,除了导师会在现场之外,也需要从院系里面选择一两位教授,还需要从外校选择一位比较精通该领域的学者,共同组成该学生的答辩委员会。答辩委员会不仅要在学生答辩的时候出席,还要对学生提交的博士论文进行审核,查看该学生的学术成果是否能够达到毕业的要求。如果答辩委员会在审核期间对学生的论文有所疑问的话,也可以通过邮件的方式来向院系的秘书和学生发邮件,要求学生提供更加详细的资料和证明方法。不过发邮件提问的时候答辩委员会的教授都是匿名的,学生不能知道是哪位审稿人所提出的问题。一般审稿的期限为 3 个月左右,一旦达到了这个期限,并且审稿没有问题的话,就可以让院系安排博士生的毕业答辩了。

毕业答辩的邮件通知_full
答辩邮件

2015 年 4 月 24 日,是笔者在新加坡国立大学(National University of Singapore) 的答辩日子。每次有博士生答辩的时候,数学系的行政人员们就会提前发送一封邮件给大家,通知大家系里面有人去答辩了,请感兴趣的老师和同学自行前往。一般情况下,答辩的时长是一个小时左右。除此本校的教授无需专程移动之外,答辩委员会的成员也需要从各个国家飞往当地进行毕业答辩。在答辩的时候,学生需要准备一份 PPT 来讲解之前几年在学校做的科研工作,还需要提前准备一些可能面临的挑战点以应对大家的提问。听讲座的人背景不一样,所提出的问题也有可能是五花八门的,所以做好充足的准备是非常有必要的。在答辩的前两天,有的导师也会将答辩委员会的教授们介绍给博士生认识,毕竟学术圈也是一个圈子,混个脸熟还是十分有必要的。不过学术圈的人通知消息的方式都比较特殊,记得当时导师通知开会和吃饭都是通过邮件的方式,和现在通过微信和电话的方式有明显差异。

毕业聚餐的地点
聚餐地点

在博士生进行答辩陈述结束之后,答辩委员会的成员会让博士生暂时离开教室一段时间,然后他们在教室里面填写必要的资料,决定博士生是否能够通过这次答辩。如果顺利通过的话,教授们会走出来通知学生已经通过了答辩。如果不幸没有通过的话,就只能让学生持续修改论文和再接再厉了。除了参加博士生的答辩之外,学术圈的教授们聚集到一个学校,总会开设一两个讲座或者进行必要的聚餐。这次自然也不例外,笔者还有幸在答辩的当天下午听了一个教授的讲座。到了吃饭时间,下午 5:00 左右,导师就把学生和教授喊在一起,去外面聚餐吃饭。不过当时吃饭的地点就是在学校附近的食阁,大家会点上不少下酒菜,然后点上很多啤酒(PS:新加坡的酒真的是贵),在食阁那里谈天说地。当时留在师门的人也不多了,大师兄和二师兄已经顺利毕业离开了新加坡,还剩下三师兄和我在一起搞科研和答辩。不过在我答辩完了之后,三师兄也顺利提交了论文,在 2015 年的后半年也顺利通过了博士答辩。

大师兄的毕业证
大师兄的毕业证

记得在 2015 年 4 月 13 日的时候,大清早起来帮大师兄去拿 University Hall 拿学位证。NUS 有固定的发放学位的时间,及时大师兄是 2014 年交的论文,拿到学位证和成绩单也需要等到次年的 4 月份。因此,算好交论文的时间也是一门有趣的事情。不过导师从国内过来的时候,也是把三位师兄带到新加坡,因此三位师兄的年纪略比我大一些。师兄们也是经历了国内的硕士教育和国外的博士教育最终拿到学位,可见拿到博士学位之路真的不好走。

NUS_YIH
NUS 的 YIH

答辩完了之后其实还需要向学校提交一些材料和流程,提交材料的地点就是 NUS 的 YIH。记得当时提交论文不仅需要在网站上提交论文的 PDF 文件,并且把论文刻在一个光盘内才行(PS:这年头用光盘的时候真的是不多了)。当年在南京买的电脑 Y530 还带着光驱,但是从来没有使用过,在 2008 年买的时候绝对没有想到这台电脑刻的唯一一张光盘就是自己的博士毕业论文。(未完待续)