描述统计学

描述统计学(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 年买的时候绝对没有想到这台电脑刻的唯一一张光盘就是自己的博士毕业论文。(未完待续)

一封来自南大化院的信

见信如晤!南大化院致用人单位和校友的一封信

尊敬的用人单位,亲爱的校友:

你们好!

首先,诚挚感谢各用人单位一直以来对我院就业工作的热心关注与大力支持,帮助我院学子在理想的工作岗位上服务社会,建设国家。感谢各位校友对母院发展的支持和对学弟学妹们的帮助和指导,你们的成就为他们规划自己的职业生涯树立了典范。
自1920年南京高等师范学校建立设置化学系以来,南京大学化学学科已走过百年历程。秉承“诚朴雄伟,励学敦行”的校训,以及“严谨、求实、创新、奉献”的优良传统,由化学学科发展而来的南京大学化学化工学院,已经成为蜚声海内外的人才培养和科学研究基地。2017年,我院化学、化学工程与技术两个学科双双入选国家“双一流”建设学科。百年砥砺,薪火相传,我院培养的一代代化院人在科学研究和技术服务业、教育、制造业、信息传输、软件和信息技术服务业、金融业等各行各业都做出了突出贡献,在中华民族复兴之路上留下了浓墨重彩的篇章!今天,学院师生正在配位化学、化学生物学、能源化学、先进光电材料、合成化学、材料化学、生命分析和分子成像、绿色化学以及计算化学等多个领域开展研究,以化学人独特的思维和方式认知、创造并改变着我们的世界。
当前,全国上下仍处在全力防控新型冠状肺炎疫情的关键时期,受疫情影响,今年本就因全国高校毕业生人数增长40万而紧张的就业形势更加严峻。因此,帮助我院129名本科毕业生,133名硕士毕业生和143名博士毕业生走上满意的工作岗位,是我们一直以来努力达成的目标。
为促进社会需求与人才供给精准对接,值此用人单位招聘与毕业生求职就业的关键时期,我院诚挚邀请各用人单位,为我院学子提供更多宝贵的就业岗位和发展平台若您有招贤纳士的计划,请您与我们联系,我们将第一时间将招聘信息传达给毕业生,根据需求帮助毕业生与贵单位搭建好线上选聘平台,并择优定向推荐,积极配合您完成好招聘工作。众人拾柴火焰高,希望各位校友伸出援手,充分发挥您的社会影响力,帮我们牵线搭桥,提供宝贵的就业信息。同时也欢迎各位校友为即将毕业的学弟学妹分享求职经验,提供线上指导,帮助他们树立求职信心,掌握求职技巧。
再次感谢各用人单位和校友的理解与支持,在这个特殊的春天,让我们凝心聚力,共同努力打赢疫情防控和求职就业的双战役!
附:南京大学化学化工学院2020届毕业生就业工作联络人
负责班级
联络人
办公电话
电子邮箱
本科
朱老师
025-89680289
chemjobnju@163.com
硕士研究生
王老师
025-89682319
博士研究生
闫老师
025-89682319

今天看到南京大学(Nanjing University)的官方公众号于近日发表了一封信,来自南大化院。其主要内容是让各位校友尽量提供各种资源,帮助目前的在校毕业生找到合适的就业岗位。在疫情严重和就业环境不甚理想的情况下,通过这封信,我们能够感受到母校对于学生们的关心,能够体会到母校对应届本科生,硕士生,博士生的负责与关怀。

NJU_Chem_1
NJU 化学化工学院
NJU_Chem_2
百年化院

当年笔者在南京大学就读的时候,就曾听闻 NJU 的化学系,物理系,地科系,天文系都是 NJU 的王牌院系,自然也有不少优秀的高中生选择这些方向进行攻读。笔者在校期间除了拿到学位,也得到了许多南大老师的帮助和教诲,在此表示感谢。在 2006 年,闵乃本院士课题组获得了国家自然科学一等奖,也是国家对 NJU 在自然科学领域的认可。

NJU_Award_1
国家自然科学一等奖

近日南大化院通过官媒所发出的信,一则是因为疫情影响,今年的就业压力确实大;二来某些专业确实不那么容易找工作。某些专业的学生如果只掌握本专业的技能,就会面临着毕业就失业的风险。要想走向满意的工作岗位,除了自己的努力之外,自然也是需要学校的大力支持的。

在国外留学的时候,就感受到一些院校更加强调学以致用。即使是化学,生物,物理等基础学科,在本科期间也会积极安排实习的机会给学生,让学生们有一定的就业实践,获得必要的社会经历。在新加坡国立大学(National University of Singapore),化学系的本科学生是有机会获得一些实习机会的。

NUS_FYI
2020 NUS E-Open House:最后一年的实习

除此之外,最后的毕业项目(Final Year Project)也是需要有一定的实践的。例如,可以与近些年比较火的机器学习(machine learning)和数据分析(data analytics)相结合,将学生培养成具备一定的化学数据分析经验方向的人才。

NUS_FYP
2020 NUS E-Open House:最后一年的项目

学生们在校期间肯定可以接触科研的内容,但是如果只接触科研的内容对学生而言是不公平的。最理想的情况是在校期间校方多让学生接触各行各业的职业,多接触到工业界的就业情况。无论是公司,研究所,还是其他行业的校友以及各行各业的人才都可以把已知的行业消息告诉学生,让学生们多了解,及早做职业规划,这也是对学生负责的一种方法。

不过,南大化学这个专业怎么出现了【博士生的人数 > 硕士生的人数 > 本科生的人数】的情况啊?笔者记得当年数学系本科生大约 160+,硕士生 30+,博士生可能也就 10+;在数学系不至于成为倒过来的情形啊。在外留学的时候,每个院系博士生的数量都是有限制的,数学系也就是 10+,一般不会超过 20。不知道是不是当时招生的时候过度招生了?

如果有机会的话,其实学校,研究所,工业界帮学生牵线搭桥是非常有必要的,毕竟 NJU 的生源质量整体来看还是非常不错的,有的学生真的只是缺少一个机会而已。在这种时候,如果事先在读书之前,就提前给学生和家长做好一定的职业辅导,是不是也是一种方法呢?下面几幅图来自 NUS 的 2020 E-Open House,化学系的老师在网络上给大家介绍了化学系学生的一些发展方向​,其实这样的内容对学生和家长而言可能更有价值和意义。​

NUS_Chem_Level_UP_1
职业发展:Chief Analytical Chemist
NUS_Chem_Level_UP_2
职业发展:Medicinal Chemist
NUS_Chem_Level_UP_3
职业发展:Energy Chemist

无论是 NJU 还是 NUS 的学生都是相对优秀的,有的时候给一个转行的机会就能够紧紧地把握住。如果实在是找不到本专业的就业机会,那就只能够找个机会努力转行了。其实,大学最重要的是培养正确的价值观,引导学生们做想做的事情,做喜欢做的事,而不是为了某个目的而把学生的其他路封死。如果一个人真心想做科研,那么他就不会被其他事情所干扰;如果一个人不是真心想做科研,那么他迟早也是要离开的,无论学校是否告诉他一条转行的道路。

Picture_of_Chem_2
离开的时刻

前几年写过一篇关于转行的文章,希望有所帮助吧。《转行数据挖掘和机器学习(六)》 。不过还是期待业界大佬能够提供就业岗位和发展平台,提供更多的机会给应届生。

2020 年的口罩

谁都没有想到 2020 年的开局竟然是这样,随着新型冠状病毒(COVID-19) 在各个国家的爆发,医疗防护用品成为了 2020 年的畅销品。对于各个国家而言,呼吸机,防护服,护目镜,医用口罩就是必备的物品;对于每个家庭甚至个人而言,口罩就成为了居家必备的防护用品。

早在 2020 年除夕前几天,国内就已经出现了武汉地区爆发疫情的消息,深圳有的药房已经排起了长龙,很多民众都在购买口罩。甚至有的药房已经把口罩卖空,直接在门口挂牌“暂无口罩”,说明当时整体已经出现了口罩短缺的情况。既然线下买不到,那就只能够转到线上去购买。笔者当时还想着买 N95 或者医用外科口罩,但是网上的货源也是远远不够的。最后实在没办法了,就想着买点其他口罩聊胜于无吧。于是直接在某电商平台下单了 50 个一次性医用口罩,下单后第三天货就到位。虽然 50 个口罩不足以保障一家人每天都能够外出,但是足以应对出门拿外卖和日常用品,也正是这 50 个口罩,保证了一家人在疫情期间的日常生活不受影响。

2020年初买的医用口罩
2020 年 1 月中旬买的口罩

国内疫情严重导致口罩短缺,国家开始呼吁大家尽量待在家里,避免出去进一步导致疫情的传播。正好笔者也是属于死宅类型,日常能不出去就不出去,能尽量待在家就尽量待在家。而且此时正值新春佳节之际,如果没有走亲访友的安排,待在家其实是最好的选择,毕竟辛辛苦苦地工作一年也会觉得疲惫,正好找个机会修整一下,以备来年的再次努力奋斗。

过年期间每家每户都在屯口罩,过完年之后就面临着复工的问题。虽然国家已经将春节假期延长,但是总有需要复工的一天。为了复工,想必各个企业也在积极地准备着这些必要的医护用品,否则复工之路将受影响。有的企业渠道比较广,能够弄到一些医护用品发放给员工。为了自身和身边同事的安全,大家在疫情期间上班就只能够戴口罩,虽然刚开始的时候也不太能够适应,但是工作了几天之后竟然也觉得能够接受。话说,普通上班族戴的也就是普通的医疗口罩,奋战在一线的医生和护士不仅需要戴口罩,还需要身着厚重的防护服,全身上下都被严严实实地包裹起来,甚至还要面临着被感染的风险。在这次疫情中,国内的医护人员真的做出了非常大的贡献。

众志成城我们必胜
战疫情

时至今日,国内的疫情已经基本稳定,每个省都在走向全面复工的道路,普通的医用口罩其实也不再短缺,无论是网上商店还是线下药店都能够买到口罩。但让人万万没想到的是国外疫情出现了井喷式的增长,从 Google 的疫情统计来看,不少国家的累计确诊人数已经远远超过中国,美国至今已经高达 50 万的确诊病例,甚至还有持续上涨的趋势。疫情刚开始的时候,国外的不少人还说戴口罩没有用,呼吁大家不用戴口罩。虽然笔者也没有直接证据证明戴口罩能够有效地防护,但是为了保险起见,如果买得到口罩,并且能够承受这个经济压力的话,戴口罩其实对个人也没有什么大碍。虽然刚开始的时候不适应,但是戴多了其实也就那么回事。不过戴着口罩思考问题,写代码确实挺累的,但是为了保障身体健康也只能够戴着,别无选择。

Google疫情统计_1
全球疫情统计
Google疫情统计_2
确诊人数排序

从这张表格来看,其实香港的情况还好,看上去也属于能够控制的范围。由于笔者当年在新加坡生活五年,有不少朋友在新加坡工作和学习,因此也比较关心新加坡的疫情。新加坡的疫情被稳定地控制了很久,但是近几周也出现了感染人数增长的趋势,确诊人数已经多达 2000+,并且存在社区传播的可能性。

Google疫情统计_3
新加坡疫情地图

于是,新加坡政府在 2020 年 4 月份正式宣布了 Stay at home(居家隔离)政策,呼吁民众尽量待在家里,避免外出。从 2020 年 4 月 7 日开始至 2020 年 5 月 4 日,民众都要遵守居家隔离政策,非特殊情况,尽量不要外出;如果一定要外出,则需要戴口罩(mask);食物全部需要打包带走,不能堂食;在排队的时候要保持一定的安全距离。

新加坡疫情防护_1
Stay at home
新加坡疫情防护_2
居家隔离的细节

其实在疫情刚刚爆发的时候(2020 年 1 月底),新加坡根据实际情况呼吁大家暂时无需戴口罩,因为口罩毕竟是医疗用品,需要优先保障一线的医务人员使用。如果很多民众都戴口罩,那么口罩就会出现不够的情况,并且当时疫情在新加坡属于可以控制的范围。在当时做出这个呼吁也属于合理的范围。

新加坡疫情防护_3

新加坡疫情防护_4
联合早报的报道

但是,随着疫情的发展,已经超出了很多人的预期。中国花了很多成本控制住了疫情,但是疫情却在国外爆发了,无论是意大利,西班牙,法国,到现在的美国,都出现了病人井喷的状况。很多国家均已不能独善其身,只能够加入全面抗疫的战斗中。新加坡政府也推出了居家隔离的政策,虽然不一定比中国更加严格,但也确实能够起到一定的效果。

旅游业是新加坡的支柱产业之一,在疫情期间,沙滩全面封闭,不准居民游玩。虽然影响了收入,但实属无奈之举,毕竟控制疫情才是近期最重要的事情。

新加坡疫情防护_5
封闭沙滩

新加坡很多人都不在家做饭,社区周边的食阁就是主要的吃饭场所。在此特殊期间,居民不能够在食阁里面吃饭,必须进行外带,而且餐饮场所的员工必须要戴口罩才能够营业。违者将罚款高达 5000 新币,或吊销餐饮执照。

新加坡疫情防护_6

新加坡疫情防护_7
食阁的规定

除了餐饮行业,人们在日常出行的时候也被要求戴口罩,例如乘坐公交车的乘客就必须戴口罩。

新加坡疫情防护_8
乘客需戴口罩

从新加坡的政策也可以看出,时至 2020 年的 4 月份,新加坡的疫情防控也到了必须要控制的程度。为什么前后的政策会出现如此明显的变化呢?我们可以来看一下新加坡这几个月的疫情发展状况。

在 2020 年的 1 月份,新加坡只有零星的几个案例,即使到了 3 月中期,每天的案例数量也不会超过 50 个,而且绝大多数都可以追踪。但是到了 4 月份,有几天的案例数都超过了 150,总数也超过了 2200 +,而且有一些案例还不太容易进行流行病学的追踪。

新加坡疫情统计_1新加坡疫情统计_2新加坡疫情统计_3

新加坡疫情统计_4
新加坡的疫情变化:2020 年 1 月 – 2020 年 4 月

从联合早报的感染人群来看,除了有外来的输入案例之外,近期还有不少在新加坡的客工宿舍爆发了疫情。

新加坡疫情防护_9

新加坡疫情防护_10
客工宿舍的疫情

新加坡政府控制疫情虽然暂时还没有那么严格,但是也算是下了决心。有一句来自其他地方的笑话,Singapore is a fine city。fine 除了大家都知道的意思之外,另外一层含义就是罚金或者罚款。那为了控制疫情,新加坡政府会给违反规定的民众开出相应的罚单也属于合理的范围。刚开始的时候愿意给警告信,但从 4 月 12 日起就直接开罚单了,每次 300 新币(约人民币 1500 元)。

新加坡疫情防护_11

新加坡疫情防护_12
新加坡的罚单

在防控疫情的不同阶段,不同的国家确实有着完全不同的应对策略,无论是国内的封城,还是其他国家的防控疫情手段,都是为了尽快消灭疫情。而消灭疫情虽然有很多办法,但每个人进行合理范围内的自我保护则是一个非常有效的措施。从 2020 年的 1 月份到 4 月份,所有人都见证了国内疫情爆发,控制,逐渐消失的阶段。从新加坡这几个月的政策也可以看出,从一开始的呼吁民众不需要戴口罩到现在的强制民众戴口罩,说明口罩在疫情防控方面还是具有一点防护和隔离作用的,至少也能够有效地阻止飞沫的传播。因此,能够戴口罩还是戴上为佳,保护自己也保护了别人。最后,还是希望全球的疫情能够早早过去,让大家都过上正常健康的生活。

参考资料:

  1. 新加坡疫情网站:https://co.vid19.sg/singapore/#
  2. 联合早报:https://www.zaobao.com/
  3. 新加坡政府官网:https://www.gov.sg/

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

每次提到数学这个词,大家能够想到的就是初等代数,平面几何,组合运算,微积分,线性代数,概率论等方向。但在整个数学领域(Earth of Math)上,还有很多更有意思的领域和研究方向,包括数论,几何,拓扑,分形几何,分析,概率统计,博弈论,代数等诸多方向,每一个方向都有很多优秀的数学家在从事相关研究。

EarthofMath
Earth of Mathematics

当年在数学系的时候,所研究的方向是分形几何(Fractal Geometry)和复动力系统(Complex Dynamics),位于 Earth of Math 的左侧,称之为分形湖泊(Fractal Lakes)。所谓分形,其实是一个粗糙或者零碎的集合形状,可以分成多个部分,且每个部分放大之后与整体有某种相似性,即具有自相似性的性质。而动力系统则是基于某种固定的规则,描述一个空间内的所有点随时间的变化情况,例如钟摆的晃动,水的流动,湖泊里面鱼类的数量。备注:动力系统并不是指汽车的动力系统和发动机引擎,这两者毫无关系。

而复动力系统则是动力系统中的一个分支,研究的是有理函数的迭代性质。所谓函数的迭代,指的是针对有理函数 f(z),考察其定义域的点 z\in \hat{\mathbb{C}}n 次复合,得到 f^{(n)}(z)=f\circ\cdots\circ f(z),进一步可以研究 \lim_{n\rightarrow +\infty}f^{(n)}(z) 的极限。

针对不同的定义域,函数的迭代有着完全不同的研究方法。当时的研究方向是复动力系统(Complex Dynamical Systems)。复动力系统理论的研究始于 1920 年,当时是由数学家 Fatou 和 Julia 研究的,因此复动力系统中的两个重要的集合就是以 Fatou 和 Julia 来命名的,分别称之为 Fatou set 和 Julia Set。随着计算机技术的演进,在上世纪八十年代这些集合可以通过计算机进行可视化,分形几何和复动力系统理论开始蓬勃发展起来。在与双曲几何、分形几何、现代分析学和混沌学等学科发展相互促进的同时,围绕双曲猜想以及 Mandelbrot 集合的研究工作,成为当今复动力系统的研究热点。

举个例子,函数 f(z) = z^{2}+0.7885 e^{ia}a\in[0,2\pi])的 Julia 集合的动图如下:

JuliaSet_1
Julia 集合

当然,科研的时候可不是做一点可视化就算完成任务了,还是需要按部就班的学习各种数学知识和技能。

之前在学校研究动力系统的时候,收集过一些书籍,在此列举给大家,希望对初学者有一定的帮助。One Dimensional Real and Complex Dynamics实与复动力系统)需要学习的资料如下:

基础书籍:

复分析基础:本科生课程。学习数学知识自然需要循序渐进,除了必要的数学分析,高等代数之外,分析学则是动力系统所必备的知识之一。既然是复动力系统,那肯定就要集中于研究复分析,因此本科的复分析则是复动力系统的必修课之一。

(1) Complex Analysis, 3rd Edition, Lars V. Ahlfors

(2) Complex Analysis, Elias M. Stein

进阶复分析:研究生课程

到了研究生阶段,其实也不足以直接上手搞科研,需要进一步地学习黎曼曲面,拟共形映射等专业书籍,才能够为复动力系统的学习打下基础。

(1) Lectures on Riemann Surfaces (GTM 81), Otto Forster

(2) Lectures on Quasiconformal Mappings, Lars V. Ahlfors

实分析基础:本科生课程

研究动力系统,实分析也是其基础知识之一,无论是通过学习 Stein 还是 Rudin 的教材,都是为了进一步地了解基础知识。

(1) Real Analysis and Complex Analysis, Rudin

(2) Real Analysis, Elias M. Stein

专业书籍:

实动力系统:

(1) One Dimensional Dynamics, Welington de Melo & Sebastian VanStrien

这本书难度较大,上手的时候不建议直接看这本书。

OneDimensionalDynamics
One-Dimensional Dynamics

(2) Mathematical Tools for One-Dimensional Dynamics (Cambridge Studies in

Advanced Mathematics), Edson de Faria / Welington de Melo

MathematicalToolsforOneDimensionalDynamics
Mathematical Tools for One-Dimensional Dynamics

复动力系统:

(3) Dynamics in One Complex Variable, John Milnor;Milnor 的教材总是写的清晰明确,容易上手,推荐初学者可以读这本书。

DynamicsinOneComplexVariable
Dynamics in One Complex Variable

(4) Complex Dynamics, Lennart Carleson;Carleson 的教材偏向于分析学,读起来其实也有点难度,还是读 Milnor 的教材相对容易。

ComplexDynamics
Complex Dynamics

(5) Complex Dynamics and Renormalization, Curtis T. McMullen;McMullen 的书适合当做查阅,也不太适合从头到尾读下去。

ComplexDynamicsandRenormalization
Complex Dynamics and Renormalization

(6) Renormalization and 3-Manifolds Which Fiber over the Circle, Curtis T. McMullen

Renormalizationand3Manifolds
Renormalization and 3-Manifolds Which Fiber over the Circle

(7) Iteration of rational functions (GTM 132), Alan F. Beardon

遍历论:

(8) An Introduction to Ergodic Theory (GTM 79), Walters Peter

学术会议

除了日常的科研之外,博士生时不时地可以去参加一下学术会议,不仅可以去参加本方向的学术会议,也可以去参加其它方向的学术会议,只要有一份邀请函即可。

如果是在 NUS 的 IMS(Institute for Mathematical Sciences)举办的学术会议,一般来说只要是在校的研究生都是可以参加的。记得当时参加的第一个学术会议是关于 PDE 的,标题叫做 Hyperbolic Conservation Laws and Kinetic Equations:Theory, Computation, and Applications(1 November – 19 December 2010)。笔者去听这个系列讲座是因为在 2010 年选择了一门 PDE 的研究生课程,而这个讲座则是作为课程的一部分。

IMSWorkshopGroupPhoto2012_6
IMS 的偏微分方程学术会议

笔者参与的另外一个学术会议则是关于动力系统的,标题叫做 Workshop on Non-uniformly Hyperbolic and Neural One-dimensional Dynamics(23 – 27 April 2012),主要是关于非一致双曲动力系统方向的研讨会。笔者记得当时所修的课程应该只有概率论(Probability II)一门课,因此上课的任务不算很重。参会的时间恰好是学期快结束的时候,科研的任务也不算特别繁重。因此,积极参与各种学术会议也算是科研的其中一部分,一来通过参会可以了解当前的学术研究情况,二来可以认识学术界的各种人士,也算是扩大学术交流圈子的好机会。

IMSWorkshopGroupPhoto2012_2
IMS 的动力系统学术会议

既然是学术会议,那自然就有各种各样的 Presentations,学术会议的第一天通常是需要有 IMS 的领导来致辞的,表示学术会议正式开始。每天的学术会议都需要有个 chair 来组织,一天的学术会议基本上是从早到晚,大约从早上 9:30 开始,到下午 4:40 结束。而每个学者汇报时间大约是 50 mins 左右。

IMSWorkshopGroupPhoto2012_3
第一天的研讨会安排

这次的学术会议是关于动力系统方向的,那师兄们自然是需要上台做报告的。当时上场的师兄包括大师兄和二师兄,至于三师兄和我则暂时没有成果可以汇报。两位师兄在 IMS 的报告厅里面做了十分精彩的成果展示,会议之后也有不少同行来与师兄们讨论问题。

IMSWorkshopGroupPhoto2012_4
同门汇报工作

一般来说,每次研讨会的开始和结束都需要有一个仪式,除了 IMS 的领导致辞表示会议开始之外,在茶歇时间(Coffee Break)期间是可以四处走动的,并且在第一次茶歇的时候,全体参会人员都会在 IMS 附近拍照留念,预祝本次研讨会成功举办。

IMSWorkshopGroupPhoto2012_5
Group Photo

论文

读到博士自然需要研究一下相应的课题,例如下面这种就是数学系博士生所研究的课题。​

Question. 是否存在 \ell\geq 4 的偶数和复数 c\in\mathbb{C} 使得 f(z)=z^{\ell}+c 的 Julia 集合 J(f) 是正测度?

针对这个课题,数学系的博士生需要翻阅历史上的相关书籍和论文,阅读其相关论文才能够得到前沿技术和进展。当年花时间阅读的论文主要是几篇 Annals 上面的文章,参考资料也是这几篇文章,不过每一篇文章至少都是 40 页左右,基本上看一篇文章需要花几个月的时间。

1. Combinatorics, geometry and attractors of quasi-quadratic maps,Pages 345-404 from Volume 140 (1994), Issue 2 by Mikhail Lyubich

Paper_1

2. Wild Cantor attractors exist,Pages 97-130 from Volume 143 (1996), Issue 1 by Hendrik Bruin, Gerhard Keller, Tomasz Nowicki, Sebastian van Strien

Paper_2

3. Quadratic Julia sets with positive area,Pages 673-746 from Volume 176 (2012), Issue 2 by Xavier Buff, Arnaud Chéritat

Paper_3

4. Polynomial maps with a Julia set of positive measure,Nowicki, Tomasz, and Sebastian van Strien,arXiv preprint math/9402215(1994).

Paper_4

备注:第 4 篇文章 Polynomial maps with a Julia set of positive measure 里面有错误,通过其证明是无法得到最终结论的,因此是否存在正测度的 Julia 集合一直是未知的。直到 2012 年的第 3 篇文章出来,才算证明了二次多项式存在正测度的 Julia 集合。但是对于高次多项式,是否存在正测度的 Julia 集合则是完全未知的。

在拿到论文和课题之后,那就开始需要研究了。草稿纸也算了一张又一张,论文也打印了一份又一份,科研之路哪有一帆风顺的,基本上都是历经曲折,才能够达到毕业的彼岸。毕业的时候写了一篇文章《科研这条路》,以此来纪念读博五年的生涯。

PlanandReality
理想与现实

参考资料:

  1. 科研这条路
  2. 维基百科:Julia 集合

 

一个数学家的辩白

《一个数学家的辩白》是数学大师 Godfrey Harold Hardy 在 1940 年左右的作品,可以称之为 Hardy 本人的自传和内心独白。Hardy 通过自己多年从事数学科研的经验,对数学,文学,哲学,美学等诸多学科的理解,将其写成了一本小册子。给其余的数学工作者,数学爱好者,以及不了解数学的人一个了解数学家内心的机会。

Hardy的照片
G.H.Hardy 的照片

G.H.Hardy(1877 年 2 月 7 日 – 1947 年 12 月 1 日)是一代数论大师,英国数学家,先后在牛津大学(Oxford)和剑桥大学(Cambridge)担任数学教授,与另一位英国数学家 Littlewood 共同研究数学,其研究领域包括解析数论,三角级数,不等式等诸多方向。对数论领域和分析学领域的贡献巨大,是二十世纪英国分析学派的代表人物之一。

Hardy的数学家族谱
G.H.Hardy 的数学家族谱

在卢昌海《黎曼猜想漫谈》这本书里面,提到了 G.H.Hardy 的一则小故事。当年,Hardy 在一次从丹麦回英国的途中,碰巧遇到暴风肆虐。他很担心小船会沉没,于是在上船前给朋友寄了一张明信片,上面写道:“我证明了黎曼猜想。” 如果哈代不幸遇难,因死无对证,后世将无法否认(当然也没法确认)他真的证明了黎曼猜想。然而,上帝不想让他有这样大的荣耀,所以没有让这条船沉没。

在《一个数学家的辩白》这本书中,Hardy 基于个人经历,向大家展示了一位数学家对数学这门学科的一些看法和观点。下面将会摘录其中的一些语句。

假如真的能把我的雕像塑在伦敦纪念碑上的话,我是希望这座碑高耸入云,以至人们见不到雕像呢,还是希望纪念碑矮得可以使人们对雕像一目了然呢?我会选择前一种,而斯诺博士可能会选择后一种。

如果一个数学家发现自己在写关于数学的东西,他会感到很忧伤的。因为数学家的工作是做实事,比如证明新定理,使数学有所发展,而不是谈论自己或别的数学家干了些什么。政治家蔑视时事评论家;画家蔑视艺术评论家;生理学家、物理学家或数学家一般都有类似的感觉。做事者对评论者的蔑视是最深刻的,总的来看也是最合理的。解释、评论、鉴赏是次等工作。

认为“谦卑”的人做不出优秀的工作。比方说,在任何一个学科里,教授的首要职责之一就是对自己这一学科的重要性以及自己本人在这一学科的重要性进行一点夸大。假如一个人总在问自己:“我所做的事是值得做的吗?”以及“我做这个合适吗?”这都会使自己永远无能而且也让别人泄气。这种人该把眼睛闭上一会儿,更多地考虑自己的学科和自己本人的情况,而不是更多地考虑学科与自己所应得的报酬。这不太困难,因为更加困难的是依靠紧闭眼睛来使自己的学科与自己本人不受他人所嘲笑。

我之所以做我的事,因为这事是,而且是惟一的一件我完全可以做好的事。我是个律师,或者是一个股票经纪人,或者是一个职业板球手,这都是因为我对这一特别的工作有些真正的才能。我做律师,是因为我伶牙俐齿,而且对法律之微妙感兴趣;我做股票经纪人,是因为我对股市行情的判断迅速而准确;我做职业板球手,是因为我挥拍非同一般地好。有人说,我做个诗人或数学家也许更好,但不幸的是,我并没有才能做这样的工作。

我并不认为大多数人能够做出上述那样的辩解,因为多数人什么工作也做不好。可是只要这种辩解说得振振有词,它就很难反驳,事实上只有少数人能进行这样的辩解:也许只有 5% 或 10% 的人可做得不错。而只有极少数人可做得真正好。而能做好两件事的人只有寥寥无几的了。假如一个人有真正的才能,他就应该乐于牺牲几乎所有的一切,以充分发挥自己的才能。

我会设想我是在为那些现在和过去都满怀雄心壮志的人写这本书的。一个人的首要任务,进一步说,一个年轻人的首要任务是能显示雄心壮志。雄心是一种可以合情合理地以许多形式表现出的一种宏大高尚的志向。阿提拉(Attila)和拿破仑的野心中就有某种高尚的志向,但最高尚的雄心壮志是在自己身后留下某种永存的价值。

  在这平坦的沙滩上,
  海洋与大地间,
  我该建起或写些什么,
  来阻止夜幕的降临?
  告诉我神秘的字符,
  去喝退那汹涌的波涛,
  告诉我时间的城堡,
  去规划那更久的白昼。

有很多高尚的动机驱使人们进行某项研究。在这些动机中,最为重要的有三种。 首先(舍此必一事无成)是理智的好奇心,也就是对了解真理的渴望。其次是对自己专业工作的自豪感,只有工作才能使自己得以满足的那种渴望。任何自尊的数学家,当他的工作与其才能不相称时,耻辱感会压倒一切。最后一个就是雄心壮志,期望得到名声、地位甚至随之而来的权力和金钱。

假如理智的好奇心、对专业工作的自豪感和雄心壮志是在研究工作中占支配地位的动机的话,那么,毫无疑问,没有哪个人比一个数学家有更好的机会来满足这些条件了。数学家的研究学科是所有学科中最令人好奇的。没有哪门学科中的真理会像数学那样奇异。数学是最精细与最富有魅力的技艺,而且数学研究提供了展示真正的专业技能的机会。最后我还要说的是,正如历史所充分证明的那样,不论数学内在的本质价值何在,其成就是一切成就中最持久的。

数学家,就像画家、诗人一样,都是模式的创制者。要说数学家的模式比画家、诗人的模式更长久,那是因为数学家的模式由思想组成,而画家以形状和色彩创制模式,诗人则以言语和文字造型。一幅画或许蕴含着某种”意境”,但通常是平凡而无关紧要的;比较之下,诗意要重要得多,不过,像豪斯曼坚持认为的那样,人们习以为常地夸大了诗意的重要性。他说:“我难以确信存在诗意之类的东西⋯⋯诗歌并不在于表述了什么,而在于怎样表述。”

 倾江海之水,洗不净帝王身上的膏香御气。

一个有意义的数学概念,一条严肃的数学定理从下述意义上被认为是“普遍的”。数学概念应该是许多数学构造的要素,应能应用于许多不同种定理的证明。

一个有意义的定理必须具备的第二个特性就是“深刻性”。其概念也不易定义,它与“难度”有关,深刻的思想往往难以掌握,但二者也并不完全一样。毕氏定理及推广所蕴含的概念有一定的深度,但现代数学家绝不会认为它难懂。相反,一个定理可能极为肤浅,但却难以证明–如丢番图(Diophantus)的有关求方程整数解的定理。

纯数学和应用数学的这些差异对它们本身很重要,但与我们关于数学“实用性”的讨论毫无关系。我曾谈到过费马和其他一些伟大的数学家的“真正的”数学,具有永恒美学价值的数学,如最好的希腊数学。它们之所以永恒,是因为其中的精华就像文学中的精英部分,在几千年后还能引起千万人强烈的满足感。

对于我的一生,或者说任何一个与我类似的数学家的情况是:我所做的工作扩充了知识,并且帮助他人在这座知识的大厦上添砖加瓦;而这些添加部分与伟大的数学家们的创新,或任何其他大大小小艺术家们的作品的价值的不同仅仅在于程度而不在于种类。这些数学家和艺术家都在死后留下了某种纪念物。

伽罗瓦 21 岁去世,阿贝尔 27 岁去世,拉曼纽扬 33 岁去世,黎曼 40 岁去世。也有些人确实是在较晚时取得伟大成就的,高斯就是在 55 岁时才发表了他的微分几何学的重要论文(但在此十年前他就已经形成了他的基本思想)。我还不知道有哪一个重要的数学进展是由一个年过半百的人创始的。假如一个年长的人对数学不感兴趣而放弃了它,这种损失不论对数学本身还是他本人来说,都不十分严重。

阅读《一个数学家的辩白》这本书,可以通过字里行间看到作为一个数学家的 Hardy 对数学的热爱,对自己正值花甲之年而无法做出更好的科研而流露出一种淡淡的忧伤。

其实,二十世纪三十年代末以后,Hardy 的学术活动就开始逐渐减少。1939 年第二次世界大战爆发,让 Hardy 感到更加苦闷。四十年代以后,Hardy 很少参与学术活动。1947 年 12 月 1 日,Hardy 在剑桥去世,享年 70 岁。留给大家的除了数学上的各种定理,书籍之外,还留下了这一本小册子,《一个数学家的自白》。

参考书籍:

  1. 《一个数学家的辩白》;
  2. 《黎曼猜想漫谈》。

一代数学大师 Rota 的经验与忠告

意大利裔的美籍数学家 Gian-Carlo Rota(1932 年 4 月 27 日 – 1999 年 4 月 18 日)是一位杰出的组合学家。他曾是研究泛函分析(Functional Analysis)出身,后来由于个人兴趣的转移,成为了一位研究组合数学(Combinatorial Mathematics)的学者。Rota 的职业生涯大部分都在麻省理工学院(MIT)度过,曾担任 MIT 的数学教授与哲学教授。

Rota's Photo 1970
1970 年的 Rota

从数学家族谱(Mathematics Genealogy Project)上面可以看到:Gian-Carlo Rota 的导师是 Jacob T. Schwartz,Rota 于 1956 年在耶鲁大学获得数学博士学位,其博士论文的题目是 Extension Theory of Differential Operators。

Rota的数学家族谱_1
Rota 的数学族谱

在 1997 年,Rota 发表了两篇关于人生经验和忠告的文章,分别是 “Ten Lessons I wish I Had Been Taught” 和 “Ten Lessons for the Survival of a Mathematics Department“。下面就来逐一分享这两篇文章中的一些观点。

Ten Lessons I wish I Had Been Taught

Springer Link Ten Lessons I wish I Had Been Taught
Ten Lessons I wish I Had Been Taught

讲座(Lecturing)

每次讲座或者分享的时候都有几个需要注意的事情。

(a)每次讲座都应该只有一个重点。(Every lecture should make only one main point.)

Every lecture should state one main point and repeat it over and over, like a theme with variations. An audience is like a herd of cows, moving slowly in the direction they are being driven towards. If we make one point, we have a good chance that the audience will take the right direction; if we make several points, then the cows will scatter all over the field. The audience will lose interest and everyone will go back to the thoughts they interrupted in order to come to our lecture.

(b)不要超时。(Never run overtime.)

Running overtime is the one unforgivable error a lecturer can make. After fifty minutes (one micro-century as von Neumann used to say) everybody’s attention will turn elsewhere even if we are trying to prove the Riemann hypothesis. One minute overtime can destroy the best of lectures.

(c)提及听众的成果。(Relate to your audience.)

As you enter the lecture hall, try to spot someone in the audience with whose work you have some familiarity. Quickly rearrange your presentation so as to manage to mention some of that person’s work. In this way, you will guarantee that at least one person will follow with rapt attention, and you will make a friend to boot.

Everyone in the audience has come to listen to your lecture with the secret hope of hearing their work mentioned.

(d)给听众一些值得回忆的东西。(Give them something to take home.)

Most of the time they admit that they have forgotten the subject of the course and all the mathematics I thought I had taught them. However, they will gladly recall some joke, some anecdote, some quirk, some side remark, or some mistake I made.

板书技巧(Blackboard Technique)

(a)开讲前保持黑板干净(Make sure the blackboard is spotless.)

By starting with a spotless blackboard you will subtly convey the impression that the lecture they are about to hear is equally spotless.

(b)从黑板的左上角开始书写(Start writing on the top left-hand corner.

What we write on the blackboard should correspond to what we want an attentive listener to take down in his notebook. It is preferable to write slowly and in a large handwriting, with no abbreviations.

When slides are used instead of the blackboard, the speaker should spend some time explaining each slide, preferably by adding sentences that are inessential, repetitive, or superfluous, so as to allow any member of the audience time to copy our slide. We all fall prey to the illusion that a listener will find the time to read the copy of the slides we hand them after the lecture. This is wishful thinking.

多次公布同样的结果(Publish the Same Result Several Times)

The mathematical community is split into small groups, each one with its own customs, notation, and terminology. It may soon be indispensable to present the same result in several versions, each one accessible to a specific group; the price one might have to pay otherwise is to have our work rediscovered by someone who uses a different language and notation and who will rightly claim it as his own.

说明性的工作反而更有可能被记得(You Are More Likely to Be Remembered by Your Expository Work)

When we think of Hilbert, we think of a few of his great theorems, like his basis theorem. But Hilbert’s name is more often remembered for his work in number theory, his Zahlbericht, his book Foundations of Geometry, and for his text on integral equations.

每个数学家只有少数的招数(Every Mathematician Has Only a Few Tricks)

You admire Erdös’s contributions to mathematics as much as I do, and I felt annoyed when the older mathematician flatly and definitively stated that all of Erdös’s work could be “reduced” to a few tricks which Erdös repeatedly relied on in his proofs. What the number theorist did not realize is that other mathematicians, even the very best, also rely on a few tricks which they use over and over. But on reading the proofs of Hilbert’s striking and deep theorems in invariant theory, it was surprising to verify that Hilbert’s proofs relied on the same few tricks. Even Hilbert had only a few tricks!

别害怕犯错(Do Not Worry about Your Mistakes)

There are two kinds of mistakes. There are fatal mistakes that destroy a theory, but there are also contingent ones, which are useful in testing the stability of a theory.

使用费曼的方法(Use the Feynman Method)

You have to keep a dozen of your favorite problems constantly present in your mind, although by and large they will lay in a dormant state. Every time you hear or read a new trick or a new result, test it against each of your twelve problems to see whether it helps. Every once in a while there will be a hit, and people will say, “How did he do it? He must be a genius!”

不要吝啬你的赞美(Give Lavish Acknowledgments)

I have always felt miffed after reading a paper in which I felt I was not being given proper credit, and it is safe to conjecture that the same happens to everyone else.

写好摘要(Write Informative Introductions)

If we wish our paper to be read, we had better provide our prospective readers with strong motivation to do so. A lengthy introduction, summarizing the history of the subject, giving everybody his due, and perhaps enticingly outlining the content of the paper in a discursive manner, will go some of the way towards getting us a couple of readers.

为老年做好心理准备(Be Prepared for Old Age)

You must realize that after reaching a certain age you are no longer viewed as a person. You become an institution, and you are treated the way institutions are treated. You are expected to behave like a piece of period furniture, an architectural landmark, or an incunabulum.

 

Ten Lessons for the Survival of a Mathematics Department

Springer Link Ten Lessons for the Survival of a Mathematics Department
Ten Lessons for the Survival of a Mathematics Department

不要在其他系讲自己系同事的坏话(Never wash your dirty linen in public)

Departments of a university are like sovereign states: there is no such thing as charity towards one another.

别越级打报告(Never go above the head of your department)

Your letter will be viewed as evidence of disunity in the rank and file of mathematicians. Human nature being what it is, such a dean or provost is likely to remember an unsolicited letter at budget time, and not very kindly at that.

不要进行领域评价(Never Compare Fields)

You are not alone in believing that your own field is better and more promising than those of your colleagues. We all believe the same about our own fields. But our beliefs cancel each other out. Better keep your mouth shut rather than make yourself obnoxious. And remember, when talking to outsiders, have nothing but praise for your colleagues in all fields, even for those in combinatorics. All public shows of disunity are ultimately harmful to the well-being of mathematics.

别看不起别人使用的数学(Remember that the grocery bill is a piece of mathematics too)

The grocery bill, a computer program, and class field theory are three instances of mathematics. Your opinion that some instances may be better than others is most effectively verbalized when you are asked to vote on a tenure decision. At other times, a careless statement of relative values is more likely to turn potential friends of mathematics into enemies of our field. Believe me, we are going to need all the friends we can get.

善待擅长教学的老师(Do not look down on good teachers)

Mathematics is the greatest undertaking of mankind. All mathematicians know this. Yet many people do not share this view. Consequently, mathematics is not as self-supporting a profession in our society as the exercise of poetry was in medieval Ireland. Most of our income will have to come from teaching, and the more students we teach, the more of our friends we can appoint to our department. Those few colleagues who are successful at teaching undergraduate courses should earn our thanks as well as our respect. It is counterproductive to turn up our noses at those who bring home the dough.

学会推销自己的数学成果(Write expository papers)

When I was in graduate school, one of my teachers told me, “When you write a research paper, you are afraid that your result might already be known; but when you write an expository paper, you discover that nothing is known.”

It is not enough for you (or anyone) to have a good product to sell; you must package it right and advertise it properly. Otherwise you will go out of business.

When an engineer knocks at your door with a mathematical question, you should not try to get rid of him or her as quickly as possible.

不要把提问者拒之门外(Do not show your questioners to the door)

What the engineer wants is to be treated with respect and consideration, like the human being he is, and most of all to be listened to with rapt attention. If you do this, he will be likely to hit upon a clever new idea as he explains the problem to you, and you will get some of the credit.

Listening to engineers and other scientists is our duty. You may even learn some interesting new mathematics while doing so.

联合阵线(View the mathematical community as a United Front)

Grade school teachers, high school teachers, administrators and lobbyists are as much mathematicians as you or Hilbert. It is not up to us to make invidious distinctions. They contribute to the well-being of mathematics as much as or more than you or other mathematicians. They are right in feeling left out by snobbish research mathematicians who do not know on which side their bread is buttered. It is our best interest, as well as the interest of justice, to treat all who deal with mathematics in whatever way as equals. By being united we will increase the probability of our survival.

把科学从不可靠中拯救出来(Attack Flakiness)

Flakiness is nowadays creeping into the sciences like a virus through a computer, and it may be the present threat to our civilization. Mathematics can save the world from the invasion of the flakes by unmasking them and by contributing some hard thinking. You and I know that mathematics is not and will never be flaky, by definition.

This is the biggest chance we have had in a long while to make a lasting contribution to the well-being of Science. Let us not botch it as we did with the few other chances we have had in the past.

善待所有人(Learn when to withdraw)

Let me confess to you something I have told very few others (after all, this message will not get around much): I have written some of the papers I like the most while hiding in a closet. When the going gets rough, we have recourse to a way of salvation that is not available to ordinary mortals: we have that Mighty Fortress that is our Mathematics. This is what makes us mathematicians into very special people. The danger is envy from the rest of the world.

When you meet someone who does not know how to differentiate and integrate, be kind, gentle, understanding. Remember, there are lots of people like that out there, and if we are not careful, they will do away with us, as has happened many times before in history to other Very Special People.

参考资料:

  1. Rota, Gian-Carlo. “Ten lessons I wish I had been taught.” Indiscrete thoughts. Birkhäuser, Boston, MA, 1997. 195-203.
  2. Rota, Gian-Carlo. “Ten Lessons for the Survival of a Mathematics Department.” Indiscrete Thoughts. Birkhäuser, Boston, MA, 1997. 204-208.

聊一聊登革热

近几个月,世界各地都爆发了新型冠状病毒(COVID-19),该病毒的传染性和致死率已经引起了许多国家的高度关注。其实,除了新型冠状病毒之外,在一些热带国家和地区,还有许多传染病值得大家注意防范,登革热就是人们需要关注的传染病之一。

登革热的英文名为 dengue fever,是一种由登革热病毒引起的传染病。其潜伏期的范围是 3 – 14 天(平均为 4 – 7 天),患者发病后会有发烧,头痛,关节痛,皮疹等诸多症状,一般情况下患者会在 2 – 7 天内痊愈。对于少数患者可能会出现病情加重的情况,甚至导致生命危险。登革热的种类分 1 – 4 型(DENV1-4),因此对于每个人来说,一生中最多获得四次登革热(但是个人觉得如果得了四次很可能也没法医治了)。对于年长者和体质虚弱的人,第一次获得登革热的时候将会比较严重,尤其需要注意防范登革热。

moh_宣传材料_2
登革热常见症状

登革热作为热带地区的常见疾病之一,其传播途径却是相对有限的,比起新型冠状病毒可以人传人,登革热的传播途径其实只有蚊子。蚊子需要从登革热的感染者那里取血,然后经过 8 – 12 天的时间具备感染力,并且在其生命周期内都具有传染性。当一个健康的人被具有传染性的蚊子叮咬之后,就会在潜伏期之后(长达 3 – 14 天)发病,并且有一定比例的感染者不会有症状。经科学研究证明,登革热并不会直接人传人,因此与患者接触并不会传播疾病。传播登革热的蚊子主要是黑斑蚊(Aedes mosquitoes),又称伊蚊,斑蚊,其中的白线斑蚊和埃及斑蚊就是登革熱的传播媒介。

蚊子_2
黑斑蚊

要想阻断登革热的传播,从其传播媒介来看主要方法就是灭蚊。而灭蚊的方式可以使用蚊香,灭蚊液,防蚊的方法可以使用蚊帐等工具。同时每家每户都要保证家里的清洁卫生,例如时刻注意花瓶和水槽里面的积水,避免给蚊虫带来良好的生存繁殖环境。​

 

moh_宣传材料_1

moh_宣传材料_3
防范登革热的措施

在新加坡的一些社区,随处可见 DENGUE 这样的宣传标语提醒人们注意预防登革热的传播。只有达到了足够的宣传力度,才能够时刻提醒人们的注意。

社区宣传标语_1
社区宣传标语

从 National Environment Agency(NEA)的报告数据中可以看出,在新加坡 2020 年 3 月份每天登革热的病例数大约是 28 – 64 人不等,每周大约有 300 – 400 人感染登革热。​

nea_dengue_cases_1
从 MOH 的报告中统计得出

相对于历年的登革热染病数据,2019 – 2020 年的登革热病例呈现增长的趋势,每周大约都有 300 – 400 人染病,相对于 2017 – 2018 年每周不到 100 人染病有了明显的上升。

nea_dengue_cases_2
​登革热病例历年同比图

新加坡面积不大,于是政府把相应社区的染病人数做了一个统计,让社区的人们注意安全,并且及时灭蚊。警告等级分三层:有十个以上案例就标记为红色,有十个以下案例就是黄色,没有案例就是绿色。

nea_dengue_cases_3
危险等级划分

例如:Jurong West Street 91 的人数就较多,危险等级较高;Hougang Ave 8 的人数较少,危险等级较低。

nea_dengue_cases_4

nea_dengue_cases_5
部分案例

不管是新型冠状病毒,还是热带地区常见的疾病,大家都要提高自我保护意识,做好防蚊等有效的措施。如果出现了身体不适,应该及早就医。

新加坡首次出现两起新冠病毒死亡病例!

就在今天(2020 年 3 月 21 日),新加坡首次出现两起由于新冠病毒(COVID-19)引起的死亡病例。

moh_1
MOH 的官网消息

从 MOH(Ministry of Health)的官网上可以看到,今天已经有两位感染新冠病毒(Coronavirus Disease 2019,简称为 COVID-19)的病人在新加坡离世。

第一名病人是一位 75 岁的女性新加坡公民,于 2020 年 2 月 23 日送入 NCID,并且当天确诊感染了 COVID-19。

第二名病人是一位 64 岁的男性印度尼西亚公民,于 2020 年 3 月 13 日送入 NCID,并且于 2020 年 3 月 14 日确诊感染了 COVID-19。

NCID_1
NCID

从新加坡政府的官网上可以看到:截止时间至 2020 年 3 月 21 日 12 点,现存确诊为 252 例(238 例稳定,14 例严重), 死亡 2 例,治愈 131 例。

gov_2
新加坡新冠病毒疫情实时播报

疾病爆发相应等级为橙色(orange)

gov_3
疾病爆发相应等级划分

而新加坡政府也在其主页上呼吁大家注意卫生:

  1. 勤洗手,多用肥皂;
  2. 每天测量两次体温;
  3. 咳嗽或者打喷嚏的时候用纸巾遮住口鼻;
  4. 及时处理垃圾和食物,保持桌面整洁;
  5. 注意室内通风,保持厕所干净。

一旦发现自己生病,请带上口罩去医院,并且保证后续在家隔离。​

gov_1
常见安全防护措施

而近三天,新加坡也有不少新增的病例。2020 年 3 月 20 日有 40 个病例,其中 30 位有欧洲,北美,亚洲的旅游史,7 位联系上了以前的病例,3 位没有找到传染病联系。

gov_4
新加坡近期病例

除此之外,从丁香医生的小程序可以看出,亚洲很多国家的疫情其实不容乐观。

丁香医生_亚洲_1
丁香医生

最后,无论在国内还是国外,大家都要注意安全。抗击疫情,人人有责。

口号_1

FluxRank: 如何快速地进行机器故障定位

在运维领域,服务侧的异常会由多方面的原因造成,有的时候是因为网络的抖动,有的时候是因为机器的故障,有的时候甚至是因为人为的变更。本篇博客会介绍一种机器异常定位的方法,论文是来自于清华 Netman 实验室的《FluxRank:A Widely-Deployable Framework to Automatically Localizting Root Cause Machines for Software Service Failure Mitigation》。本篇论文主要介绍了如何从服务的故障定位到局部异常的机器,也就是说在发现服务故障的同时,进一步推断出是由哪些机器出现问题而导致的。

通常来说,在服务异常(例如服务的耗时长,失败数上涨)的时候,需要运维人员通过历史上的经验迅速定位到是哪个业务,哪个模块,甚至哪台服务器出现了故障。而人工定位的速度总是会出现瓶颈的,无论对模块的判断,还是机器的判断,都依赖于人工所积累的经验。而每个人的经验却各不相同,并且经验的传承也需要一定的时间成本。那么如何基于人工运维的经验来构建模型,进一步地提升异常定位的速度就是智能运维的关键之处之一。

FluxRank_fig_1
从告警到故障恢复

对于一条业务指标(时间序列)而言,大多数情况下是处于正常的状态(normal)。但是如果出现了错误的变更,发布了错误的程序,或者服务器突然出现了故障,都会导致业务指标出现变化,就从正常(normal)变成异常(abnormal)。这个时候就会出现一个故障的开始时间,也就是 failure start time T_{f},这个时间戳是运维领域非常重要的时间戳,它由异常检测(anomaly detection)产生,无论在告警收敛(alarm convergence)还是根因分析(root cause analysis)都非常依赖这个时间戳。而另外一个时间戳虽然没有故障开始时间那么重要,但是也有着其实用价值,那就是缓和开始时间(mitigation start time),它表示故障虽然还没有恢复,但是出于稍微平稳的走势,并没有持续恶化。在出现了故障之后,通常都会发送相应的告警给运维人员,那么在发送告警的时候,如果将异常定位的结果随之带出,则会大大减少运维人员排障的时间。在故障缓和的时间内,运维人员通常需要进行必要的操作来排查故障,例如切换流量(switch Traffic),回滚版本(Rollback Version),重启实例(Restart Instances),下线机器等操作。除此之外,为了定位问题(Root Cause Analysis),运维人员需要分析源码(Code Analysis),查看日志(Log Analysis)等一系列操作。如果能够将这一系列操作融入相应的机器学习模块中,将会节省运维人员大量的排障时间。

贝叶斯网络

通常来说,故障定位也称为根因分析或者根源分析(Root Cause Analysis),都是为了排查产生这次故障的原因。在机器学习领域,为了进行因果分析(Causal Analysis),则需要使用相应的模型来进行建模。其中较为经典的统计分析方法则是贝叶斯分析法,其中的贝叶斯网络(Bayesian Network)则是经典模型之一。下面来看一个简单的例子。

假设降雨(Rain)的概率是 0.2,不降雨的概率是 0.8;而洒水器(Sprinkler)是否开启会受到降雨的影响,其条件概率与下图所示。而降雨或者洒水器都会导致草湿润(Grass Wet),其概率分布如下图所示。那么可以问如下问题:

  1. 如果草已经湿润,求降雨的概率是多少?
  2. 如果草已经湿润,求没有降雨且洒水器开启的概率是多少?
BayesianNetwork_2
贝叶斯网络的经典案例

而这一类的问题可以通过贝叶斯公式来进行解答。从表格来看:

从 Rain 的表格可得:P(R=T)=0.2, P(R=F)=0.8

从 Rain 和 Sprinkler 的表格可得:P(S=T|R=F)=0.4, P(S=F|R=F)=0.6P(S=T|R=T)=0.01, P(S=F|R=T)=0.99

从 Grass Wet 和 Sprinkler,Rain 的表格可得:P(W=T|S=F, R=F)=0.0, P(W=F|S=F,R=F)=1.0P(W=T|S=F,R=T)=0.8, P(W=F|S=F,R=T)=0.2P(W=T|S=T,R=F)=0.9, P(W=F|S=T,R=F)=0.1P(W=T|S=T,R=T)=0.99, P(W=F|S=T,R=T)=0.01.

针对问题 1,需要计算条件概率 P(R=T|W=T)。从 Bayes 公式可以得到:P(R=T|W=T) = P(R=T,W=T)/P(W=T)。分别计算分子分母即可:

P(R=T,W=T)=P(R=T,S=T,W=T)+P(R=T,S=F,W=T)

= P(W=T|R=T,S=T)P(S=T|R=T)P(R=T) + P(W=T|R=T,S=F)P(S=F|R=T)P(R=T)

= 0.99*0.01*0.2+0.8*0.99*0.2=0.16038

P(W=T)=P(W=T,S=T,R=T)+P(W=T,S=F,R=T)+P(W=T,S=T,R=F)+P(W=T,S=F,R=F)

=P(W=T|S=T,R=T)P(S=T|R=T)P(R=T) + P(W=T|S=F,R=T)P(S=F|R=T)P(R=T) + P(W=T|S=T,R=F)P(S=T|R=F)P(R=F)+P(W=T|S=F,R=F)P(S=F|R=F)P(R=F)

= 0.99*0.01*0.2+0.8*0.99*0.2+0.9*0.4*0.8+0.0*0.6*0.8=0.44838,

那么如果草已经湿润,求降雨的概率是 P(R=T|W=T)=P(R=T,W=T)/P(W=T)=0.16038/0.44838=0.3577.

另外一个题目可以用类似的方法进行求解,在此不再赘述。

虽然贝叶斯算法能够计算出条件概率,例如本次故障是由哪些原因导致的,但是这个需要长期收集数据,需要对历史数据进行积累,才能通过人工或者统计的方法得到以上表格的条件概率。但是在实际的环境中是较难获取这些数据的,需要大数据平台的支持,因此需要探索其他的解决方案。

FluxRank

在本论文中,为了克服贝叶斯网络模型中的一些问题,针对子机异常定位的场景,设计了一套技术方案,作者们称之为 FluxRank。

FluxRank_fig_2
FluxRank 的整体框架

FluxRank 这一模块的触发需要服务指标(Service KPI)的异常,因此需要对服务指标(Service KPI)进行异常检测。这里的服务指标通常指的是业务指标,包括某块 APP 的在线人数,某个接口的成功率,某个视频网站的卡顿数等指标。当服务指标出现了异常的时候,就启动 FluxRank 模块进行异常机器定位。

如果按照人工处理的流程来看,分成几个步骤:

  1. 异常检测部分:通过设定阈值或者某个简单的规则来进行异常检测,包括服务的 KPI(Service KPI)和机器的 KPI(machine KPIs);
  2. 手工检查异常的时间段,并且查看在异常的时间段内发生了什么情况;
  3. 运维人员根据自身的业务经验来对机器的故障程度做人工排序;
  4. 运维人员根据自身的业务经验来对故障进行处理,并且人工给出处理方案。

那么 FluxRank 所面临的挑战就有以下几点:

  1. 如何衡量海量 KPIs 的变化程度?在这里不仅有服务的 KPIs,还有机器的 KPIs。而机器的 KPIs 包括内存,硬盘,IO,CPU等诸多固定的指标,那么如何对这些海量的 KPI 曲线进行变化程度的衡量,为后续的指标排序做准备就成为了一个难点;
  2. 如何对 KPIs 进行异常性或者重要性的聚类,让运维人员能够一眼看出每个聚簇的差异或者异常程度?
  3. 如何对 KPIs 聚类的结果进行排序?

为了解决以上的问题,FluxRank 的框架有以下几个贡献点:

  1. 基于 Kenel Density Estimation 用于衡量海量 KPIs 在某一个时间段的变化程度和异常程度;
  2. 基于上一步生成的异常程度,对诸多机器所形成的特征使用距离公式或者相似度公式,然后使用 DBSCAN 聚类算法来对机器进行聚类;
  3. 在排序部分,对上一步的机器聚类结果进行排序;

Change Quantification

首先,来看一下 Change Quantification 是怎么样做出来的。这里的 Change Quantification 使用与衡量机器 KPIs 的变化程度,称之为 change degree。Change degree 可以用于 CPU,内存,IO 等诸多机器指标。为了达到衡量变化程度,需要一个非常重要的信息,那就是变化的开始时间,change start time,也就是说在哪个时刻时间序列开始出现了变化。于是在 Change Quantification 部分,就分成两部分:(1)用 absolute derivative 或者 CUSUM 算法获得变化开始时间(change start time);(2)用 Kernel Density Estimation(KDE)来计算变化程度(change degree)。

FluxRank_fig_1
重要的时间戳

正如上图所示,针对服务 KPIs(ervice KPIs),存在两个关键的时间点,那就是失败开始时间(Failure Start Time)T_{f} 和缓和开始时间(Mitigation Start Time)T_{m}。在失败开始时间 T_{f} 之前,可能有的机器已经出现了故障,因此变化开始时间(Change Start Time)T_{c} 小于或者等于 T_{f}。通常情况下,一个或者多个机器故障会在半小时(30 mins)甚至更短的时间内引发服务故障,因此,只需要假设 w_{1}=30 即可。关键时间点的排序为 T_{f}-w_{1}<T_{c}\leq T_{f}<T_{m}

对于服务 KPIs 的异常检测,FluxRank 中提到了两种方法:分别是 absolute derivative 和 CUSUM 方法。

  1. absolute derivative 方法:个人理解就是对时间序列进行一阶差分操作,然后对一阶差分来做时间序列异常检测,例如 3-sigma 等方法,一旦有明显的变化,就说明当前的时间点出现了突增或者突降;与该方法比较类似的一种方法是:MAD(Median Absolute Deviation)。对于一条时间序列 X=[x_{1},\cdots,x_{n}] 而言,MAD 定义为 MAD = median_{1\leq i\leq n}(|x_{i}-median(X)|),而每个点的异常程度可以定义为:s_{i}=(x_{i}-median(X))/MAD = (x_{i}-median(X))/median_{1\leq i\leq n}(|x_{i}-median(X)|).s_{i} 较大或者较小的时候,表示上涨或者下降的异常程度。通过设置相应的阈值,同样可以获得时间序列的异常开始时间。
  2. CUSUM 算法也是用于时间序列异常检测的。对于一条时间序列 X=[x_{1},x_{2},\cdots,x_{n}],可以预估它的目标值(target value)\mu_{0},通常可以用均值来估计,也需要计算出这条时间序列的标准差 \sigma。通常设定 \mu_{1}=\mu_{0}+\delta\sigmaK=\delta\sigma/2=|\mu_{1}-\mu_{0}|/2。而 Tabular CUSUM 指的是迭代公式 C_{i}^{+}=\max[0,x_{i}-(\mu_{0}+K)+C_{i-1}^{+}]C_{i}^{-}=\max[0,(\mu_{0}-K)-x_{i}+C_{i-1}^{-}],初始值是 C_{0}^{+}=C_{0}^{-}=0。当累计偏差 C_{i}^{+} 或者 C_{i}^{-} 大于 H=5\sigma 的时候,表示 x_{i} 出现了异常,也就是 out of control。通过这个值,可以获得时间序列开始异常的时间。

从论文的描述来看,作者是使用 absolute derivative 来做异常检测的,并且定位其异常开始时间的准确率较高。

Change Degree

其次,我们来看一下变化程度(Change Degree)是怎么计算出来的,通过之前的计算,我们已经可以获得一些关键的时间戳,例如 T_{f}, T_{c}, T_{m} 等时间戳。根据变化开始时间(change start time)T_{c},同样需要设置一个窗口值 w_{2},例如 60 分钟(1 小时)。可以从两个时间段获取数据,正常时间段 [T_{c}-w_{2},T_{c}),异常时间段 [T_{c},T_{m}],分别获取到数据 \{x_{i}\}\{x_{j}\},前者是在变化开始时间之前的数据点,后者是在变化开始之后的数据点。于是,作者们通过概率值来计算变化程度 P(\{x_{j}\}|\{x_{i}\}),意思就是计算一个条件概率,在观察到 \{x_{i}\} 之后,得到 \{x_{j}\} 的概率值。

为了计算以上概率值,需要简化模型,因此这里需要假设 \{x_{j}\} 是独立同分布(iid)的,于是 P(\{x_{j}\}|\{x_{i}\})=\prod_{j=1}^{\ell}P(x_{j}|\{x_{i}\}),在这里 \ell 表示集合 \{x_{j}\} 的元素个数。 为了分别得到其上涨和下降到概率,则需要计算:

P_{o}(\{x_{j}\}|\{x_{i}\}) = \prod_{j=1}^{\ell}P(X\geq x_{j}|\{x_{i}\}),

P_{u}(\{x_{j}\}|\{x_{i}\}) = \prod_{j=1}^{\ell}P(X\leq x_{j}|\{x_{i}\}),

其中 P_{o}(\{x_{j}\}|\{x_{i}\}) 表示上涨的程度,P_{u}(\{x_{j}\}|\{x_{i}\}) 表示下降的程度。如果不想处理连乘的话,则需要处理连加:

o=-\frac{1}{\ell}\sum_{j=1}^{\ell}\ln P(X\geq x_{j}|\{x_{i}\}),

u =-\frac{1}{\ell}\sum_{j=1}^{\ell}\ln P(X\leq x_{j}|\{x_{i}\}).

在这里,作者们使用了三种概率分布函数,分别是 Beta 分布(Beta distribution),泊松分布(Poisson distribution),高斯分布(Gaussian distribution)。

Beta 分布的概率密度函数(probabilisty density function)是 f(x;\alpha,\beta) = x^{\alpha-1}(1-x)^{\beta-1}/B(\alpha,\beta),其中 B(\alpha,\beta)=\Gamma(\alpha)\Gamma(\beta)/\Gamma(\alpha+\beta)。在机器 KPIs 中,CPU 等指标可以用 Beta 分布;

泊松分布的概率密度函数是 f(x;\lambda)=\lambda^{x}e^{-\lambda}/x!,在机器 KPIs 中,SYS_OOM 用于衡量超出内存的频率,可以用泊松分布来做。

高斯分布的概率密度函数 f(x;\mu,\sigma) = e^{-(x-\mu)^{2}/2\sigma^{2}}/(\sqrt{2\pi}\sigma)

根据论文中的陈述,机器 KPIs 分别适用于以下概率分布:

FluxRank_table_1
机器指标遵循的概率分布

通过以上公式,可以计算出每一个机器的每一个指标的 ou 两个值。

Digest Distillation

再来看一下 Digest Distillation 部分,在此部分需要对机器的 KPIs 进行聚类操作;那么就需要构造特征向量和距离函数,再加上聚类算法即可获得结果。

每一个机器的特征向量是由之前计算的 Change Degree 形成的,由于每台机器的 KPIs 都是一样的,因此可以对它们的 KPIs 的 change degree 进行排列。假设每台机器有 k 个 KPIs,那么这台机器所对应的向量就是 (o_{0},u_{0},\cdots,o_{k},u_{k})

在描述向量的相似性方面,可以使用相关性的系数,包括 Pearson 系数,Kendall tau 系数,Spearman 系数。对于两条时间序列而言,X=[x_{1},\cdots,x_{n}]Y=[y_{1},\cdots,y_{n}]

Pearson 系数指的是:\rho_{X,Y}=\sum_{i=1}^{n}(x_{i}-\overline{x})\cdot(y_{i}-\overline{y})/\sqrt{\sum_{i=1}^{n}(x_{i}-\overline{x})^{2}\cdot\sum_{i=1}^{n}(y_{i}-\overline{y})^{2}}, 其中 \overline{x}=\sum_{i=1}^{n}x_{i}/n\overline{y}=\sum_{i=1}^{n}y_{i}/n

Kendall tau 系数指的是:如果 (x_{i}>x_{j}y_{i}>y_{j}) 或者 (x_{i}<x_{j}y_{i}<y_{j}),那么称之为 concordant;如果 (x_{i}<x_{j}y_{i}>y_{j}) 或者 (x_{i}>x_{j}y_{i}<y_{j}),称之为 discordant;如果 x_{i}=x_{j} 或者 y_{i}=y_{j},则既不是 concordant,也不是 discordant。那么 Kendall tau 定义为 [\text{(number of concordant pairs)}-\text{(number of disordant paris)}] / [n(n-1)/2]

Spearman 系数指的是:通过原始序列变成秩次变量(rank)(从大到小降序排列即可),x_{i} 将会对应到 x_{i}',后者表示 x_{i} 在从大到小排序之后的序列 \{x_{i}\}_{1\leq i\leq n} 的位置,称之为秩次(rank),得到序列 X'=[x_{1}',\cdots,x_{n}']。对原始序列 Y=[y_{1},\cdots,y_{n}] 作同样的操作,得到 Y'=[y_{1}',\cdots,y_{n}']。一个相同的值在一列数据中必须有相同的秩次,那么在计算中采用的秩次就是数值在按从大到小排列时所在位置的平均值。如果没有相同的 rank,那么使用公式 r_{s} = 1-6\sum_{i=1}^{n}d_{i}^{2}/(n(n^{2}-1)) 进行计算,其中 d_{i}=x_{i}'-y_{i}';如果存在相同的秩次,则对 X'=[x_{1}',\cdots,x_{n}']Y'=[y_{1}',\cdots,y_{n}'] 来做 Pearson 系数即可,也就是 \rho_{X',Y'}

FluxRank_table_3
相似性函数的对比

通过作者们的实验,说明 Pearson 系数在这个数据集上效果最佳。在聚类算法的场景下,作者们同样对比了 KMeans,Gaussian Mixture,Hierarchical Clustering,DBSCAN 算法的效果,最后使用了 DBSCAN 的聚类算法。每一个聚类的结果,作者称之为一个 digest,也就是下图的 M1,M2 等聚类结果。

FluxRank_fig_6
聚类结果

Digest Ranking

最后,就是对聚类结果的排序工作。通过观察会发现:

  1. 变化开始时间(change start time)T_{c} 会在失败发生时间 T_{f} 之前;
  2. 不同的故障机器 KPIs 的 change start time 是非常接近的;
  3. 故障机器的一些 KPIs 的 change degree 是非常大的;
  4. 故障机器的占比是与故障原因相关的,故障机器越多说明故障越大;

在同一个模块下,如果出现故障机器的占比较大,那么故障将集中于这个模块下,可以通过 ratio 这个指标进行排序工作。

实验数据

在 FluxRank 论文中,作者们收集了 70 个真实的案例,然后根据实验效果获得了结果。

FluxRank_table_2
部分真实案例

在标记的时候,除了标记异常机器(Root Cause Machines,简称为 RCM)之外,也需要标记相关的指标(Relevant KPI,简称为 RK)。Root Cause Digest(简称为 RCD)把包括两个部分,不仅包括 RCM 的一个聚类结果,还包括聚类结果中的 top-five KPIs。

通过对 FluxRank 进行实验,可以得到如下实验数据:

FluxRank_table_4
FluxRank 的实验结果

其中 Recall@K 指的是:Recall@K=\text{\# of cases whose top-k digests contain RCDs}/ \text{\# of all cases}, 或者 Recall@K=\text{\# of cases whose top-k machines contain RCMs}/\text{\# of all cases}.

参考资料

  1. FluxRank: A Widely-Deployable Framework to Automatically Localizing Root Cause Machines for Software Service Failure Mitigation,Ping Liu,Yu Chen,Xiaohui Nie,Jing Zhu,Shenglin Zhang,Kaixin Sui,Ming Zhang,Dan Pei,ISSRE 2019, Berlin, Germany, Oct 28-31, 2019。
  2. Introduction to Statistical Quality Control,6th edition,Douglas C.Montgomery。
  3. Bayesian Network:https://en.wikipedia.org/wiki/Bayesian_network

 

在新加坡的这五年—生活篇(五)

在新加坡,民众运动健身的氛围极其浓厚。无论在周末的公园里,在工作日傍晚的的林荫跑道上,还是在各个区域都拥有的游泳池里,随处可见运动的人群。而在校园里,很多学生都会选择在操场上踢球,玩飞盘,搞活动。NUS 的足球场(Sports Field)就在数学系的旁边(S17),对于学生们而言,下楼的时候除了可以在售货机购买罐装饮料之外,还可以在操场旁边放空自己的大脑。当时的售货机在 NUS 是随处可见的,不过在移动支付尚未流行的年代,只能用硬币去购买各种饮料。整体来看,在校园里生活的话大家还是用现金居多,毕竟跟外出购物的大额消费不一样,日常买饭和坐公交车出行其实都可以用现金解决问题。结果硬币越来越多,钱包越来越重,但是钱却越来越少。于是笔者为了把零散的硬币(一角,两角,五角)这种换成一元硬币,除了去门店找人兑换之外,随处可见的售货机就是一个还不错的选择。

NUSSportField_1
NUS 的操场
SwimmingPool_5
新加坡游泳池遍布全岛
SwimmingPool_6
NUS 附近的游泳池

通过 Google 地图来搜索 Swimming Pool,会发现游泳池遍布新加坡全岛。除了最著名的滨海湾金沙酒店的无边际游泳池外,政府还在全岛修建了无数的游泳池供市民健身娱乐。当把地图聚焦于新加坡国立大学,将会看到其实 NUS 就有好几处游泳池,除了 UTown 的屋顶游泳池与金沙酒店的极其相似之外,在大学运动中心(University Sports Centre)也有一个标准的游泳池。而且这个游泳池是在 2015 年才开始重建,2018 年左右才开始对外开放。相比于原先的游泳池,其基础设施已经大大的改善了。

SwimmingPool_1
2015年前的游泳池
SwimmingPool_7
2018年翻新之后的泳池

作为一个博士生,除了从办公室步行去学校的游泳池之外,更多的时候则是在周末的时候从宿舍坐车去游泳池。而 NUS 其实有着自己的穿梭巴士(Shuttle Bus),同时每一辆穿梭巴士其实都有着自己的路线。而周末从 PGP 坐车去游泳池的时候,可以选择早上 9:00 出发,坐上 A1 的即可在十分钟内到达游泳池。不过周末的巴士半小时才会行驶一趟,一旦错过了,只能够等待半小时以上了,否则就只能够步行前往目的地。

NUSShuttleBus_1
NUS 的穿梭巴士
NUSShuttleBus_2
NUS 的巴士线路图

从 NUS 的巴士线路图上可以看出,NUS 不仅无缝对接着地铁站 Kent Ridge MRT,也对接着 Kent Ridge Bus Terminal。因此无论从学校的任何地方,都可以通过 Shuttle Bus 到达地铁站或者公交站。不过话说回来,笔者刚到 NUS 的时候是 2010 年,当时还没有开通 Kent Ridge MRT,要坐地铁只能够去 Clementi 或者 Buona Vista,而且只能坐 95 路或者 96 路公交车出行。到了 2011 年的时候,随着修建了 6 年的 Kent Ridge MRT Station 建成,NUS 的学生们就可以很方便的出行了。

NUS 的 Shuttle Bus 是免费给所有人乘坐的,包括老师,学生,外来的工作人员等。除了免费这一个福利之外,NUS 的 Shuttle Bus 也别具特色,学校会将 LOGO 印在 Bus 上,可以让人一眼认出这个是 NUS 的 Bus。而 Bus 的大小是按照线路来分的,通常来说 A1,A2 的车型相对偏大,而 B1,B2,C 车的车型相对偏小,这也是根据是否经过宿舍区,和路线上人数的多少而定的。

NUSShuttleBus_3

NUSShuttleBus_4
2015 年的 Shuttle Bus

在 NUS 里面,除了学校的穿梭巴士之外,还有很多其余的穿梭巴士,其中比较有名的就是 West Coast Plaza 的 Shuttle Bus 了。在 UTown 和 Kent Ridge MRT Station 还没有建好的时候,West Coast Plaza 就是 NUS 学生经常去购物的地点了。因此,免费的穿梭巴士就成为了首选。但是 West Coast Plaza 的穿梭巴士则小了许多,跟香港的小巴能够装载的人数差不多。除此之外,在 PGP 附近,笔者好像也见过 Science Park Shuttle,只不过从来就没有坐过,也并不知道这辆车的目的地是哪里。

NUSShuttleBus_5
West Coast Plaza Shuttle Bus

在新加坡,除了随处可见的游泳池之外,新加坡最著名的游泳池应该来自于金沙酒店了。金沙酒店位于新加坡的滨海湾,属于新加坡的核心地带,也是旅游人士必去的打卡地点。金沙酒店除了提供住宿之外,还提供饮食,娱乐等诸多活动。每到夜晚,滨海湾的夜景总是让人觉得美不胜收。

MarinaBaySands_1
金沙酒店

屋顶上的游泳池则是金沙酒店的亮点之一,有机会的话自然会上去游玩一番。在 2013 年 11 月 16 日,笔者和同学 XU zhe 同去金沙酒店游泳池游玩。游泳池位于金沙酒店 55 楼层高的塔楼楼顶,长度大约 198 米。当时为了同时欣赏白天和晚上的景色,选择了从下午 4 点待到晚上 8 点。对于想来新加坡游玩的旅行者,如果想要入住金沙酒店的话,其实可以提前 45 天左右预定,将会获得不少的折扣。只要入住了金沙酒店,就可以去上面的游泳池进行观光和游泳。

对于宾客而言,在进游泳池的时候,凭借房卡里面的游泳券就可以入场,工作人员会在你的手上缠着一个防水胶带,表示你今天随便出入游泳池。进场之后,可以向工作人员要一块免费的浴巾,然后就去卫生间里面换衣服。换了衣服之后,就可以出来在外面找一个免费的躺椅,把自己的随身物品搁置在上面,便可以在无边游泳池游玩了。为了保证大家能够观光和游玩,游泳池的水深才 1.2 米,成年人可以站在游泳池里走到边缘俯瞰整个滨海湾。

虽然金沙酒店的游泳池的边缘看上去是无边的,其实在游泳池的外侧有栏杆和水槽,不仅可以接住游泳池的水,还能够进行一定的安全防护。滨海湾的一栋栋高楼就是各大银行的办公地点,还有国家大剧院,体育场等诸多设施。泳池的两侧也安装了照明设施,每当夜幕降临,游泳池的灯光将会打开,不过此时游泳观光的人群就相对少了许多。

MarinaBaySands_2
傍晚的无边游泳池
MarinaBaySands_4
无边游泳池的夜色

NUS Utown 的游泳池虽然没有金沙酒店的游泳池那么高端,但是也是 NUS 的一大亮点之一。UTown 是 NUS 于 2011 年修建的大学城,承担了教学,住宿,学习,娱乐,健身于一身的诸多功能。在 UTown 建成之前,Prince George Park 其实只提供给本科生住宿,而 master 或者 PHD 想住学校宿舍的话,就只能够选择 BoonLay 的宿舍或者 Common Wealth 两处的宿舍。因为宿舍实在是不够用,必须要优先解决本科生的住宿问题。当 UTown 建成了之后,有不少的博士生都选择搬进去,而搬进去的时候,可以选择自己的室友。如果是熟悉的朋友自然是好,如果是没有熟悉的朋友就只能够跟其他陌生人一起居住了,不过就算是陌生人也是 NUS 的学生,因此整体来看也不会出现太大的问题。

Utown_1
UTown 夜景

UTown 的游泳池就位于 Stephen Ready Centre 的第三层,它对学生免费的。因此只要是 NUS 的教职工,就可以通过证件在开放时间内进入游泳池。一般到了午后或者周末,游泳池里面总是有很多学生在游泳或者晒太阳。相对于 Swimming Pool,这里更像是一个休闲的地方。无论是学生还是老师,觉得科研或者学习疲惫了,就可以来游泳池运动并且放松一下。

Utown_2
UTown 游泳池

随着夜色的来临,其实 UTown 的游泳池也有着自身独特的魅力。不仅可以看到整个 UTown 的夜景,还能够在放松之余思考人生。除了科研,吃喝玩乐之外,思考人生则是博士生日常生活的重要组成部分。

Utown_3
UTown 的泳池夜景

在 UTown 里面,除了游泳池之类的健身场所之外,还有一个 7*24 小时开设的星巴克。该门店位于 Education Resource Centre(ERC),能够容纳 300 多个人。每个学期到了 Recess Week 或者 Reading Week 的时候,星巴克就是人山人海。不少学生都会选择在学校努力学习,奋笔疾书以应对即将来临的考试。而此刻星巴克外部的桌位通常来说都会被学生们坐满,学生们会在外部的长凳子上进行小组学习(Group Study),通过小组讨论或者自学的方式来复习本学期相应的知识点。

Utown_6
星巴克内部
Utown_7
星巴克外部

其实 NUS 的食堂还是相对较多的,在 Engineering,Science,Business 等院系都有自己的食堂。无论是学校内的人,还是外部的工作人士,都可以选择到这些食堂吃饭。在大学城 UTown 的 Town Plaza 也有食堂,无论是中国美食还是其他国家的食物,基本上在这里都能够找到。对于数学系的博士生而言,每天到了午餐或者晚餐的时候,除了在 Science 吃饭之外,还可以选择到 UTown 或者 Prince George Park 吃饭。而每到周末或者节假日,也就只有这两个食堂开门了,其他食堂(例如 Science Canteen 等食堂)在节假日期间是不会对外开放的。在博士生日常思考人生的同时,思考每一顿饭吃什么也是一件非常重要的事情。

Utown_9
Town Plaza 的食堂

UTown 的 Graduate Residence 则是为学生们开设的宿舍区,每个屋子里面有四个小房间,每个房间里面可以住一位学生。四个学生将会共用一个客厅,卫生间,淋浴等公共场所。笔者当年住在 North Tower 的 22 层,通过窗外就可以看到 UTown 的景色。从 PGP 搬到 UTown 的时候应该是 2014-07-15 这个日子,随后笔者就在 UTown 一直住到了博士毕业。不过当时从 PGP 搬过来的时候,论文中的核心部分已经解决,剩下的就只是修修补补的工作,只需要把论文写完即可。于是在博士生第五年的时候,除了日常去 S17 的 Office 之外,其余大部分时间都是在 UTown 度过的。相较于在 PGP 的时光,由于没有了课题的巨大压力,在 UTown 的时光整体来看还是十分舒适和惬意的。(未完待续)

Utown_8
UTown Graduate Residence

Photo 14-7-18 10 55 26Photo 14-7-18 10 56 06

Photo 14-7-18 10 56 08
UTown 宿舍区的绿化带
Photo 14-7-15 14 04 17
北塔 22 楼窗外的风景

 

NUS E-Open House

新加坡(Singapore)

新加坡被誉为“花园城市”,又称为“狮城”,它位于马来半岛的南端,地处在马六甲海峡最南端的位置。属于热带雨林气候的新加坡,一年只有雨季与旱季两个季节,从而导致狮城降雨频繁,气温长期处于 25-34 摄氏度左右。新加坡是一个多民族融合的国家,英语作为其官方语言。

Singapore_Map_1
新加坡地图
Singapore_Map_2
新加坡夜景

新加坡国立大学(National University of Singapore)

位于新加坡西海岸的新加坡国立大学(National University of Singapore)是一所综合性大学,近十年在泰晤士报(Times)世界大学排名和 QS 世界大学排名上,NUS 都长期名列前茅,属于亚洲的顶级学府。NUS 的前身成立于 1905 年,今年恰好是 NUS 115 校庆的年份。发展至今,NUS 已经是拥有多个学院的综合性大学,其中包括理学院(Faculty of Science),工学院(Faculty of Engineering),商学院(Business School)等诸多学院。

NUS-Map-1
NUS 的地图

NUS Open Day(新加坡国立大学开放日)

学校的排名除了全体教职工的努力之外,优秀的生源也是保障学校能够持续运营的必要条件。因此,在每个学年的第二个学期,大约在 2,3月份的时候,NUS 都会开展 Open Day,目的之一就是对新加坡的本地学生和国际学生宣传 NUS。除了宣传自己的硬件设施,专业特色,教授质量之外,还会宣传校园生活(Campus Life),基础设施和历年优秀学生的就业情况。

当年笔者还在 NUS 就读的时候,就有幸参加过 NUS 的 Open Day,不过当年只是为了凑热闹而去观看了一些活动,并没有在申请学校之前就享受到这些福利。每年到了 Open Day 之际,都会有大批中学生或者理工院校的学生前来 NUS,通过参观 NUS 的情况,来判断 NUS 是否适合自身的发展。

NUS-Open_Day-2015-1
NUS Open Day 2015

NUS E-Open House

由于 2020 年的开局实在是不利,世界上的诸多国家都受到了新型冠状病毒的影响,自然新加坡也不例外。可能是因为这个原因,2020 年的 NUS Open Day 就从线下(Offline)搬到了线上(Online),通过网络这一个重要的媒介来开展 Open Day。今年的 NUS E-Open House 应该是历史上首次在网上举办的校园开放日活动,同时校方在 NUS 的官网上也进行了大力的宣传。

NUS-E-OpenDay-Facebook-3
NUS E-Open House 2020

除此之外,NUS 也通过 Facebook 账号也进行了推广,并且学生们可以通过 Facebook,YouTube,Instagram,Zoom 等诸多社交网络工具来全方位的了解 NUS。

NUS-E-OpenDay-Facebook-1

NUS-E-OpenDay-Facebook-2

由于本次的 NUS E-Open House 为期九天,从 2020-02-26 到 2020-03-05,个人感觉 Open Day 不如称之为 Open Week。在这段时间,NUS 的所有学院将会通过网络向全世界展示 NUS 的魅力。在这段时间里,学生和家长,包括想要继续深造的职场人士都可以通过社交网络了解到 NUS 的方方面面。

NUS-E-OpenDay-Web-1
2020 年 NUS E-Open House 的日程安排

除了学院之外,每个学院都会基于自身的条件来设计相关的项目。因此,向外部人士展示各个学院的项目细节也是一个非常重要的环节。

NUS-E-OpenDay-Web-2
项目列表

当然,学习是大学生活的一部分,除了学习之外,校园生活也是许多家长和学生关心的话题之一。于是,丰富多彩的校园生活则是 NUS 的一大特色。

NUS-E-OpenDay-Web-3
校园生活

NUS 的院系

Faculty of Arts and Social Sciences(艺术与社会科学学院)

前几年,随着直播(Live)这门技术的蓬勃发展,直播已经融入了人们生活的方方面面。FASS 的学生则是通过直播的方式向大家介绍了学院的地理位置,食堂,校园生活,学习等诸多内容,让观众感受到了在校学生的热情与活力。

NUS-E-OpenDay-FASS-5

当然,只有学生的宣传是远远不够的,此时需要整个院系的努力才能够把宣传力度加到最大。在 NUS e-Open House 的主页上,可以找到 FASS 的活动时间和宣传安排,使用各种各样的宣传渠道,对这个专业感兴趣的学生就会早早订阅并且关注这一消息。

NUS-E-OpenDay-FASS-2
FASS 的宣传
NUS-E-OpenDay-FASS-4
FASS 的专业

在 FASS 中,学生们可以选择的专业也是非常多的,不仅包括中文,日语,哲学,历史等常见课程,还包括心理学,社会科学等方向。

Business School(商学院)

在商学院,不仅邀请了院系的教授与未来的学生们直接对话,还邀请了学生代表进行发言,通过亲身经历来向大家展示这几年在商学院得到的知识与心得。

NUS-E-OpenDay-Business-3NUS-E-OpenDay-Business-1NUS-E-OpenDay-Business-2

School of Continuing and Lifelong Education(持续与终身教育学院)

学习不仅仅是学生时期的事情,在这个高速发展的时代,学习这件事情将会伴随我们每个人一生的时间。于 2016 年成立的 School of Continuing and Lifelong Education 会给每个成年人提供持续教育的机会。它主要是为了想学习新技能的成年人或者想拿到学位的成年人而设置的。在这个学院有本科项目和硕士项目,还有短期项目或者各种培训。如果想拿到某些证书或者学位,其实这里是个不错的选择。

当年在新加坡国立大学(NUS)读书的时候,身边就有一些攻读 Master 学位的同学,当时他们就已经在公司工作了,在工作之余会选择 part time 的硕士在进行攻读。只要达到了学分或者做完了相应的 Project 就可以拿到 Master 学位。

NUS-E-OpenDay-SCALE-7

NUS-E-OpenDay-SCALE-2

Department of Mathematics(数学系)

新加坡国立大学数学系的前身可以追溯到 1929 年的 Raffles College。当时理学院开设了数学,化学,物理三门课程,不过总共也就只有十个学生和三位教师,其中有一位是数学教师。第一届数学系的领导(从1931年到1959年)是 Alexander Oppenheim 教授,他是在美国芝加哥大学获得的博士学位。从 1929 年开始,在新加坡的教育系统中,数学教育事业得到了巨大的发展,对现在的新加坡国立大学和南洋理工大学的建立起到了至关重要的作用。

随着 NUS 的建立,数学系就进入了一个新的时代。新的校区在 Kent Ridge,1986 年理学院和数学系就在这里成立。这个时候,数学系就有了巨大的发展,不仅在本科生的招生规模方面有了巨大提高,在研究生项目规模上也有了一定的深度的提升。

在本次的 NUS E-Open House 中,Science 的每个院系都提供了相应的宣传资料,并且所有学科统一模板,由各个学科的教授来向大家介绍这些专业的背景,学习内容和相关优势。在 NUS 的数学系(Department of Mathematics),则是由 Prof Tan 来给大家介绍院系的相关内容。

NUS-E-OpenDay-Science-3

通过 Prof Tan 的PPT,我们可以得到选择数学系的五大原因分别是:

  1. Finding Good Jobs;
  2. Wide Range of Career Choices;
  3. Multiple Pathways;
  4. Myriads of Real World Applications;
  5. Life Long Learning Skills。
NUS-E-OpenDay-Science-Math-6
数学系学生的就业统计

从学校统计到的数学系学生毕业出路来看,其实数学系学生们的选择范围还是相对广泛的。不仅包括教育行业(Education)和科研行业(Research),还包括金融(Finance),科技(Technology),信息管理(Information Management)等诸多热门方向。就业的公司不仅包括星展银行(DBS),花旗银行(CitiBank),还包括 Google,Facebook 等科技公司。如果学生在读大学之前并不确定未来要做什么方向的话,并且对学习数学有一定的能力和兴趣的前提下,在本科期间选择数学专业其实是一个不错的选择。

NUS-E-OpenDay-Science-Math-8
数学系学生的就业方向

俗话说,数学是科学的基础。数学不仅仅是数学书上的一道道定理,而是可以解决现实生活问题的重要工具。在天气预测方向,动力系统(Dynamical System)有着独特的应用;在机器学习领域,微积分,线性代数与概率论则为这门学科提供了理论基础。在金融领域,Black-Scholes 方程,Monte Carlo 模拟则是其中的重要模型。从这些学科的发展来看,数学不仅可以为这些学科提供理论基础,也是解决这些学科难题的重要工具之一。

NUS-E-OpenDay-Science-Math-12
数学在各个学科中的应用
NUS-E-OpenDay-Science-Math-16
NUS 数学系的项目

数学系的课程以难著称,有人说:“没有比数学书更好的劝退材料”。要想劝退一个人学习数学,其实是非常简单的。在 NUS 数学系,数学系的课程难度就是课程 ID 的第一个数字。例如 MA1100,就表示 Level 1 的课程,属于数学系的入门课。MA4270 就表示 Level 4 的课程,属于数学系本科课程中较难的课程。学生们可以根据自身的情况和时间安排选择相关的课程进行学习。

NUS-E-OpenDay-Science-Math-18
数学系的课程

当然,每个专业都有着不同的细分方向,虽然刚入学的时候,同一院系的学生所学课程都是一样的,但是随着时间的迁移,不同的学生会选择不同的方向进一步的深造。在数学系,通常会有 Math(数学),Applied Mathematics(应用数学),Quantitative Finance(金融数学),数据科学与分析(Data Science & Analytics)这几个方向。学生们需要在学习的过程中根据自身的兴趣和需要选择最合适自己的方向。

NUS-E-OpenDay-Science-Math-17
NUS 数学系的项目

在本科的时候,通常都会有不少学有余力的学生,不满足于只学习一门课程,或者不满足于仅仅拿到一个学位。此时,NUS 数学系还可以提供双学位的项目(Double Degree Programme),或者选择双主修的项目(Double Major Programmes)。学生可以在其中选择经济学,管理学,商业分析,计算机科学,信息安全这几个方向进行辅修,从而把在数学系学到的知识进一步地应用在其他学科中。

NUS-E-OpenDay-Science-Math-22
数学系的双学位

Application(NUS 的申请)

在新加坡国立大学的官网上,可以找到其申请的入口,学生们可以根据自身的情况申请相应的项目,从而度过一个丰富多彩的大学生活。

NUS-E-OpenDay-Application-1
NUS 的申请
NUS-E-OpenDay-Application-3
NUS 的申请流程

结束语

通过新加坡国立大学的校园开放日(NUS Open Day),我们可以了解到 NUS 的院系特点,校园生活,学习项目等很多内容。而 NUS E-Open House 则是在这个特殊时期的一个创新,充分利用互联网的优势,把 NUS 的特色通过网络传递给大家,向大家充分展示了 NUS 的魅力之处。

参考资料:

  1. 新加坡国立大学的博士生项目介绍
  2. 新加坡的留学生活
  3. 新加坡国立大学的数据科学与机器学习项目介绍

为什么【在家办公比上班还累】?

野原广志在家工作的一天

《在家里工作的爸爸哦》

小新爸爸在家工作哦_1
赖床
小新爸爸在家工作哦_2
吃早饭
小新爸爸在家工作哦_3
立志今天要在家好好工作
小新爸爸在家工作哦_4
帮野原美伢洗衣服
小新爸爸在家工作哦_5
延缓工作开始时间
小新爸爸在家工作哦_6
照顾小葵
小新爸爸在家工作哦_7
更换工作地点
小新爸爸在家工作哦_8
帮野原美伢收棉被
小新爸爸在家工作哦_9
帮野原美伢收快递
小新爸爸在家工作哦_10
帮小新送东西
小新爸爸在家工作哦_11
结果一天下来只写了三个字

看到这里想必大家也知道为什么在家里工作效率低了。从《蜡笔小新》这个纪实版动画可以分析得知大致有以下几个原因:

  1. 工作与生活的时间界限感不强,导致工作的开始时间不明确;
  2. 被家里的琐事频繁打断:例如洗衣服,照顾小孩,收快递,送东西等;
  3. 自制力不强:容易被电视,电脑,游戏等好玩的东西所吸引。

因此,野原广志在家一天工作的产出几乎是零。

解决这类问题的思路有以下几个:

1. 划清工作和生活的界限:找一个单独的房间,不被打扰,专心致志地工作。让自己从工作切换到生活的成本增加,而不是处于可以随意地切换工作与生活的状态。如果找不到相应的房间,就找一个桌子,日常生活不要坐到桌子前。但是一旦坐到了桌子前,就表示进入了工作状态。就表示不能够轻易地被打扰,要尽快开始一天的工作。

工作桌子
工作台

2. 使用日历表:根据自身情况,制定基于自己工作和生活状态的日历表,使用 Google Calendar 或者其他计时工具,把自己一天的日程安排下来,让自己在固定的时间内做固定的事情,不要被其他事情所打扰。

例如下图,就是笔者在上班的时候的日程安排:

日程表_1
日程表

3. 制定详细的工作计划:包括制定每天需要输出的工作内容,无论是写了多少企划书,写了多少页 PPT,写了多少代码,完成了多少个功能点,都需要有非常明确的指标。只有制定了明确的目标,才能够督促自己完成任务。

工作计划
计划

4. 规划固定时间:吃饭,睡觉,娱乐等固定的时间先划分好,不到万不得已,不能随便改变生活规律,一旦改变生活规律,要想纠正回正常状态就会非常的困难。

日程安排
规律的时间安排

5. 区分工作内容:提前区分哪些是需要团队协作的项目,哪些是靠自己就能够独立完成的项目。对于需要团队协作的项目,尽量提前安排好时间,毕竟跨地域沟通需要一定的成本,需要对方也在线,把时间和人提前安排好会明显优于临时安排。对于那些靠自己就能够独立完成的项目而言,只需要保证工作的时候不被打扰,专心致志地做完即可。

团队
团队协作

职场人士在家工作确实可以体验自由职业者谋生或者博士生做科研的状态,确实也可以做到自行安排自己的时间,但是要做时间的主人,而不是做时间的奴隶。

 

素数之美

素数的定义

素数是在中小学课本里面就会出现的数学概念,它指的是只能够被 1 和它本身整除的正整数。在正整数中,2, 3, 5, 7, 11 等都是素数。同时,每一个正整数(不小于 2)都可以写成多个素数的乘积,例如 35 = 5 * 7, 10 = 2 * 5。从素数的定义可以看出,判断一个数是否是素数是需要通过“乘法”的。而在数学的研究历程中,数学家们同样也关心由素数之间的加法所产生的奇妙结论。

100以内素数表
100 以内的素数表

哥德巴赫猜想(Goldbach’s Conjecture)

随着徐迟的报告文学《哥德巴赫猜想》的问世,哥德巴赫猜想在国内早已家喻户晓。其中,哥德巴赫猜想包括两个部分:

  1. [Theorem] 每一个大于 7 的奇数都可以写成三个素数之和;
  2. [Conjecture] 每一个大于 6 的偶数都可以写成两个素数之和。
Goldbach_手稿_1
哥德巴赫的手稿

从猜想的陈述来看,如果第 2 部分是正确的,那么可以根据公式 n = (n-3) +3 直接得到第 1 部分是正确的,因此第 2 部分被称为强哥德巴赫猜想,第 1 部分被称为弱哥德巴赫猜想。其中哥德巴赫猜想的第 1 部分已经被彻底解决,而哥德巴赫猜想的第 2 部分目前最好的结果被称为陈氏定理( Chen’s Theorem)。用数学的语言来说,这两个定理的陈述分别是:

[Theorem (Vinogradov)] 假设 N 是一个奇数,令 r(N) = \sum_{p_{1}+p_{2}+p_{3}=N}1 表示关于 N 的计数函数,其中 p_{1}, p_{2}, p_{3} 都是素数。则存在一个一致有界的函数 \Omega(N) \in (c_{1},c_{2})c_{2}>c_{1}>0)对于充分大的奇数 N,有以下式子成立

r(N) = \Omega(N)\cdot \frac{N^{2}}{(\ln(N))^{3}}\cdot\bigg\{1+O\bigg(\frac{\ln\ln(N)}{\ln(N)}\bigg)\bigg\}.

备注:从以上公式可以看出,\lim_{N\rightarrow \infty} r(N) = +\infty. 换句话说,\exists N_{0}, \forall N\geq N_{0}, 弱哥德巴赫猜想成立。

[Theorem (Chen)] 假设 N 是一个偶数,令 r(N)=\sum_{p+n=N}1 表示关于 N 的计数函数,其中 p 是素数,n 表示最多为两个素数的乘积。则当 n 充分大的时候,有以下式子成立:

r(N) >> \Omega(N)\cdot \frac{2N}{(\ln(N))^{2}},

其中 \Omega(N) = \prod_{p>2} \bigg(1-\frac{1}{(p-1)^{2}}\bigg)\prod_{p|N, p>2}\frac{p-1}{p-2}.

备注:

  1. 在哥德巴赫猜想的研究过程中,通常数学家把偶数可表示为 a 个素数的乘积与 b 个素数的乘积之和这个问题,简称为 a + b 问题。所以,陈景润证明的 “1+2” 并不是指 1+2 = 3,而指的是对于每一个充分大的偶数,要么是两个素数之和,要么是一个素数加上两个素数之积。其实可以简单的理解为 p_{1}+p_{2} 或者 p_{1}+p_{2}\cdot p_{3},在这里 p_{1},p_{2},p_{3} 都是素数。从以上公式可以看出,\lim_{N\rightarrow \infty} r(N) = +\infty.
  2. 1920 年,挪威数学家 V.Brun 证明了 “9+9″,开启了数学家研究哥德巴赫猜想之路;1966 年,中国数学家陈景润证明了 “1+2″,把素数的筛法推向了顶峰。

孪生素数猜想(Twin Primes Conjecture)

在上千年的素数研究历程中,除了哥德巴赫猜想,孪生素数(Twin Primes)的研究也是数论中的一个重要课题。所谓孪生素数就是相差为 2 的两个素数,例如 (3,5), (5,7), (11,13),\cdots 等等。因此,就有人提出猜想:孪生素数有无穷多对。换句话说,如果用 p_{n} 表示第 n 个素数,那么孪生素数猜想就是 \liminf_{n\rightarrow +\infty}(p_{n+1}-p_{n})=2. 除了孪生素数本身之外,也有学者猜测,对于所有的正整数 k\geq 1, 形如 (p,p+2k) 的素数对同样有无穷多对。于是,在网上就有人对于有限的素数对进行了计算,让大家更好地看到素数之间的分布情况。

Twin_Prime_2
孪生素数及其推广

下面是部分关于素数间距(小间距,Small Gaps)的结论:

  1. 1940 年,Paul Erdos 证明 \exists c>0 使得 \liminf_{n\rightarrow\infty} \frac{p_{n+1}-p_{n}}{\ln(p_{n})}<c.
  2. 2005 年,Daniel Goldston,Janos Pintz 和 Cem Yildirim 证明 \liminf_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\ln(p_{n})}=0.
  3. 2007 年,上述结果被改进为 \liminf_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\sqrt{\ln(p_{n})}\cdot (\ln\ln(p_{n}))^{2}}=0.
  4. 2013 年,张益唐证明了 \liminf_{n\rightarrow\infty}(p_{n+1}-p_{n}) < 7 * 10^{7},随后这个结果被改进到 246。

除了素数之间的小间距之外,素数之间的大间距(Big Gaps)同样也有很多结论:

  1. 1931 年,Erik Westzynthius 证明 \limsup_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\ln(p_{n})} =\infty.
  2. 2014 年,Kevin Ford, Ben Green, Sergei Konyagin, Terence Tao 和 James Maynard 证明 p_{n+1}-p_{n}>c\cdot \frac{\ln(n)\cdot \ln\ln(n) \cdot \ln\ln\ln\ln(n)}{\ln\ln\ln(n)} 对于某个 c>0 和无穷个 n 成立。

素数定理

在研究素数的过程中,研究素数的分布规律就是这一切的关键所在。其中,素数定理则是描述素数分布的一个重要结论。类似的,关于孪生素数的分布也有一个上界的估计。

[素数定理] 假设 \pi(x) 表示不大于 x 的所有素数的个数,那么 \lim_{x\rightarrow \infty}\pi(x)/(x/\ln(x)) = 1.

[孪生素数个数的上界] 假设 \pi_{2}(x) 表示不大于 x 的所有孪生素数个数,那么存在常数 C>0 使得 \pi_{2}(x)\leq C\cdot x/(\ln(x))^{2}.

备注:从这两个定理可以粗糙地刻画出素数与孪生素数在实数轴的分布情况,并且可以看出孪生素数相对于素数则是少很多的。因为 \lim_{x\rightarrow+\infty}\pi_{2}(x)/\pi(x)=0.

prime_theorem
素数定理
Twin_Prime_Number_1
孪生素数的个数

素数的性质

在中小学的竞赛部分,大家总能够接触到一个关于素数的定理。

[Theorem (Euclid)] 素数有无穷多个。

证明:假设素数是有限个,不妨设为 p_{1},\cdots, p_{n},那么 N = \prod_{i=1}^{n}p_{i}+1 就是合数,但是它却不能被所有的素数 p_{1},\cdots,p_{n} 整除,所以导致矛盾。因此素数是无穷多个。证明完毕。

除此之外,在大学里面学习级数的时候,通常都会研究调和级数(Harmonic Series)的性质。所谓调和级数指的就是所有正整数的倒数和,形如:

S(x) = \sum_{1\leq n\leq x} \frac{1}{n}.

从定积分与级数的关系可以得到 \lim_{x\rightarrow +\infty}S(x) = +\infty 并且 S(x)  = \ln(x) + O(1). 也就是说,所有正整数的倒数和是发散的。

利用这种思路,其实可以分析所有素数的倒数和,也就是说 \sum_{p \text{ prime}} \frac{1}{p}. 通过欧拉公式可以得到:

\sum_{n=1}^{\infty}\frac{1}{n} = \prod_{p\text{ prime}}\bigg(1+\frac{1}{p}+\frac{1}{p^{2}}+\cdots\bigg)= \prod_{p\text{ prime}} \frac{1}{1-\frac{1}{p}},

两边取对数可以得到 \ln\bigg(\sum_{n=1}^{\infty}\frac{1}{n}\bigg) = \sum_{p\text{ prime}} -\ln\bigg(1-\frac{1}{p}\bigg),

由于 -\ln(1-x) = x + O(x^{2}),并且 \sum_{n=1}^{\infty}\frac{1}{n}=+\infty, \sum_{n=1}^{\infty}\frac{1}{n^{2}}=\frac{\pi^{2}}{6}, 可以得到

\ln\bigg(\sum_{n=1}^{\infty}\frac{1}{n} \bigg)= \sum_{p\text{ prime}}\frac{1}{p} + O\bigg(\sum_{p\text{ prime}}\frac{1}{p^{2}}\bigg).

等式的左边是发散的,右侧的第二项是收敛的,因此右侧的第一项(素数的倒数和)是发散的。进一步地,可以得到两个结论:

  1. \sum_{p\text{ prime}, p\leq x} \frac{1}{p} = \ln\ln(x) + O(1);
  2. \prod_{p\text{ prime}, p\leq x}\bigg(1-\frac{1}{p}\bigg)^{-1} = c\cdot\ln(x)+o(1), 这里,c>0 是一个常数。

至此,我们得到了两个级数的定理:

  1. [Theorem] 所有正整数的倒数和是发散的;
  2. [Theorem] 所有素数的倒数和是发散的。

从第 2 个结论同样可以得到素数是无穷多个。于是,就有数学家猜测如果孪生素数的倒数和是发散的,那么孪生素数同样也是无穷多对。但是在 1915 年,数学家 Brun 证明了,孪生素数的倒数和是收敛的,这个收敛的数字也被称为 Brun 常数。

[Theorem] 所有孪生素数的倒数和是收敛的。

证明:通过孪生素数个数的上界公式,可以得到存在 C>0 使得对于充分大的 x,有

\pi_{2}(x) \leq C\cdot \frac{x}{(\ln(x))^{2}}

成立。假设素数序列 p'_{1}, p_{2}',\cdots, p_{n}',\cdots 使得 p, p+2 都是素数,那么 n = \pi_{2}(p_{n}') \leq C\frac{p_{n}'}{(\ln(p_{n}'))^{2}}\leq C\frac{p_{n}'}{(\ln(n))^{2}},进一步可以得到

\frac{1}{p_{n}'} \leq C\frac{1}{n\cdot (\ln(n))^{2}}

对于充分大的 n 成立。而右侧是收敛的,i.e. \sum_{n=2}^{\infty} \frac{1}{n\cdot(\ln(n))^{2}}<+\infty. 因此,孪生素数的倒数和是收敛的。证明完毕。

备注:由于孪生素数的倒数和是收敛的,因此,通过孪生素数的倒数和来证明孪生素数有无穷多对这条路就被封死了。

在研究孪生素数的过程中,其目的是为了研究素数之间的间距究竟能有多小,也就是分析 \liminf_{n\rightarrow+\infty}(p_{n+1}-p_{n}) 的上界。同样的,也可以研究素数之间的间距究竟有多大,并且可以分析其量级大约是多少,此时就需要研究 \limsup_{n\rightarrow+\infty}(p_{n+1}-p_{n}).

[Theorem] 对于充分大的 x 而言,在 [1,x] 内,素数之间的最小间隔 \min_{p_{n}\leq x} (p_{n}-p_{n-1})\leq (1+o(1))\ln(x); 同时,素数之间的最大间隔 \max_{p_{n}\leq x}(p_{n}-p_{n-1})\geq (1+o(1))\ln(x).

证明:考虑区间 [1,x],通过素数定理可以得到在 [1,x] 区间内的素数大约是 \pi(x) \sim x/\ln(x) 个。于是把该区间 [1,x] 切割成长度为 \ln(x) 的子区间,区间的个数为 x/\ln(x), 通过鸽笼原理 (Pigeonhole Principle) 可以得到此定理的结论。

备注:除此之外,证明相邻素数的间隔没有上限还可以用构造法。考虑 n!+2, n!+3, \cdots, n!+nn 个连续的合数,所以两个相邻的素数必在 [n!+2, n!+n] 这个区间两侧。因此相邻素数的间隔没有上限,i.e. \limsup_{n\rightarrow+\infty}(p_{n+1}-p_{n})=+\infty.

Eratosthenes 筛法(Eratosthenes Sieve Method)

Eratosthenes 筛法是数学家 Eratosthenes 提出的一种筛选素数的方法,其思路比较简单:想要筛选出 [2,n] 中的所有素数,则首先把 [2,n] 中的所有正整数按照从小到大的顺序 2, \cdots, n 来排列,然后按照如下步骤执行:

  1. 读取数列中当前最小的数 2,然后把 2 的倍数全部删除;
  2. 读取数列中当前最小的数 3,然后把 3 的倍数全部删除;
  3. 读取数列中当前最小的数 5,然后把 5 的倍数全部删除;(4 已经被第一步去掉了)
  4. 读取数列中当前最小的数 7,然后把 7 的倍数全部删除;(6 已经被第一步去掉了)
  5. 循环以上步骤直到 [2,n] 中所有的数被读取或者被删除。
其算法复杂度为 O(n\ln(n))
埃拉托色尼筛选法
黄色的数为素数

Brun 筛法(Brun Sieve Method)

在数学界发展出各种筛法,其重要目的之一就是为了解决孪生素数猜想和哥德巴赫猜想。除了 Eratosthenes 筛法之外,数学家 V. Brun 也发现了一种筛法,后人称之为 Brun’s Sieve。其目的就是为了估计孪生素数的上界,进一步得到计算孪生素数的倒数和。其主要结论就是 \pi_{2}(x)\leq C\frac{x}{(\ln(x))^{2}}, 其中 C>0 是一个常数,并且 Brun 通过其筛法可以得到哥德巴赫猜想中的 “9+9″,在哥德巴赫猜想的发展中属于里程碑式的工作。

Question. 研究素数究竟有什么用?

Answer. 为了人类智慧的荣耀。

参考文献:

  1.  Small and Large Gaps Between Primes, Terence Tao, Latinos in the Mathematical Sciences Conference, 2015.
  2.  Bounded Gaps Beween Primes, Yitang Zhang, 2013.
  3.  Additive Number Theory, Melvyn B.Nathanson, GTM 164.
  4.  http://mathworld.wolfram.com/TwinPrimes.html.

在新加坡的这五年—生活篇(四)

在之前的文章里,笔者分别对新加坡留学生的日常生活,人物轶事,过年感受做了回顾。本次将会提到一个重要的话题,那就是电子游戏(Electronic Games)。

对于基础学科的博士生来说,在第一年都会修各种各样的课程,通常来说毕业之前需要修 8 门课,再加上一门听讲座的课程。并且在前两年参加博士生资格考试(Qualify Exam,分为 Writing 和 Oral 两个部分)。一旦博士生通过了博士资格考试,就开始全面进入科研阶段;否则就只能够拿硕士学位离开。众所周知,读书是很多人一起参与的事情,通过考试是可以分出高下的。唯独科研这一件事情,几乎就是自己一个人的战斗。在这一个人的漫漫科研长路中,虽然大部分时间笔者也在奋力向前,努力毕业,但偶尔难免心生疲惫。在疲惫或者想放松的时候,就自然而然地想到了电子游戏(Electronic Games)。

在中学的时候,笔者接触过《帝国时代》(Age of Empires),《暗黑破坏神2》(Diabol 2)等系列游戏;在大学期间,则开始玩《魔兽争霸3》(WarCraft 3),《Dota》;到了博士生的时候,接触到的游戏就更多了,包括但不限于《暗黑破坏神3》(Diabol 3),《炉石传说》(HeartStone),《坦克世界》(World of Tanks),《Fifa 2015》。

WarCraft_1
WarCraft 3

在中学的时候,虽然也接触过《暗黑破坏神 2》,但是由于高考等种种因素,没有认认真真地玩过这款游戏。真正开始玩这款游戏应该是在大四下学期( 2009 年),当时 05级数学系的所有学生都已经从浦口校区搬到了鼓楼校区,男生们都住在筒子楼里面。之所以是筒子楼,意思就是学校的宿舍不够用了,拿家属区的房子来充当宿舍。其实在  2009 年之前,当时还在浦口的时候,暴雪公司就早已对外公布了《暗黑破坏神 3》的一些画面和角色,包括野蛮人的装备配置,闯关场景等诸多画面。但直到 2012 年 5 月份,暴雪公司才正式对外发售这款游戏。在对外发售这款游戏之前,NUS 数学系的很多博士生都沸腾了,纷纷通过各种渠道购买这款游戏,有的人提前在实体店预定,有的人提前在网上购买。笔者当时在暴雪公司的官网上花了 90 SGD 购买这款游戏,包括亚服,美服,欧服三个服务区。虽然博士生的学习十分繁忙,但是 NUS 的暑假总是来得特别早,每个学年基本上 4 月份就完成了教学工作,5 月份的话就已经开始了暑假的生活,直到 7 月底才会结束假期,开始新学年的生活。在种种因素下,除了必要的工作和科研之外,有的博士生就开启了打暗黑 3 的生活。

DiabloIII_2
暗黑破坏神 3

玩 PC 游戏比较依赖电脑的性能,当时虽然花钱购买了游戏,不过当时的电脑是 2008 年的电脑,在鼓楼珠江路购买的 Lenovo 的 IdeaPad Y 530。即使此电脑性能不行,但也满足了《暗黑破坏神 3》这款游戏的最低配置。因此,在身边的同学都纷纷入坑的情况下,笔者也跟着大家开始玩这款游戏。

LenovoidealpadY530
Lenovo IdeaPad Y530

不过到了 2010 年之后,iPhone 开始风靡全球,智能手机开始逐渐走入大家的视野。到了 2011 年 7 月份的时候,笔者决定买一台 iPhone。在新加坡,如果是本地人或者 PR,或者有工作签证的人,购买一台 iPhone 的合约机是非常简单的。每人可以签约一台手机,预购费貌似是 200 SGD 左右,然后每个月大概也就花 50 SGD 左右就可以将其拿到。但是对于持有学生签证的人而言就没有那么方便了,必须要缴纳 800 SGD 的押金,时长两年,才能够把手机拿到手。不过在当时 iPhone 的热潮下,跟着贾博士,尹博士一起去 vivo city 的 StarHub 办理手续。除了钱之外,还需要当时银行来往的信件,因为信件上面有每个人的通讯地址,每个月 StarHub 会通过这个地址给签约人寄送当月的通讯费用。 由于没有带银行来往的信件,三人还往返了一趟学校与 vivo city,跑了两次才将手机拿到手。

iPhone4
iPhone 4

“一入苹果深似海,从此钱财是路人”。苹果的产品确实做得很好,除了 iPhone 4 之外,后续笔者每年都会入手一些苹果的其他产品,包括 iPod Shuffle,itouch,键盘,鼠标,iPad,Mac Air。除了一体机 iMac 没有入手之外,其他的苹果产品均已体验过。当时基于这些产品,在 2013 年的时候把自己的电脑从 Lenovo 换成了 Mac Air,并且在博士生的办公室(Graduate Office 5)搭建了自己的工作环境(自然也可以无缝切换成游戏环境)。

DiabloIII_1
Graduate Office 5

当年在新加坡的时候,师门总共有四个人,分别是大师兄,二师兄,三师兄再加上笔者。其中,大师兄从来不玩任何游戏,二师兄与三师兄在那段时间都会玩《暗黑破坏神 3》。特别地,三师兄是众多博士生中唯一一个能够通过游戏本身回本的。在刚推出的时候,的《暗黑破坏神 3》有拍卖场,很多玩家都会在上面拍卖自己获得的装备,武器,金钱等道具。三师兄又特别擅长研究各种各样的游戏攻略和刷顶级道具,利用拍卖场这一套现工具,三师兄在玩了几个月之后顺利地把自己的装备套现,并且卖到了和游戏本身差不多的价钱。除了博士生同学之外,当年笔者还住在 West Coast Plaza 的 Block 602 #11-28,房东就是 NUS 的讲师,也一起入手了暗黑 3 这款游戏。可见暗黑系列游戏在 80 后一代人心中的地位。

DiabloIII_3
Diabol 3 拍卖场

随着时间的推移,科研任务的逐渐加重,新学期的重新开始,博士生中的暗黑 3 热潮已经逐渐淡去。到了 2014 年,暴雪的另一款游戏引起了我的注意,那就是《炉石传说》。炉石传说与暴雪的其他策略竞技类游戏不一样,它是一款卡牌游戏。根据卡牌的抽取顺序和英雄技能的不同,有着完全不一样的打法和策略。刚入门的时候门槛不高,笔者也能够有一些胜率,但是到了某天晚上,不知道是状态不好还是水平不够,一直在输,总没有克制对手的方法。于是,当天晚上笔者就往炉石传说里面充了钱,购买了很多卡包,当晚就拥有了很多卡牌,后来胜率又逐渐提升。果然,游戏只要充钱就会变得更强。

HeartStone_1
炉石传说

到了 2014 年的下半年,笔者也忙于撰写毕业论文和教学任务。不少当年在一起玩游戏的学长们也已经毕业,即使没有毕业也在努力搞论文。此时也很难凑到一批人像当年一样打暗黑 3。同时,随着智能设备的兴起,电子游戏也已经从以前的 PC 端转到了移动端,包括 iPad 和手机端。在手机端上,其实是没有办法进行复杂的游戏操作的,暗黑 3 这种游戏在 iPad 和手机上几乎是不可行的。在撰写毕业论文的同时,为了舒缓压力,就又挖掘了两款新的游戏,分别是《坦克世界》(World of Tanks)和《Fifa 2015》。

Worldoftanks_2
World of Tanks
Worldoftanks_3
实战

在坦克世界里,相较于各种坦克,笔者更倾向于用反坦克炮,靠灌木丛或者遮掩物躲在一处。一旦队友发现了敌方的踪迹就瞄准,然后就用反坦克炮给予一记重炮。其中,虽然苏系坦克的移动速度一般,但是火力生猛,深受笔者喜爱。

Fifa2015_1
Fifa 2015(1)
Fifa2015_2
Fifa 2015(2)

在本科的时候,笔者就经常和同学们一起玩实况足球,当时流传的一句话就是“无兄弟,不实况”,意思就是实况足球这种游戏确实要与同学一起竞技才能够体现其游戏乐趣。否则玩足球游戏就是以通关为目的,只要赢了或者获得冠军,游戏就已经结束了。当时大约是 2014 年的 12 月,2010 级的博士生要么已经提交了论文,要么正在提交论文的路上,笔者很少有机会与大家玩网络游戏,当时玩得更多的是单机版游戏,或者就与网上不认识的人随便打一下。

在读博士这几年,关于电子竞技或者生活的回忆还是很多的。生活嘛,总要找一点乐趣才能够坚持下去(未完待续)。

在新加坡的这五年—生活篇(三)

在上一篇文章在新加坡的这五年—生活篇(二)中,笔者回顾了那些年在新加坡读书的时候,所遇到的一些有趣的人和事。本篇文章会回顾之前在新加坡的过年轶事。

最近几天正值新春佳节,虽然 2020 年的开局实在是不够顺利,无论是肆意传播的疫情,还是科比的突然离世,都给新的一年带来了不少沉重的色彩。但是新年总要有新的气象,每年都要立一些新的 Flag(虽然 2010 年的 Flag 可能至今都没有完成)。

li_flag

如果是在国内过春节,除了一些特殊的原因之外,那自然是需要回家乡与亲人团聚,坐在一起吃年夜饭,共同看春节联欢晚会。但是对于留学生而言,回国与家人共度春节就显得没有那么方便了。虽然新加坡的工作人士有很多的年假,但是他们的公共假日却少得可怜。很多外国人也很难想象中国人可以有春节黄金周,十一黄金周这种一整周的假期。在新加坡的官网上可以看到,新加坡的公共假日基本上都是一两天,除了中国农历新年放假两天之外,元旦新年,劳动节,新加坡国庆日,圣诞节等诸多假日都只有一天的假期。在这些公共假日里,从宿舍区去办公室是没有校车的,只能靠自己的 11 路走来走去。

SingaporePublicHoliday2020
2020 新加坡的公共假日

新加坡是一个多民族融合而成的国家,虽然农历新年对于中国人来说意义非凡,但是私底下有的老师对于留学生春节期间离开新加坡返回中国过节这件事情是有一定的意见的。毕竟这段时间学校已处于开学阶段,一旦有学生要离开助教(Teaching Assistant)或者助研(Research Assistant)岗位,该学生或者院系就需要找到另外的学生来临时代替他的工作,确实会对教学和科研造成一定的影响。不过这个只是说不建议留学生回国,其实留在新加坡的话留学生们也不需要来办公室,安心在家休假过节即可。对于很多留学生而言,即使不能够回国与家人欢度除夕新年,在新加坡体验异国他乡的春节其实也还算一个不错的选择。新加坡是以华人为主的社会,农历新年在新加坡绝对算得上是一个非常隆重的节日。每到农历新年之际,无论是 Chinatown,圣淘沙,还是每家每户,都是张灯结彩,充满了喜庆的氛围。

SingaporeSentosaCNY_1
2011 年圣淘沙农历新年
SingaporeSentosaCNY_2
2011 年圣淘沙农历新年

从 NUS 每年的学校日历来看,对于身处新加坡的留学生而言,农历新年的时候正好是刚刚开启新的学期的时候。即使回国也只能迅速返回学校,毕竟只有两天的假期。除了少数回国的学生之外,大部分留学生们都会在新加坡自行组织过农历新年的活动。对于学校而言,虽然是正月初一和正月初二放假,其实到了大年三十下午的时候,就已经不再组织教学活动了,因为就算上课也会有不少学生缺席。无论是学校的教职工,还是学生,都会在除夕当天下午准备过年的食物和喜庆的礼品。在正月初一和正月初二这两个特殊的日子里,很多商店,超市,饭店都是不开门的,即使是每天营业时间最长的昇菘超市(shengsiong),也会选择在大年三十的下午 3:00 提前下班,让员工们提前回去过除夕。因此,提前去超市准备过春节的食物和年夜饭就是所有留学生的必做的事情。

NUS_2019_2020_calendar
NUS 的 2019-2020 年度日历

要想从 NUS 的 UTown 或者 PGPR 两个宿舍区去昇菘超市可没有那么容易,除了等待 West Coast Plaza 的穿梭巴士和 NUS Bus,只能够选择步行的方式,从数学系 Block S17 出发,步行穿过工学院(Faculty of Engineering),再翻山穿过 Clementi Woods,最后走到昇菘超市。去时容易,返回困难。去程的时候双手空空荡荡,返程的时候可是大包小包全部装满了食物,饮料和酒水。通常来说,这往返一趟办公室和昇菘超市,需要两个小时左右的时间。不过,作为年夜饭的准备,还是非常值得的。

NUS_clementiwoods_map
Clementi Woods

从 2011 年算起到 2014 年,笔者前前后后在新加坡度过了四个春节,那几年的除夕夜分别是在 West Coast Plaza 的川江号子,UTown,UTown,ChinaTown 的国府珍锅吃的年夜饭。印象最深刻的就是在 2014 年大年三十的时候,吃完年夜饭,回到 PGP 之后打开电脑,写下了这一段话,立下了 2014 年的 Flag:

今年是农历的除夕,也就是大年三十,依旧和PHD们出去吃了顿火锅。不知道是不是最后一次在新加坡过年了。前前后后也过去四年了。第一次是West Coast Plaza的川江号子,第二次是utown宿舍,第三次也是在utown宿舍,第四次是在Chinatown的国府珍锅。不知道明年还有没有机会在新加坡过年了。最希望的就是尼玛交了论文就直接可以考虑毕业了,就不用在新加坡这个地方过年了。

Jan 31, 2014 00:18

于是,为了兑现 2014 年初的 Flag,笔者在 2014 年整整奋发图强了半年,终于在 2014 年 7 月份的时候把论文的主要步骤自行推导出来,在 2014 年下半年开学之后花了两三个月时间把所有步骤整理并且装订成册,在 2015 年 1 月份的时候就在系统上提交了自己的博士论文。

 

 

 

li_flag_2
Flag

每次提到毕业的事情都会觉得心情沮丧,所幸的是最终还是顺利地拿到博士学位。回想起博士生活的点点滴滴,除了科研的过程比较苦逼之外,其他的各种生活还是丰富多彩的。(未完待续)

 

拉格朗日四平方和定理

拉格朗日四平方和定理

每个正整数均可表示为四个整数的平方和。

Every positive integer is the sum of four squares.

例如:

  • 1=1^{2}+0^{2}+0^{2}+0^{2}
  • 2 = 1^{2}+1^{2}+0^{2}+0^{2}
  • 7 = 2^{2}+1^{2}+1^{2}+1^{2}

证明:可以直接验证如下恒等式

(x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\cdot(y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}) = z_{1}^{2}+z_{2}^{2}+z_{3}^{2}+z_{4}^{2},其中

\begin{cases} z_{1}=x_{1}y_{1}+x_{2}y_{2}+x_{3}y_{3}+x_{4}y_{4} \\ z_{2}=x_{1}y_{2}-x_{2}y_{1}-x_{3}y_{4}+x_{4}y_{3} \\ z_{3}=x_{1}y_{3}-x_{3}y_{1}+x_{2}y_{4}-x_{4}y_{2} \\ z_{4}=x_{1}y_{4}-x_{4}y_{1}-x_{2}y_{3}+x_{3}y_{2}\end{cases}

由于 1 与 2 都明显满足这个定理,那么只需要考虑大于 2 的正整数。而这些正整数都可以分解成素数的乘积,因此,只需要证明该定理对所有的素数成立,则使用以上恒等式就可以得到最终的结论。假设 p 是一个奇素数。

由于 \{a^{2}:a\in\{0,1,\cdots,(p-1)/2\}\} 里面有 (p+1)/2 个不同的同余类,\{-b^{2}-1: b\in \{0,1,\cdots,(p-1)/2\}\} 里面也有 (p+1)/2 个不同的同余类,但是素数 p 的同余类只有 p 个,因此存在正整数 a,b\in \{0,1,\cdots, (p-1)/2\} 满足 a^{2}\equiv -b^{2}-1 (\mod p)。也就是说 a^{2}+b^{2}+1^{2}+0^{2}\equiv 0(\mod p)。令 n\in\mathbb{Z} 满足 np=a^{2}+b^{2}+1,则有 p\leq np\leq 2(p-1)^{2}/4+1<p^{2}。于是,1\leq n<p

因此存在一个 1\leq n<p 使得 np = a^{2}+b^{2}+1^{2}+0^{2} 是四个整数的平方和。于是必定存在一个最小的正整数 m 使得 1\leq m\leq n<p 使得 mp 为四个整数的平方和,不妨设为 mp=x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2}

Claim. m=1

proof of the claim. 反证法,假设 1<m\leq n<p 成立。令 y_{i}=x_{i}(\mod m) 对于 i\in\{1,2,3,4\} 成立,并且 -m/2<y_{i}\leq m/2。因此,y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}\equiv(x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\equiv mp \equiv 0(\mod m)。令 mr = y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}。因此,mr\leq 4(m/2)^{2}=m^{2}

如果 r =m,通过以上不等式得知 r=m 等价于 y_{i}=m/2 对于 i\in\{1,2,3,4\} 都成立。此时,mp = x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2}\equiv 4(m/2)^{2} \equiv 0 (\mod m^{2})。因此,pm 的倍数,这与 p 是素数,m>1 矛盾。所以,r<m 成立。i.e. 1\leq r<m\leq n<p 成立。

进一步地,(mp)\cdot(mr) = (x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\cdot(y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}) = z_{1}^{2}+z_{2}^{2}+z_{3}^{2}+z_{4}^{2},这里的 z_{i} 正如恒定式里面所定义的。由于 y_{i}\equiv x_{i}(\mod m),并且 \sum_{i=1}^{4}x_{i}^{2}\equiv 0(\mod m)。因此,z_{i}\equiv 0(\mod m) 对于 i\in\{1,2,3,4\} 都成立。所以,z_{i}=w_{i}mw_{i}\in\mathbb{Z} 对于 i\in\{1,2,3,4\} 都成立。通过 (mp)\cdot(mr) = \sum_{i=1}^{4}z_{i}^{2} 可以得到 pr=\sum_{i=1}^{4}w_{i}^{2} 成立。但是,1\leq r<m 这与 m 的最小性假设矛盾了。

因此,m=1,Claim 证明完毕。

于是,对于所有的奇素数,都可以表示为四个整数的平方之和。根据之前的分析,可以得到对于所有的正整数,都可以表示为四个整数的平方之和。Lagrange 定理证明完毕。

参考文献

  1. GTM 164, Additive Number Theory, Melvyn B.Nathanson, 1996.

传染病的数学模型

近期,国内的疫情闹得沸沸扬扬,很多省市自治区都出现了流感的患者。回想起之前在学校的时候曾经研究过微分方程和动力系统,于是整理一下相关的数学模型,分享给各位读者。笔者并不是研究这个领域的专家,并且这篇文章只是从微分方程角度出发,分析方程的性质,不一定适用于真实环境,而且真实环境比这个也复杂得多。

关于传染病的数学模型,在许多年前数学界早已做过研究,根据传染病的传播速度不同,空间范围各异,传播途径多样,动力学机理等各种因素,对传染病模型按照传染病的类型划分为 SI,SIR,SIRS,SEIR 模型。如果是按照连续时间来划分,那么这些模型基本上可以划分为常微分方程(Ordinary Differential Equation),偏微分方程(Partial Differential Equation)等多种方程模型;如果是基于离散的时间来划分,那么就是所谓的差分方程(Difference Equation)。

在本文中,将会主要介绍常微分方程中的一些传染病数学模型。在介绍方程之前,首先要介绍一些常用的符号:在时间戳 t 上,可以定义以下几种人群:

  • 易感者(susceptible):用符号 S(t) 来表示;
  • 感染者(infective):用符号 I(t) 来表示;
  • 康复者(Recoverd):用符号 R(t) 来表示;

其次,在时间戳 t 上,总人口是 N(t)=S(t)+I(t)+R(t)。如果暂时不考虑人口增加和死亡的情况,那么 N(t)\equiv N 是一个恒定的常数值。

除此之外,

  • r 表示在单位时间内感染者接触到的易感者人数;
  • 传染率:\beta 表示感染者接触到易感者之后,易感者得病的概率;
  • 康复率:\gamma 表示感染者康复的概率,有可能变成易感者(可再感染),也有可能变成康复者(不再感染)。

在进行下面的分析之前,先讲一个常微分方程的解。

Claim. 假设 x=x(t) 是关于 t 的一个方程,且满足 \frac{dx}{dt} + a_{1}x + a_{2}x^{2}=0x(0)=x_{0},那么它的解是:x(t) = \frac{e^{-a_{1}t}}{\frac{1}{x_{0}}-\frac{a_{2}}{a_{1}}(e^{-a_{1}t}-1)}.

Proof. 证明如下:

通过 \frac{dx}{dt}+a_{1}x+a_{2}x^{2}=0 可以得到 -\frac{d}{dt}\bigg(\frac{1}{x}\bigg) + a_{1}\bigg(\frac{1}{x}\bigg)+a_{2}=0;令 y = 1/x,得到 \frac{dy}{dt}-a_{1}y=a_{2}。所以,\frac{d}{dt}(e^{-a_{1}t}y) = a_{2}e^{-a_{1}t},两边积分可以得到 e^{-a_{1}t}y-y_{0}=\bigg(-\frac{a_{2}}{a_{1}}\bigg)(e^{-a_{1}t}-1),其中 y_{0}=1/x_{0}。求解之后得到:x(t) = e^{-a_{1}t}/\bigg(\frac{1}{x_{0}}-\frac{a_{2}}{a_{1}}(e^{-a_{1}t}-1)\bigg)

SI 模型(Susceptible-Infective Model)

在 SI 模型里面,只考虑了易感者和感染者,并且感染者不能够恢复,此类病症有 HIV 等;

SI_model_1
SI Model

其微分方程就是:

\begin{cases}\frac{dS}{dt} = -\frac{r\beta I}{N} S \\ \frac{dI}{dt}=\frac{r\beta I}{N}S \end{cases}

初始条件就是 S(0)=S_{0}I(0) = I_{0},并且 S(t)+I(t)=N 对于所有的 t\geq 0 都成立。

于是,把 S = N - I 代入第二个微分方程可以得到:\frac{dI}{dt} - r\beta I + \frac{r\beta}{N}I^{2}=0。因此根据前面所提到的常微分方程的解可以得到:

I(t) = \frac{NI_{0}}{I_{0}+(N-I_{0})e^{-r\beta t}}.

这个就是所谓的逻辑回归函数,而在机器学习领域,最简单的逻辑回归函数就是 \sigma(x) = 1/(1+e^{-x}) 这个定义。而 I(t) 只是做了一些坐标轴的平移和压缩而已。由于 \lim_{t\rightarrow +\infty}e^{-t}=0,所以,\lim_{t\rightarrow +\infty}I(t) = N,从而 \lim_{t\rightarrow +\infty}S(t) = 0

通过数值模拟可以进一步知道:

SI_model_graph_1
SI model 的数值模拟(一)

简单来看,在 SI 模型的假设下,全部人群到最后都会被感染。

SIS 模型(Susceptible-Infectious-Susceptible Model)

除了 HIV 这种比较严重的病之外,还有很多小病是可以恢复并且反复感染的,例如日常的感冒,发烧等。在这种情况下,感染者就有一定的几率重新转化成易感者。如下图所示:

SIS_model_1
SIS model

其微分方程就是:

\begin{cases} \frac{dS}{dt} = -r \beta S\frac{I}{N} + \gamma I \\ \frac{dI}{dt}=r\beta S \frac{I}{N} - \gamma I \end{cases},其初始条件就是 S(0)=S_{0}I(0)=I_{0}.

使用同样的方法,把 S=N-I 代入第二个微分方程可以得到:\frac{dI}{dt} - (r\beta - \gamma)I + \frac{r\beta}{N}I^{2}=0. 通过之前的 Claim 可以得到解为:

I(t) = \frac{N(r\beta-\gamma)}{r\beta}/\bigg(\bigg(\frac{N(r\beta-\gamma)}{I_{0}r\beta}-1\bigg)e^{-(r\beta-\gamma)t}+1\bigg).

从而可以得到 \lim_{t\rightarrow +\infty} I(t) = N(r\beta - \gamma)/(r\beta)\lim_{t\rightarrow +\infty} S(t) = (N\gamma)/(r\beta). 这个方程同样也是逻辑回归方程,只是它的渐近线与之前的 SI 模型有所不同。

SIS_model_graph_1
SIS model 的数值模拟(二)

SIR 模型(Susceptible-Infectious-Recovered Model)

有的时候,感染者在康复了之后,就有了抗体,于是后续就不再会获得此类病症,这种时候,考虑 SIS 模型就不合适了,需要考虑 SIR 模型。此类病症有麻疹,腮腺炎,风疹等。

SIR_model_1
SIR model

其微分方程是:\begin{cases} \frac{dS}{dt}=-r\beta S \frac{I}{N} \\ \frac{dI}{dt}=r\beta S\frac{I}{N} - \gamma I \\ \frac{dR}{dt}=\gamma I\end{cases}。其初始条件是 S(0)=S_{0}, I(0)=I_{0}, R(0)=R_{0},并且 S(t), I(t), R(t)\geq 0S(t) +I(t)+R(t)=N 对于所有的 t\geq 0 都成立。

对于这类方程,就不能够得到其解析解了,只能够从它的动力系统开始进行分析,得到解的信息。根据第一个微分方程可以得到:\frac{dS}{dt} = -r\beta S\frac{I}{N}<0,于是 S(t) 是一个严格递减函数。同时,0\leq S(t)\leq N 对于所有的 t\geq 0 都成立,于是存在 S_{\infty}\in[0,\infty] 使得 \lim_{t\rightarrow \infty}S(t)=S_{\infty}.

通过第一个微分方程和第二个微分方程可以得到:\frac{d(S+I)}{dt} = -\gamma I,因此对它两边积分得到 \int_{0}^{T} \frac{d(S+I)}{dt} = -\gamma \int_{0}^{T}I(t)dt. 左侧等于 S(T) + I(T) - S(0) - I(0),上界是 4N,因此令 T\rightarrow \infty 可以得到 \int_{0}^{\infty}I(t) dt\leq 4N/\gamma. 而 I(t)\geq 0 且是连续可微函数,因此 \lim_{t\rightarrow \infty}I(t) = 0。这意味着所有的感染人群都将康复。

由于 S(t) 是严格单调递减函数,因此从第二个微分方程可以得到:当 S(t) = N\gamma/(r\beta) 时,感染人数 I(t) 达到最大值。

SIR_model_graph_1
SIR model 的数值模拟(一)
SIR_model_graph_2
SIR model 的数值模拟(二)

其余模型

在以上的 SI,SIS,SIR 模型中,还可以把死亡因素考虑进去。除此之外,还有 SIRS 模型,SEIR 模型等,在这里就不再做赘述。有兴趣的读者可以参阅相关的参考书籍。

参考文献

  1. Introduction to SEIR Models, Nakul Chitnis, Workshop on Mathematical Models of Climate Variability, Environmental Change and Infectious Diseases, Trieste, Italy, 2017

 

符号计算中的深度学习方法

符号计算

符号计算一直是计算数学的重要领域之一。在开源领域,Python 的 SymPy 就可以支持符号计算。在商业化领域,Maple,Matlab,Mathematica 都能够进行符号计算。它们不仅能够做简单的实数和复数加减乘除,还能够支持数学分析,线性代数,甚至各种各样的大学数学课程。

随着人工智能的进一步发展,深度学习不仅在图像识别,自然语言处理方向上发挥着自身的价值,还在各种各样的领域展示着自己的实用性。在 2019 年底,facebook 两位研究员在 arxiv 上挂出了一篇文章《Deep Learning for Symbolic Mathematics》,在符号计算方向上引入了深度学习的工具。

要想了解符号运算,就要先知道在计算机中,是怎么对数学公式进行表示的。较为常见的表达式形如:

  • 2 + 3 * (5 + 2)
  • 3x^{2}+\cos(2x)+1
  • \frac{\partial^{2}\psi}{\partial x^{2}} - \frac{1}{v^{2}}\frac{\partial^{2}\psi}{\partial t^{2}}

在这里,数学表达式通常都会被表示成树的结构,其中树的内部节点是由算子(operator),函数(function)组成的,叶子节点由数字,变量,函数等组成。例如:

dlsm_figure1.png
图 1

图 1 的三幅图分别对应着上面的三个数学表达式。

在 Python 的 SymPy 工具中,同样可以对数学公式进行展示。其表示方法就是用 sympy.srepr

>>> import sympy
>>> x, y = sympy.symbols("x y")
>>> expr = sympy.sin(x+y) + x**2 + 1/y - 10
>>> sympy.srepr(expr)
"Add(Pow(Symbol('x'), Integer(2)), sin(Add(Symbol('x'), Symbol('y'))), Integer(-10), Pow(Symbol('y'), Integer(-1)))"
>>> expr = sympy.sin(x*y)/2 - x**2 + 1/y
>>> sympy.srepr(expr)
"Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Rational(1, 2), sin(Mul(Symbol('x'), Symbol('y')))), Pow(Symbol('y'), Integer(-1)))"
dlsm_figure2.png
图 2

SymPy 的 srepr 函数的输出用树状结构来表示就是形如图 2 这种格式。叶子节点要么是 x,y 这种变量,要么是 -1 和 2 这种整数。对于一元函数而言,例如 sin 函数,就是对应唯一的一个叶子。对于二元函数而言,例如 pow,mul,add,则是对应两个叶子节点。

论文方案

在 Deep Learning for Symbolic Mathematics 这篇论文中,作者们的大致思路是分成以下几步的:

  1. 生成数据;
  2. 训练模型;
  3. 预测结果;

第一步生成数据是为了让深度学习模型是大量的已知样本来做训练;第二步训练模型是用第一步的数据把端到端的深度学习模型进行训练;第三步预测结果是给一个函数或者一个微分方程,使用已经训练好的模型来预测结果,对预测出来的多个结果进行排序,选择最有可能的那个结果作为符号计算的值。

众所周知,深度学习的训练是依赖大量的样本数据的,那么要想用深度学习来解决符号计算的问题,就要解决样本少的问题。在这篇论文中,作者们把精力投入了三个领域,分别是:

  1. 函数的积分;
  2. 一阶常微分方程;
  3. 二阶常微分方程。

在生成数据之前,作者们对数据的范围进行了必要的限制:

  1. 数学表达式最多拥有 15 个内部节点;
  2. L = 11 表示叶子节点的值只有 11 个,分别是变量 x\{-5,-4,-3,-2,-1,1,2,3,4,5\}
  3. p_{1} = 15 表示一元计算只有 15 个,分别是 \exp, \log, \sqrt, \sin, \cos, \tan, \arcsin, \arccos, \arctan, sinh, cosh, tanh, arcsinh, arccosh, arctanh
  4. p_{2} = 4 表示二元计算只有四个,分别是 +, -, *, /;

意思就是在这个有限的范围内去生成深度学习所需要的数据集。

积分数据的生成

在微积分里面,积分指的是求导的逆运算,那么形如 (f',f) 的表达式就可以作为深度学习的积分训练数据。生成积分的话其实有多种方法:

第一种方法:前向生成(Forward Generation,简写为 FWD)。主要思路就是在以上的数据范围内随机生成各种各样的方程 f,然后使用 SymPy 或者 Mathematica 等工具来计算函数 f 的积分 F,那么 (f,F) 就可以作为一个训练集。当然,有的时候函数 f 的积分是无法计算出来的,那么这种计算表达式就需要进行放弃,就不能放入训练集。

第二种方法:反向生成(Backward Generation,简写为 BWD)。由于积分是求导的逆运算,可以在以上的数据范围内随机生成各种各样的方程 f,然后计算它们的导数 f',于是 (f',f) 就可以放入积分数据的训练集。

第三种方法:分部积分(Backward generation with integration by parts,简写为 IBP)。根据分部积分的公式,如果 F'=f, G'=g,那么 \int F(x)g(x)dx=F(x)G(x) - \int f(x)G(x)dx。对于两个随机生成的函数 F, G,可以计算出它们的导数 f, g。如果 fG 在训练集合里面,那么就把 Fg 的积分计算出来放入训练集合;反之,如果 Fg 在训练集合里面,那么就把 fG 的积分计算出来放入训练集合。如果 fGFg 都没有在训练集合,并且都无法积分出来,那么就放弃该条数据。

三种方法的比较可以参见表 1,从表 1 可以看出通过分部积分(Integration by parts)所获得的样本表达式相对于前向生成和反向生成都比较长。

dlsm_table1.png
表 1

一阶常微分方程的生成

一阶常微分方程只有该函数的一阶导数,因此在构造函数的时候,作者们用了一个技巧。在随机生成表达式的时候,叶子节点的元素只从 \{x, -5,-4,-3,-2,-1,1,2,3,4,5\} 选择一个,于是随机把其中的一个整数换成变量 c。例如:在 x\log(2/x) 中就把 2 换成 c,于是得到了一个二元函数 f(x,c) = x\log(c/x)。那么就执行以下步骤:

  1. 生成二元函数 f(x,c) = x\log(c/x)
  2. 求解 c,得到 c = xe^{f(x)/x}
  3. x 进行求导得到 0 = e^{f(x)/x}(1+f'(x)-f(x)/x) = 0
  4. 简化后得到 x+xf'(x) - f(x) =0,也就是 x+xy'-y=0

此时,一阶常微分方程的训练数据就是 (x+xy'-y=0, x\log(c/x))

二阶常微分方程不仅可能由该函数的一阶导数,还必须有二阶导数,那么此时就要求导两次:

  1. 生成三元函数 f(x,c_{1},c_{2}) = c_{1}e^{x}+c_{2}e^{-x}
  2. 求解 c_{2} 得到 c_{2} = f(x,c_{1},c_{2}) e^{x}- c_{1}e^{2x}
  3. x 进行求导得到 0 = e^{x}(\partial f(x,c_{1},c_{2})/\partial x + f(x,c_{1},c_{2})) - 2c_{1}e^{2x} = 0
  4. 求解 c_{1} 得到 c_{1} = e^{-x}(\partial f(x,c_{1},c_{2})/\partial x+f(x))/2
  5. x 进行求导得到 0 = e^{-x}(\partial^{2} f(x,c_{1},c_{2})/\partial x^{2} - f(x,c_{1},c_{2}))=0
  6. 简化后得到 \partial^{2} f(x,c_{1},c_{2})/\partial x^{2} - f(x,c_{1},c_{2})=0,也就是 y''-y=0

那么此时的二阶微分方程的训练数据就是 (y''-y=0, c_{1}e^{x}+c_{2}e^{-x})

需要注意的事情就是,在生成数据的时候,一旦无法求出 c_{1}, c_{2} 的表达式,该数据就需要放弃,重新生成新的数据。

数据处理

  1. 数学表达式的简化(expression simplification):例如 x+1+1 可以简化成 x+2\sin^{2}(x)+\cos^{2}(x) 可以简化成 1。
  2. 参数的简化(coefficient simplification):例如 \log(x^{2}) + c\log(x) 可以简化成 c\log(x)
  3. 无效表达式的过滤(invalid expression filter):例如 \sqrt{2}, \log(0) 等。

树状结构的表达式,是使用前缀表达式来写成一个句子的。例如 2+3 就写成 + 2 3,2 + x 就写成 + 2 x。

模型训练

在这里,作者们用了 Transformer 模型,8 attention heads,6 layers,512 个维度,并且发现用更复杂的模型并没有提升其效果。在预测的时候,使用不同的 Beam Size,其准确率是不一样的,在 Beam Size = 50 的时候,效果比较好。参见表 2。

dlsm_table2.png
表 2

在与其他数学软件的比较中, 作者限制了 Mathematica 的运行时间为 30s。

dlsm_table3.png

并且举出了几个现有模型能够计算出来,Mathematica 无法计算的例子。

dlsm_table4.png

在求解的等价性方面,可以根据 Score 逆序排列,然后这个例子的 Top10 都是等价的。

dlsm_table5.png

在使用 SymPy 的过程中,可以获得各种各样的积分表达式如下:

dlsm_table7.png

结论

符号计算在 1960 年代末就已经在研究了,有诸多的符号计算软件,例如 Matlab,Mathematica,Maple,PARI,SAGE 等。在这篇论文中,作者们使用标准的 seq2seq 模型来对生成的数据进行训练,然后获得积分,一阶常微分方程,二阶常微分方程的解。在传统符号计算的基础上,开拓了一种新的思路。

用 Python 来研究数学 — SymPy 符号工具包介绍

SymPy 的简单介绍

SymPy 是一个符号计算的 Python 库,完全由 Python 写成,为许多数值分析,符号计算提供了重要的工具。SymPy 的第一个版本于 2007 年开源,并且经历了十几个版本的迭代,在 2019 年已经基于修正的 BSD 许可证开源了 1.4 版本。SymPy 的开源地址和官方网站分别是:

  1. GitHub 链接:https://github.com/sympy/sympy
  2. SymPy 官方网站:https://www.sympy.org/en/index.html
sympy_logo
SymPy 的 logo

SymPy 的 1.4 版本文档中,可以看出,SymPy 可以支持很多初等数学,高等数学,甚至研究生数学的符号计算。在初等数学和高等数学中,SymPy 可以支持的内容包括但不限于:

  1. 基础计算(Basic Operations);
  2. 公式简化(Simplification);
  3. 微积分(Calculus);
  4. 解方程(Solver);
  5. 矩阵(Matrices);
  6. 几何(geometry);
  7. 级数(Series);

在更多的数学领域中,SymPy 可以支持的内容包括但不限于:

  1. 范畴论(Category Theory);
  2. 微分几何(Differential Geometry);
  3. 常微分方程(ODE);
  4. 偏微分方程(PDE);
  5. 傅立叶变换(Fourier Transform);
  6. 集合论(Set Theory);
  7. 逻辑计算(Logic Theory)。
sympy_tutorial
SymPy 的教学目录

SymPy 的工具库介绍

SymPy 的基础计算

在数学中,基础的计算包括实数和复数的加减乘除,那么就需要在程序中描述出实数与复数。著名的欧拉公式

e^{i\pi}+1 = 0

正好用到了数学中最常见的五个实数。在 SymPy 里面,e, i, \pi, \infty 是用以下符号来表示的:其中 sympy.exp() 表示以 e 为底的函数。

sympy.exp(1), sympy.I, sympy.pi, sympy.oo

而想要计算欧拉公式的话,只需要输入下面的公式即可:

>>> sympy.exp(sympy.I * sympy.pi) + 1
0

如果需要看 e, \pi 的小数值,可以使用 evalf() 函数,其中 evalf() 函数里面的值表示有效数字的位数。例如下面就是精确到 10 位有效数字。当然,也可以不输入。

>>> sympy.E.evalf(10)
2.718281828
>>> sympy.E.evalf()
2.71828182845905
>>> sympy.pi.evalf(10)
3.141592654
>>> sympy.pi.evalf()
3.14159265358979

除此之外,如果需要查看某个实数的有效数字,也是类似操作的:

>>> expr = sympy.sqrt(8)
>>> expr.evalf()
2.82842712474619

而对于实数的加减乘除,则可以如下操作:

>>> x, y= sympy.symbols("x y")
>>> x + y
x + y
>>> x - y
x - y
>>> x * y
x*y
>>> x / y
x/y

而对于复数的加减乘除,则是类似的操作,令两个复数分别是 z_{1} = x_{1} + i y_{1}z_{2} = x_{2} + i y_{2}

>>> x1, y1, x2, y2 = sympy.symbols("x1 y1 x2 y2")
>>> z1 = x1 + y1 * sympy.I
x1 + I*y1
>>>  z2 = x2 + y2 * sympy.I
x2 + I*y2
>>> z1 + z2
x1 + x2 + I*y1 + I*y2
>>> z1 - z2
x1 - x2 + I*y1 - I*y2
>>> z1 * z2
(x1 + I*y1)*(x2 + I*y2)
>>> z1 / z2
(x1 + I*y1)/(x2 + I*y2)

对于多项式而言,有的时候我们希望将其展开,有的时候则需要将其合并,最终将其简化成最简单的形式。

>>> sympy.expand((x+1)**2)
x**2 + 2*x + 1
>>> sympy.expand((x+1)**5)
x**5 + 5*x**4 + 10*x**3 + 10*x**2 + 5*x + 1
>>> sympy.factor(x**3+1)
(x + 1)*(x**2 - x + 1)
>>> sympy.factor(x**2+3*x+2)
(x + 1)*(x + 2)
>>> sympy.simplify(x**2 + x + 1 - x)
x**2 + 1
>>> sympy.simplify(sympy.sin(x)**2 + sympy.cos(x)**2)
1

在多变量的场景下,SymPy 也可以对其中的某个变量合并同类项,同时还可以计算某个变量的某个次数所对应的系数是多少,例如:

>>> expr = x*y + x - 3 + 2*x**2 - x**2 + x**3 + y**2 + x**2*y**2
>>> sympy.collect(expr,x)
x**3 + x**2*(y**2 + 1) + x*(y + 1) + y**2 - 3
>>> sympy.collect(expr,y)
x**3 + x**2 + x*y + x + y**2*(x**2 + 1) - 3
>>> expr.coeff(x, 2)
y**2 + 1
>>> expr.coeff(y, 1)
x

有理函数形如 f(x) = p(x)/q(x),其中 p(x)q(x) 都是多项式。一般情况下,我们希望对有理函数进行简化,合并或者分解的数学计算。

在需要合并的情形下,如果想把有理函数处理成标准格式 p(x)/q(x) 并且去除公因子,那么可以使用 cancel 函数。另一个类似的就是 together 函数,但是不同之处在于 cancel 会消除公因子,together 不会消除公因子。例如:

expr = \frac{x^{2}+3x+2}{x^{2}+x}

>>> expr = (x**2 + 3*x + 2)/(x**2 + x)
>>> sympy.cancel(expr)
(x + 2)/x
>>> sympy.together(expr)
(x**2 + 3*x + 2)/(x*(x + 1))

除了合并和消除公因子之外,有的时候还希望对分子和分母进行因式分解,例如:

expr = (x**2 + 3*x + 2)/(x**2 + x)
>>> sympy.factor(expr)
(x + 2)/x
>>> expr = (x**3 + 3*x**2 + 2*x)/(x**5+x)
>>> sympy.factor(expr)
(x + 1)*(x + 2)/(x**4 + 1)
>>> expr = x**2 + (2*x+1)/(x**3+1)
>>> sympy.factor(expr)
(x**5 + x**2 + 2*x + 1)/((x + 1)*(x**2 - x + 1))

合并的反面就是部分分式展开(Partial Fraction Decomposition),它是把有理函数分解成多个次数较低的有理函数和的形式。这里需要用 apart 函数:

>>> expr = (x**4 + 3*x**2 + 2*x)/(x**2+x)
>>> sympy.apart(expr)
x**2 - x + 4 - 2/(x + 1)
>>> expr = (x**5 + 1)/(x**3+1)
>>> sympy.apart(expr)
x**2 - (x - 1)/(x**2 - x + 1)

在 SymPy 里面,同样支持各种各样的三角函数,例如:三角函数的简化函数 trigsimp,三角函数的展开 expand_trig,

>>> expr = sympy.sin(x)**2 + sympy.cos(x)**2
>>> sympy.trigsimp(expr)
1
>>> sympy.expand_trig(sympy.sin(x+y))
sin(x)*cos(y) + sin(y)*cos(x)
>>> sympy.expand_trig(sympy.cos(x+y))
-sin(x)*sin(y) + cos(x)*cos(y)
>>> sympy.trigsimp(sympy.sin(x)*sympy.cos(y) + sympy.sin(y)*sympy.cos(x))
sin(x + y)
>>> sympy.trigsimp(-sympy.sin(x)*sympy.sin(y) + sympy.cos(x)*sympy.cos(y))
cos(x + y)

同样的,在乘幂上面,同样有简化函数 powsimp,效果与之前提到的 simplify 一样。除此之外,还可以根据底数来做合并,即分别使用 expand_power_exp 函数与 expand_power_base 函数。

>>> sympy.powsimp(x**z*y**z*x**z)
x**(2*z)*y**z
>>> sympy.simplify(x**z*y**z*x**z)
x**(2*z)*y**z
>>> sympy.expand_power_exp(x**(y + z))
x**y*x**z
>>> sympy.expand_power_base(x**(y + z))
x**(y + z)

作为指数的反函数对数,sympy 也是有着类似的展开合并函数,expand_log,logcombine 承担了这样的角色。

\ln(xy) = \ln(x) + \ln(y)

\ln(x/y) = \ln(x) - \ln(y)

>>> sympy.expand_log(sympy.log(x*y), force=True)
log(x) + log(y)
>>> sympy.expand_log(sympy.log(x/y), force=True)
log(x) - log(y)

 

SymPy 的微积分工具

下面,我们会从一个最基本的函数 f(x) = 1/x 出发,来介绍 SymPy 的各种函数使用方法。如果想进行变量替换,例如把 x 变成 y,那么可以使用 substitution 方法。除此之外,有的时候也希望能够得到函数 f 在某个点的取值,例如 f(1) = 1/1 = 1,那么可以把参数换成 1 即可得到函数的取值。例如,

>>> import sympy
>>> x = sympy.Symbol("x")
>>> f = 1 / x
1/x
>>> y = sympy.Symbol("y")
>>> f = f.subs(x,y)
1/y
>>> f = f.subs(y,1)
1

在微积分里面,最常见的概念就是极限,SymPy 里面的极限函数就是 limit。使用方法如下:

>>> f = 1/x
>>> sympy.limit(f,x,0)
oo
>>> sympy.limit(f,x,2)
1/2
>>> sympy.limit(f,x,sympy.oo)
0
>>> g = x * sympy.log(x)
>>> sympy.limit(g,x,0)
0

对于函数 f(x) = 1/x 而言,它的导数计算函数是 diff,n 阶导数也可以用这个函数算。

>>> f = 1/x
>>> sympy.diff(f,x)
-1/x**2
>>> sympy.diff(f,x,2)
2/x**3
>>> sympy.diff(f,x,3)
-6/x**4
>>> sympy.diff(f,x,4)
24/x**5

提到 n 阶导数,就必须要提一下 Taylor Series 了。对于常见函数的 Taylor Series,SymPy 也是有非常简便的方法,那就是 series 函数。其参数包括 expr, x, x0, n, dir,分别对应着表达式,函数的自变量,Taylor Series 的中心点,n 表示阶数,dir 表示方向,包括”+-“,”-“,”+”,分别表示 x\rightarrow x0, x\rightarrow x0^{-}, x\rightarrow x0^{+}

sympy.series.series.series(exprx=Nonex0=0n=6dir='+') >>> g = sympy.cos(x) >>> sympy.series(g, x) 1 - x**2/2 + x**4/24 + O(x**6) >>> sympy.series(g, x, x0=1, n=10) cos(1) - (x - 1)*sin(1) - (x - 1)**2*cos(1)/2 + (x - 1)**3*sin(1)/6 + (x - 1)**4*cos(1)/24 - (x - 1)**5*sin(1)/120 - (x - 1)**6*cos(1)/720 + (x - 1)**7*sin(1)/5040 + (x - 1)**8*cos(1)/40320 - (x - 1)**9*sin(1)/362880 + O((x - 1)**10, (x, 1))

积分的计算函数是 integrate,包括定积分与不定积分:

\int\frac{1}{x}dx = \ln(x)+C

\int_{1}^{2}\frac{1}{x}dx = \ln(2)

>>> f = 1/x
>>> sympy.integrate(f,x)
log(x)
>>> sympy.integrate(f, (x,1,2))
log(2)

对于广义积分而言,就需要用到 \infty 这个概念了,但是在 SymPy 里面的写法还是一样的。

\int_{-\infty}^{0}e^{-x^{2}}dx=\frac{\sqrt{\pi}}{2}

\int_{0}^{+\infty}e^{-x}dx = 1

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

>>> g = sympy.exp(-x**2)
>>> sympy.integrate(g, (x,-sympy.oo,0))
sqrt(pi)/2
>>> g = sympy.exp(-x)
>>> sympy.integrate(g, (x, 0, sympy.oo))
1
>>> h = sympy.exp(-x**2 - y**2)
>>> sympy.integrate(h, (x,-sympy.oo, sympy.oo), (y, -sympy.oo, sympy.oo))
pi

 

SymPy 的方程工具

在初等数学中,通常都存在一元一次方程,一元二次方程等,并且在不同的域上有着不同的解。SymPy 里面的相应函数就是 solveset,根据定义域的不同,可以获得完全不同的解。

\{x\in\mathbb{R}: x^{3}-1=0\}

\{x\in\mathbb{C}:x^{3}-1=0\}

\{x\in\mathbb{R}:e^{x}-x=0\}

\{x\in\mathbb{R}:e^{x}-1=0\}

\{x\in\mathbb{C}:e^{x}-1=0\}

>>> sympy.solveset(sympy.Eq(x**3,1), x, domain=sympy.S.Reals)
{1}
>>> sympy.solveset(sympy.Eq(x**3,1), x, domain=sympy.S.Complexes)
{1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2}
>>> sympy.solveset(sympy.Eq(x**3 - 1,0), x, domain=sympy.S.Reals)
{1}
>>> sympy.solveset(sympy.Eq(x**3 - 1,0), x, domain=sympy.S.Complexes)
{1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2}
>>> sympy.solveset(sympy.exp(x),x)
EmptySet()
>>> sympy.solveset(sympy.exp(x)-1,x,domain=sympy.S.Reals)
{0}
>>> sympy.solveset(sympy.exp(x)-1,x,domain=sympy.S.Complexes)
ImageSet(Lambda(_n, 2*_n*I*pi), Integers)

在这里,Lambda 表示的是数学公式,第一个是自变量,第二个是函数,最后是自变量的定义域。

在线性代数中,最常见的还是多元一次方程组,那么解法是一样的:

\begin{cases}x+y-10=0 \\ x-y-2=0\end{cases}

>>> sympy.solve([x+y-10, x-y-2], [x,y])
{x: 6, y: 4}

对于三角函数,也是类似的写法:

\begin{cases} \sin(x-y)=0 \\ \cos(x+y)=0 \end{cases}

>>> sympy.solve([sympy.sin(x-y), sympy.cos(x+y)], [x,y])
[(-pi/4, 3*pi/4), (pi/4, pi/4), (3*pi/4, 3*pi/4), (5*pi/4, pi/4)]

 

SymPy 的矩阵工具

在矩阵论中,最常见的就是单位矩阵了,而单位矩阵只与一个参数有关,那就是矩阵的大小。下面就是 3*3,3*2,2*3 大小的矩阵。

>>> sympy.eye(3)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> sympy.eye(3,2)
Matrix([
[1, 0],
[0, 1],
[0, 0]])
>>> sympy.eye(2,3)
Matrix([
[1, 0, 0],
[0, 1, 0]])

另外还有全零和全一矩阵,意思就是矩阵中的所有值全部是零和一。

>>> sympy.ones(2,3)
Matrix([
[1, 1, 1],
[1, 1, 1]])
>>> sympy.zeros(3,2)
Matrix([
[0, 0],
[0, 0],
[0, 0]])

而对角矩阵也可以使用 diag 轻松获得:

>>> sympy.diag(1,1,2)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 2]])

而矩阵的加法,减法,乘法,逆运算,转置,行列式,SymPy 都是可以支持的:

A = \left(\begin{array}{cc} 1 & 1 \\ 0 & 2 \end{array}\right)

B = \left(\begin{array}{cc} 1 & 0 \\ 1 & 1 \end{array}\right)

>>> A = sympy.Matrix([[1,1],[0,2]])
>>> B = sympy.Matrix([[1,0],[1,1]])
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> B
Matrix([
[1, 0],
[1, 1]])
>>> A + B
Matrix([
[2, 1],
[1, 3]])
>>> A - B
Matrix([
[ 0, 1],
[-1, 1]])
>>> A * B
Matrix([
[2, 1],
[2, 2]])
>>> A * B**-1
Matrix([
[ 0, 1],
[-2, 2]])
>>> B**-1
Matrix([
[ 1, 0],
[-1, 1]])
>>> A.T
Matrix([
[1, 0],
[1, 2]])
>>> A.det()
2

在某些情况下,需要对矩阵进行加上一行或者加上一列的操作,在这里就可以使用 row_insert 或者 col_insert 函数:第一个参数表示插入的位置,第二个参数就是相应的行向量或者列向量。而在删除上就很简单了,直接使用 row_del 或者 col_del 即可。

>>> A
Matrix([
[1, 1],
[0, 2]])
>>> A.row_insert(1, sympy.Matrix([[10,10]]))
Matrix([
[ 1, 1],
[10, 10],
[ 0, 2]])
>>> A.col_insert(0, sympy.Matrix([3,3]))
Matrix([
[3, 1, 1],
[3, 0, 2]])
>>> A.row_del(0)
>>> A
Matrix([[0, 2]])
>>> A.col_del(1)
>>> A
Matrix([[0]])

在对角化方面,同样可以使用 eigenvals(),eigenvecs(), diagonalize() 函数:

>>> A
Matrix([
[1, 1],
[0, 2]])
>>> A.eigenvals()
{2: 1, 1: 1}
>>> A.eigenvects()
[(1, 1, [Matrix([
[1],
[0]])]), (2, 1, [Matrix([
[1],
[1]])])]
>>> A.diagonalize()
(Matrix([
[1, 1],
[0, 1]]), Matrix([
[1, 0],
[0, 2]]))

在 eigenvals() 返回的结果中,第一个表示特征值,第二个表示该特征值的重数。在特征向量 eigenvecs() 中,第一个表示特征值,第二个表示特征值的重数,第三个表示特征向量。在对角化 diagonalize() 中,第一个矩阵表示 P,第二个矩阵表示 DA = P*D*P^{-1}

在矩阵中,最常见的还是多元一次方程的解。如果要求 Ax =b 的解,可以有以下方案:

>>> A = sympy.Matrix([[1,1],[0,2]])
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> b = sympy.Matrix([3,5])
>>> b
Matrix([
[3],
[5]])
>>> A**-1*b
Matrix([
[1/2],
[5/2]])
>>> sympy.linsolve((A,b))
{(1/2, 5/2)}
>>> sympy.linsolve((A,b),[x,y])
{(1/2, 5/2)}

 

SymPy 的集合论工具

集合论可以说是数学的基础,在任何数学的方向上都能够看到集合论的身影。在 SymPy 里面,有一个类叫做 sympy.sets.sets.set。在集合论里面,常见的就是边界,补集,包含,并集,交集等常见的操作。但是感觉 SymPy 中的集合论操作主要集中在实数域或者复数域上。

对于闭区间 I=[0,1] 和开区间 J = (0,1) 而言,在 SymPy 中使用以下方法来表示:

I = sympy.Interval(0,1)
J = sympy.Interval.open(0,1)
K = sympy.Interval(0.5,2)

其开始和结束的点可以分别使用 start 和 end 来表示:

>>> I.start
0
>>> I.end
1

其长度用 measure 来表示:

>>> I.measure
1

其闭包用 closure 来表示:

>>> I.closure
Interval(0, 1)

其内点用 interior 来表示:

>>> I.interior
Interval.open(0, 1)

判断其边界条件可以使用 left_open 或者 right_open 来做:

>>> I.left_open
False
>>> I.right_open
False

对于两个集合之间的操作,可以参考以下方法:

I = sympy.Interval(0,1)
K = sympy.Interval(0.5,2)
>>> I.intersect(K)
Interval(0.500000000000000, 1)
>>> I.union(K)
Interval(0, 2)
>>> I-K
Interval.Ropen(0, 0.500000000000000)
>>> K-I
Interval.Lopen(1, 2)
>>> I.symmetric_difference(K)
Union(Interval.Ropen(0, 0.500000000000000), Interval.Lopen(1, 2))

实数集 \mathbb{R} 在 SymPy 中用 sympy.S.Reals 来表示,自然数使用 sympy.S.Naturals,非负整数用 sympy.S.Naturals0,整数用 sympy.S.Integers 来表示。补集的计算可以用减号,也可以使用 complement 函数。

>>> sympy.S.Reals
Reals
>>> sympy.S.Reals-I
Union(Interval.open(-oo, 0), Interval.open(1, oo))
>>> I.complement(sympy.S.Reals)
Union(Interval.open(-oo, 0), Interval.open(1, oo))
>>> sympy.S.Reals.complement(I)
EmptySet()
>>> I.complement(K)
Interval.Lopen(1, 2)
>>> I.complement(sympy.S.Reals)
Union(Interval.open(-oo, 0), Interval.open(1, oo))

 

SymPy 的逻辑工具

在逻辑运算中,我们可以使用 A, B, C 来代表元素。&, |, ~, >> 分别表示 AND,OR,NOT,imply。而逻辑运算同样可以使用 sympy.simplify_logic 简化。

A, B, C = sympy.symbols("A B C")
>>> sympy.simplify_logic(A | (A & B))
A
>>> sympy.simplify_logic((A>>B) & (B>>A))
(A & B) | (~A & ~B)
>>> A>>B
Implies(A, B)

 

SymPy 的级数工具

SymPy 的级数工具有一部分放在具体数学(Concrete Mathematics)章节了。有的时候,我们希望计算某个级数是发散的,还是收敛的,就可以使用 is_convergence 函数。考虑最常见的级数:

\sum_{n=1}^{\infty}\frac{1}{n} = +\infty

\sum_{n=1}^{\infty}\frac{1}{n^{2}} = \frac{\pi^{2}}{6}

>>> n = sympy.Symbol("n", integer=True)
>>> sympy.Sum(1/n, (n,1,sympy.oo)).is_convergent()
False
>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).is_convergent()
True

如果想计算出收敛级数的值,加上 doit() 函数即可;如果想计算有效数字,加上 evalf() 函数即可。

>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).evalf()
1.64493406684823
>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).doit()
pi**2/6
>>> sympy.Sum(1/n**3, (n,1,sympy.oo)).evalf()
1.20205690315959
>>> sympy.Sum(1/n**3, (n,1,sympy.oo)).doit()
zeta(3)

除了加法之外,SymPy 也支持连乘,其符号是 sympy.Product,考虑

\prod_{n=1}^{+\infty}\frac{n}{n+1}

\prod_{n=1}^{+\infty}\cos\left(\frac{\pi}{n}\right)

>>> sympy.Product(n/(n+1), (n,1,sympy.oo)).is_convergent()
False
>>> sympy.Product(sympy.cos(sympy.pi/n), (n, 1, sympy.oo)).is_convergent()
True

 

SymPy 的 ODE 工具

在常微分方程(Ordinary Differential Equation)中,最常见的就是解方程,而解方程主要是靠 dsolve 函数。例如想求解以下的常微分方程:

df/dx + f(x) = 0,

d^{2}f/dx^{2} + f(x) = 0

d^{3}f/dx^{3} + f(x) = 0

可以使用 dsolve 函数:

>>> f = sympy.Function('f')
>>> sympy.dsolve(sympy.Derivative(f(x),x) + f(x), f(x))
Eq(f(x), C1*exp(-x))
>>> sympy.dsolve(sympy.Derivative(f(x),x,2) + f(x), f(x))
Eq(f(x), C1*sin(x) + C2*cos(x))
>>> sympy.dsolve(sympy.Derivative(f(x),x,3) + f(x), f(x))
Eq(f(x), C3*exp(-x) + (C1*sin(sqrt(3)*x/2) + C2*cos(sqrt(3)*x/2))*sqrt(exp(x)))

而常微分方程对于不同的方程类型也有着不同的解法,可以使用 classify_ode 来判断常微分方程的类型:

>>> sympy.classify_ode(sympy.Derivative(f(x),x) + f(x), f(x))
('separable', '1st_exact', '1st_linear', 'almost_linear', '1st_power_series', 'lie_group', 'nth_linear_constant_coeff_homogeneous', 'separable_Integral', '1st_exact_Integral', '1st_linear_Integral', 'almost_linear_Integral')
>>> sympy.classify_ode(sympy.Derivative(f(x),x,2) + f(x), f(x))
('nth_linear_constant_coeff_homogeneous', '2nd_power_series_ordinary')
>>> sympy.classify_ode(sympy.Derivative(f(x),x,3) + f(x), f(x))
('nth_linear_constant_coeff_homogeneous',)

 

SymPy 的 PDE 工具

在偏微分方程(Partitial Differential Equation)中,同样可以直接求解和判断偏微分方程的类型,分别使用函数 pdsolve() 和 classify_pde()。假设 f = f(x,y) 是一个二元函数,分别满足以下偏微分方程:

\partial f/\partial x + \partial f/\partial y =0

\partial f/\partial x + \partial f/\partial y + f = 0

\partial f/\partial x + \partial f/\partial y + f + 10 = 0

>>> f = sympy.Function("f")(x,y)
>>> sympy.pdsolve(sympy.Derivative(f,x)+sympy.Derivative(f,y),f)
Eq(f(x, y), F(x - y))
>>> sympy.pdsolve(f.diff(x)+f.diff(y)+f,f)
Eq(f(x, y), F(x - y)*exp(-x/2 - y/2))
>>> sympy.pdsolve(f.diff(x)+f.diff(y)+f+10,f)
Eq(f(x, y), F(x - y)*exp(-x/2 - y/2) - 10)

查看类型就用 classify_pde() 函数:

>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f)
('1st_linear_constant_coeff_homogeneous',)
>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f+10,f)
('1st_linear_constant_coeff', '1st_linear_constant_coeff_Integral')
>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f+10,f)
('1st_linear_constant_coeff', '1st_linear_constant_coeff_Integral')

不过目前的 PDE 解法貌似只支持一阶偏导数,二阶或者以上的偏导数就不支持了。

 

SymPy 的数论工具

在数论中,素数就是一个最基本的概念之一。而素数的批量计算,比较快的方法就是筛法(sieve method)。在 sympy 中,同样有 sympy.sieve 这个工具,用于计算素数。如果想输出前100个素数,那么

>>> sympy.sieve._reset()
>>> sympy.sieve.extend_to_no(100)
>>> sympy.sieve._list
array('l', [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631])

如果想输出一个区间内的所有素数,可以使用 primerange(a,b) 函数:

>>> [i for i in sympy.sieve.primerange(10,100)]
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

search() 函数是为了计算某个数附近是第几个素数:

>>> sympy.sieve.search(10)
(4, 5)
>>> sympy.sieve.search(11)
(5, 5)

如果只想获得第 n 个素数,则使用函数 sympy.ntheory.generate.prime(n) 即可。如果是希望计算 x 后面的下一个素数,使用 sympy.ntheory.generate.nextprime(x) 即可。判断 x 是否是素数,可以使用 sympy.ntheory.generate.isprime(x)。

>>> sympy.ntheory.generate.prime(10)
29
>>> sympy.ntheory.generate.nextprime(10)
11
>>> sympy.ntheory.generate.nextprime(11)
13
>>> sympy.ntheory.generate.isprime(11)
True
>>> sympy.ntheory.generate.isprime(12)
False

除此之外,SymPy 的数论方法还有很多,需要读者根据 SymPy 的官方文档自行探索。

 

SymPy 的范畴论工具

SymPy 还支持范畴论(Category Theory)的一些计算方法,在这里简要地列举一下。

>>> A = sympy.categories.Object("A")
>>> B = sympy.categories.Object("B")
>>> f = sympy.categories.NamedMorphism(A,B,"f")
>>> f.domain
Object("A")
>>> f.codomain
Object("B")

由于范畴论是数学的“黑话”,因此其余方法留给范畴论的科研人员自行翻阅。

总结:

整体来看,SymPy 是一个非常卓越的 Python 开源符号计算库。在符号计算领域,不仅支持常见的微积分,线性代数,几何运算,还支持集合论,微分方程,数论等诸多数学方向。后续笔者将会持续跟进并研究这一卓越的开源工具库。

 

参考文献:

  1. Meurer A, Smith C P, Paprocki M, et al. SymPy: symbolic computing in Python[J]. PeerJ Computer Science, 2017, 3: e103.
  2. GitHub:https://github.com/sympy/sympy
  3. SymPy:https://www.sympy.org/en/index.html
  4. Sympy 维基百科:https://en.wikipedia.org/wiki/SymPy
  5. GreatX’s Blog:数值 Python:符号计算:https://vlight.me/2018/04/01/Numerical-Python-Symbolic-Computing/
  6. SymPy 符号计算-让Python帮我们推公式:https://zhuanlan.zhihu.com/p/83822118
  7. Python 科学计算利器—SymPy库:https://www.jianshu.com/p/339c91ae9f41

 

zr9558's Blog