Abraham Wald — 数弹孔的数学大师

亚伯拉罕·瓦尔德(Abraham Wald,1902 – 1950)是罗马尼亚裔美国统计学家,1902 年 10 月 31 日生于罗马尼亚克卢日的一个正统犹太世家。瓦尔德先就读于克罗日大学,1927 年进入入维也纳大学学习并且很快就获得博士学位(1931年)。瓦尔德的求学生涯恰好赶在第一次世界大战和第二次世界大战之间。在这个时期的奥地利,由于政治上的因素使他无法从事学术工作,瓦尔德只好接受一个私人职位,职责是帮助一位银行家增加高等数学知识,这导致他对经济学产生了浓厚兴趣,后来他成为经济学家摩根斯坦 (Oskar Morgenstern) 的亲信助理。

瓦尔德在二次大战前到达美国(1938年),不幸的是他的父母和姐妹没有逃出来,最终都死于纳粹的瓦斯房。瓦尔德在哥伦比亚大学做统计推断理论方面的研究工作,写出了许多有开创性的学术论文。他于 1943 年任副教授,1944 年任正教授,1946 年被任命为数理统计系的执行官员。在第二次世界大战的大部分时间里,瓦尔德在哥伦比亚大学的统计研究小组里面工作。该研究小组是为了二战而服务的,只不过研究的内容不是各种各样的炸药,而是各式各样的数学问题。

瓦尔德所在的统计研究小组每周都从事着高强度的学术研究活动,但瓦尔德在从事学术研究的时候,由于身份的原因,美国军方会禁止他阅读他自己完成的机密报告。传闻,每次瓦尔德在撰写完一页机密报告,旁边的秘书就会拿走这一页,并且不让瓦尔德重新阅读这份资料。虽然数学研究存在着不少的客观困难,但是,这并不影响瓦尔德的工作热情和尽情地展现自己的聪明才智。

在二战的时候,瓦尔德解决了一个关于飞机装甲的问题,让他从诸多数学家中脱颖而出。这个问题是美国军方提出的,从美国军方的角度来讲,我们都不希望自己的战斗机被敌人击落,因此我们需要为战斗机加厚装甲。但是,增加装甲又会增加战斗机的质量,影响飞机的机动性,并且还会消耗更多的燃油。过多的防御是没有必要的,但是完全不防御则是更加不可取的。那么究竟在飞机的哪些部位增加装甲,能够做到增加防御,但是又不影响飞机的战斗效率呢?军方就把这一问题交给了统计研究小组。

为了给数学家和统计学家们构建理论基础,军方为他们提供了一些可能需要的数据。军方收集了己方战斗机与敌方战斗机交火之后返回基地的数据,己方的战斗机身上都会留下许多弹孔,但是这些弹孔的分布并不是均匀的,机身上的弹孔比引擎上的弹孔明显多很多。

飞机部位每平方英尺的平均弹孔数
引擎1.11
机身1.73
油料系统1.55
其余部位1.80

这张表就是军方得到的统计数据,从表格上看,军方领导一致认为,装甲应该装在飞机最需要保护和受攻击最高的部分,那么就应该装在机身上,因为机身平均弹孔数是最多的。但是,统计学家瓦尔德给出的答案却与他们的答案相差甚远。

瓦尔德说,需要加装装甲的地方并不是留有弹孔的部位,而是没有弹孔的地方或者弹孔数较少的地方,那就是飞机的引擎。为此,瓦尔德继续解释道,飞机各个部位受到损坏的概率应该是一样的,但是引擎的弹孔数明显比其余部分少,那么这些失踪的子弹和弹孔去哪里了呢?原因只有一个,那就是这些弹孔应该都在那些未能返航的飞机上。胜利返航的飞机引擎弹孔较少,其原因正是被击中引擎的飞机未能返航。大量飞机在机身被打击的情况下仍然能够回到基地,说明机身可以承受很大的打击,于是无需加装装甲。

考虑一个极端的例子,假设敌军只要击中飞机引擎,飞机就会坠落且无法返航,那么我们会得到什么样的数据呢?我们会发现,在返航的战斗机上,机身,油料系统,其余部分均有弹孔,但是引擎上面找不到任何弹孔。那么只有两个可能,第一敌军打中了飞机的各个部位,但是没有打中引擎;第二就是打中引擎的飞机无法返航。

最终,沃尔德的论文题目是:A Method of Estimating Plane Vulnerability Based on Damage of Survivors,翻译出来就是一种根据幸存飞机损伤情况推测飞机要害部位的方法。在论文中,他应用详细的数据来证明他自己的观点。弹孔最稀疏处就是战斗机的要害处,因为没有被击中要害处的飞机才有更多的机会返航,进入军方的统计样本。这就是幸存者偏差。

通过详细的数学论证和统计推断,这一数学结论最终说服了军队的高层领导,军队高层领导迅速将瓦尔德的建议进行实践。瓦尔德拥有的空战知识和部队实战都不如军官,为什么却能够看到这个问题的本质原因呢?根本原因是瓦尔德在长期的科研过程中所养成的习惯。在这个例子中,军官们默认了一个假设,那就是返航的飞机是所有飞机的随机样本。正是这一个幸存者偏差的假设,导致军官们得到了错误的结论。

关于幸存者偏差(survivorship bias),有不少有趣的笑话。例如:老师在课堂上点名,要求没有到的学生举手,结果无一人举手,然后就得到了全体学生都来上课的结论。又例如:记者在春运火车上采访群众,问今年的火车票是否容易买,群众说很快就买到了,其实真正的原因是没有票的人无法上车。

但是数学家瓦尔德的结局令人惋惜。1950 年,四十八岁的他受印度政府邀请,携妻前往印度讲学。不料航行至印度的尼尔吉里丘陵时,飞机坠毁,沃尔德和妻子都未能成为幸存者。

Advertisement

随感(十八)— 经营自己的职业生涯就是经营一家企业

在《软技能:代码之外的生存指南》中,作者在全书的开始就抛出了一个观点:“经营自己的职业生涯就是经营一家企业”。

每个程序员在刚开始工作的时候,如果一头扎入撰写代码的世界,根本不管外部环境的事情,那就跟中世纪的铁匠和纺织工没有任何区别。每个公司就好比当年的铁匠铺或者纺织厂,通过招募程序员或者产品经理来赚钱。产品经理能管理提供的服务就是调研行业,设计产品功能等;程序员能够提供的服务就是撰写程序,完成产品功能等。从打工者的角度来看,每个打工者只需要完成企业或者直系上级传达的任务和目标就可以,然后通过劳动来获取相应的薪水,但这是一个打工人的心态,仅仅完成这些事情是无法让自己的职业生涯获得更大成功的。

在日常的生活工作中,打工人最好是树立一种为自己工作的理念。从一个打工者的心态转化成经营一个企业的目标,该个人经营的企业能够提供的服务包括“软件开发”,“数据分析”,“品牌营销”等内容。如果是为了自己而工作,那么在工作中所获得的技能和生意都是自己的,离开了这个公司或者行业还有机会东山再起。

经营一个企业,肯定离不开营销和推广。同理,如果是像企业一样的经营自己的职业生涯,就会一定要进行自我营销和影响力的扩大。并且在平时的工作和生活中,个人通过一些自媒体或者社交平台来进行必要的自我营销也是提升个人竞争力,个人影响力,个人魅力,甚至提升薪水的一种方法。

现在的社交媒体远比几十年前发达很多,以前只有纸质版的传播渠道,现在通过互联网和社交平台,再小的个体都可以做成一个独一无二的品牌。对于个人职场生涯而言,个人品牌的塑造并不是一朝一夕的事情,而是一个长期坚持不懈的工作。在互联网数十年的发展历史中,每个独立的个体都有机会成为某一个垂直领域的专家和代表。在国内,自我营销的方式有很多种,常见的包括但不限于:

  • 博客:搭建属于自己的博客,微信公众号,知乎专栏等;
  • 视频:无论是 YouTube 长视频,bilibili 的中视频,还是抖音快手的短视频均可;
  • GitHub:是程序员进行自我宣传的最佳平台;
  • 书籍:撰写书籍有助于在大众面前提升曝光;
  • 技术会议:能够参加各种各样的技术会议有助于提升个人影响力。

如果个人塑造的品牌有一定的影响力,那么就有机会让其他公司和客户主动上门购买所需要的产品和服务,并不需要一个又一个的追逐其他公司和客户。其实这与在公司打工是类似的,如果该程序员的在行业中的影响力很大,那么总会有其他公司和团队来挖墙脚。如果个人品牌有很高的竞争力,就会创造出各种各样的机会。

为了打造个人品牌,就需要设定各种各样的目标,这与在公司设定 OKR 或者 KPI 是类似的,需要进行目标的拆解。先制定一个大目标,然后将该大目标拆解成小目标,再将这些小目标分配给每个部门,最后分配到每个职场人的身上。对于经营个人品牌而言,也需要设置一个与自己目标,理想,职业生涯相对一致的目标,然后把这个大目标拆分成若干的小目标,例如:季度目标,月目标,周目标,日目标。把大目标拆解成一个又一个可以完成的小目标,这样有助于经常回顾自己的工作计划和最终目标。

也许在个人的职业发展中,有的人会觉得自己并不是所谓的专家,或者尚未成为该领域的领头羊,可以营销和传播的点相对较少。但这并不是放弃自我营销和扩大影响力的借口,每个人在每个阶段看待问题的方法和角度是不一样的。初学者看待问题是一个角度,专家看待这个问题则是另外一个角度。每个角度都是可以进行自我营销和推广的,无论是初学者还是专家,都有机会在从传播自身品牌中获益。

在从事自由职业者或者副业的时候,要同时兼顾个人创作和产出的质量,效率,成本。质量太差的话,读者和其他客户就会对品牌产生质疑;效率太低的话,个人也无法完成当初所制定的大目标;成本过高的话,那么做这件事情就是得不偿失的。

而在做自我营销的过程中,除了自身要有一定的知识储备对外宣传之外,更重要的则是坚持不懈地做某件事情。坚持做一件事情的难度是远高于心血来潮做事情的。在做程序员的时候,最重要的就是生产力,拥有优秀的生产力可以大量提升效率,也可以提升收入。为了获得更高的生产力,每日/每周/每月的计划就需要提前安排。通过各种 Calendar 日历工具提前安排自己的工作,基于 Rescue Time 等时间管理工具来安排有效的工作时间。培养一个好习惯有助于经营自己。为了达到长期坚持做某件事情,就一定需要形成惯例,类似于每天早上起床之后就会刷牙一样。而生产力的秘诀就是长期坚持做一件小事。通过形成惯例,有助于塑造一个健康向上的生活,可以进一步地提升生活质量。

在不同的自我营销平台上,由于观众是略有差异的,因此在内容侧需要进行必要的调整和重组,以迎合更多观众的喜好。坚持不懈地做某件事情也有利于在社交平台保证稳定的活跃度,可以长期的获得必要的流量。在现有的互联网环境下,有流量就可以带货,做培训,开直播,甚至提供必要的收入来源。《软技能》的作者在有段时间内进行了“艰苦工作”的模式,不仅完成自己的日常工作,还在工作日晚上和周末制作在线课程,且每周更新自己的博客内容。在持续工作的过程中,作者开始拥有了源源不断的被动收入,不仅包括博客的收入,还包括一些 APP 的收入,甚至投入的房地产和股票也获得了不错的收益。

在获得成功的路上,每个人都愿意在自己的舒适区呆着,很难主动地走出自己的舒适区,毕竟万事开头难。一旦走出了舒适区,就有可能给个人带来一个全新的世界。

无处不在的数学 — 从疫情谈起

数学在生活中是无处不在的。

每个人从出生开始,都会跟数学打交道。从最开始的认数字,到加减乘除,方程,几何,再到微积分和线性代数,数学几乎贯穿了教育的所有阶段。但是,数学真的在生活中是无处不在的么?对于这个问题,不同的人肯定有着自己完全不同的见解,本文就从近些年最常见的疫情开始谈起吧。

从 2019 年末开始,新冠病毒就开始在社会上悄悄传播,医疗系统开始逐渐被占满。2020 年初,武汉的疫情已经处于比较严重的状态,不少人都去医院治疗疾病,但同时检测系统和治疗系统还没有完全跟上。当时并没有办法在短时间内对几百万甚至上千万人口进行快速的疫情检测,只能够采取封城的策略来应对当时的疫情。

到了 2022 年,很多城市都有了丰富的应对疫情的策略,可以在很短的时间内对几百万甚至上千万人口同时进行核酸检测。根据检测结果,防疫部门就可以进行精准防控,以避免疫情的进一步扩散。能够进行大规模的核酸检测,除了检测能力本身的提升,检测时间的缩短之外,有没有数学办法将其进行优化就是一个关键问题。

核酸检测,其目的就是从大量的人中找到有问题的那一批人,然后进行必要的医疗救治,防止病毒的进一步扩散。近期如果做过大规模核酸的朋友仔细观察的话,其实在检测的时候会将十个人或者多个人的样本进行混合,放入同一个试管中,最终一起对这十个人或者多个人进行检测。如果有问题的话,再去对这十个人进行单独检测。从直觉上讲,多个人混合检测的效率肯定是优于一个人单独检测的,那么其背后的数学依据究竟是什么呢?为什么不进行二十个人,三十个人,一百个人的混合检测呢?

在回答这个问题之前,我们可以看一个更加简单一点的案例。相比大家都知道高校的图书馆,在图书馆的门口都会放有闸机,其目的是防止图书馆的书籍被大家不小心带出去。如果有人不小心把图书馆的书籍放入闸机,那么闸机就会报警。通常情况下,大家去借书的时候都会同时借阅好几本甚至十几本书籍,如果此时有一本书没有借阅成功,而出现了闸机报警的情况,那么如何快速的找到没有借阅成功的那本书呢?

最直接的方式是一本一本将这些书籍进行扫描,然后如果出现了报警,那就找到了这本没有借阅成功的书籍。但这种扫描的方式无疑是效率最低的,如果每次都要扫描所有的书籍,那么图书馆的管理员都会觉得效率低下。

假设某个同学一次借阅了十六本书,但是有一本书没有借阅成功,其实完全可以使用“二分法”来解决问题。将这十六本书分成两份,每一份有八本书,第一次先测试其中的八本,第二次再测试剩下的八本,于是得到了有报警的那八本书;于是再将这八本书分成两份,每份四本,重新在闸机上进行测试,得到有报警的那四本书;再将这四本书分成两份,每份二本,同样的操作之后得到有问题的两本书。最后,将这两本书在闸机上测试,就得到了那本没有扫码成功的书籍。通过这样的方法,可以将检测次数变成 2 + 2 + 2 + 2 = 8 次,测试的次数变成了原来的一半。扩展到一般的形式,如果书籍有 2^n 本,那么一本一本检测的话需要 2^n 次,但是如果使用图书馆阿姨的方法,则可以将检测次数变成 2n 次;当 n 很大的时候,可以清楚地知道 2n \ll 2^n,其检测的次数会呈现明显的减少。

不巧的是,这个方案并不能够完全照搬在传染病的检测中。因为在图书馆这个场景中,我们已经假设只有一本书是没有扫码成功的;但是在现实生活的传染病检测中,患病者的数量肯定不止一个,同时有多少个患病者其实也是未知的,我们只是知道患病者的人数肯定远远小于城市的总人口数。而在图书馆检测中,可以通过一次扫描就得到多本书的结果,在核酸检测的时候其实是做不到这一点的。不过图书馆这个场景倒是给提供了一个有效地思路,那就是将所有的书籍进行分桶。所谓的分桶就是将一个全体分成多份,且每一份的样本数是一致的,每次检测的时候只需要同时检测每一份样本就可以知道一个整体的情况了。

不过,核酸检测可以转换成一个抽象的数学问题。假设城市 A 的人口数是 n,当前感染传染病的人数是 m,并且 m 是远小于 n 的(m \ll n)。令 p = m / n 表示患病率且 p < 0.01。为了减少检测量,检测人员想对人群进行分桶操作,每 k 个人的样本进行混合,并且对这个混合样本进行检测。如果该混合样本没有问题,则这 k 个人都没有问题;如果该混合样本有问题,则再次对这 k 个人进行逐一检测。通过这样的方法,就可以得到最终的结果。那么,这个 k 该如何选择呢?

k = 1 的时候就相当于对每个人都进行检测,k = n 的时候就相当于对城市 A 中所有的人都进行检测,这两种极端情况的效率都很低。那么 k 值究竟如何选择,才能够让每个人的平均检测次数最少呢?

在数学上,这种混合检测的方法叫做 Group Testing,最早是美国的统计学家 Robert Dorfman 在 1943 年提出的。这种方法可以非常有效地提升大规模检测的效率和能力。在成本有限的前提下,达到最优的效果。其中心思想就跟核酸检测的方法是一样的,将全体人群按照一定的数量分成多个组,然后对每一个分组进行检测,如果该分组的检测结果没有问题,则这个分组里面的人就没有问题;如果该分组的检测结果有问题,则将这个分组里面的所有人重新进行单独测试。

根据以上方法,每个人的检测次数有可能是 1 次,也有可能是 2 次。只要这个人所在的混合样本没有问题,那么这个人就是 1 次;如果这个人所在的混合样本有问题,那么这个人就需要检测 2 次,那么这 k 个人都需要重新检测 1 次,这 k 个人的总检测次数就是 k + 1。这 k 个人的混合样本没有问题的概率是 (1-p)^k,有问题的概率是 1-(1-p)^{k}。那么,这 k 个人总检测次数的期望值就是 (1-p)^{k}+(1+k)(1-(1-p)^{k})。由于城市 A 总共有 n 个人,那么就需要 n / k 个桶,因此,总检测次数的期望是 \frac{n}{k}\cdot {(1-p)^{k}+(1+k)(1-(1-p)^{k})}=n\cdot\bigg(1+\frac{1}{k}-(1-p)^{k}\bigg)

为了解决这个函数的极值问题,最常见的就是使用微积分的方法。当 p < 0.01 时,通过 Taylor 公式可以得到 (1-p)^{k}\approx 1-pk,因此,总检测次数的期望值约等于 n\cdot\bigg(\frac{1}{k}+pk\bigg) 。当k=\frac{1}{\sqrt{p}} 时,上述公式达到最小值 2\cdot \sqrt{p}\cdot n。如果 p=0.01 时,k 取 10 可以达到最小值 0.2\cdot n;当 p=0.001 时,k 取 32 可以达到最小值 0.06\cdot n。通过混合采样的方法,可以将总检测次数的期望变成原来的五分之一甚至十分之一以下。

那么,在什么条件下,混合采样的方法会优于逐一检测呢?

此时,总检测次数的期望就要小于逐一检测,用数学公式来描述就是:n\cdot\bigg(1+\frac{1}{k}-(1-p)^{k}\bigg)<n,化简之后得到 p<1-\frac{1}{\sqrt[k]{k}}

如果进行十混一的混合检测方法,也就是当 k = 10 时,需要保证 p < 0.2;如果要进行二十混一的混合检测方法,也就是当 k = 20 时,需要保证 p < 0.14;如果要进行五十混一的混合检测方法,也就是当 k = 50 时,需要保证 p < 0.08。在绝大多数情况下,感染率 p 还是会小于 0.2 的,因此采用十混一或者二十混一的方法在现实生活中是可靠的。

在疫情防控的过程中,核酸检测是可以做到降本增效的,而降本增效的背后并不是拍脑袋的决定,其背后有着数学的理论支持。

参考资料

1. 参考知乎文章:https://zhuanlan.zhihu.com/p/103974270

2. 参考知乎提问:https://www.zhihu.com/question/524417189,https://www.zhihu.com/question/523901192/answer/2442100447

3. 核酸检测数学模型:https://www.zhihu.com/zvideo/1495452303112572928

4. 核酸检测的真假性:https://zhuanlan.zhihu.com/p/452598672,Bayes 公式。

5. https://en.wikipedia.org/wiki/Group_testing

6. https://zhuanlan.zhihu.com/p/104645873

随感(十七)— 职业生涯这件事

由于工作和生活的原因,笔者的个人博客和其他自媒体频道在几个月内都没有做太多的更新,但近期又有了一些相对富余的时间,觉得还是有必要把技术和个人博客捡回来,也算是对个人生活和工作的一个总结。

笔者一直在互联网公司工作,近期听到得最多的就是 XX 公司裁员,ZZ 公司大面积优化员工,民企和外企都在进行大规模的无差别裁员等。在前几年比较好的经济环境下,互联网公司每年会进行几次考核,并且会有一定的比例低绩效考核,最后这些人有可能会被裁员,比例大约也就是 10% 或者 15%,一般情况下不会超过 20%。

如果是部门或者小组拿到了裁员超过 20% 这个比例的指标,那么就不仅仅是低绩效员工的问题了,因为低绩效员工的比例其实并不会那么高。这个比例说明处于平均水平的员工已经有可能上了裁员名单,一旦超过 50% 的话,甚至某些高绩效的员工也在这份裁员名单上。这样的调整有可能是因为公司的发展问题,也有可能是整体行业的发展前景受阻。大面积的裁员跟之前的末位淘汰制是不太一样的。

如果是在互联网公司工作的话,有些同事确实是满足以下一个或者几个条件的:

  • 配偶是全职在家;
  • 家里有1-2个小孩;
  • 有20-30年的房贷;

如果互联网公司发展好,房价也在涨,那么这些条件其实都不是问题,通过工资,股票,年终奖其实都能够搞定这些事情。但是一旦行业发展不达预期,公司出现了长时间的亏损,那么就有可能出现裁员的情况。对于某个人而言,如果突然被公司裁员,那么这个月或者下个月的收入就会大幅减少,但是家庭的开销还是固定的。此刻,这个人的压力就会迅速增大。对于配偶全职在家的情形,这个家庭的收入就会骤降。所以在这个经济环境下,对于普通家庭而言,配偶全职在家风险还是太大,无论钱多钱少,家里面的每个人都还是需要找到一个赚钱的方法;如果家里的顶梁柱失业了,小孩的生活水平也会相对降低;当然,在上述三个条件下,最大的问题应该还是长期的房屋贷款。

如果某个员工在公司突然被裁员,一般情况下都会有一定的赔偿金,如果再加上个人之前的存款可以延续一段时间低收入甚至无收入的生活。所以在有工作的情况下,每个人都进行积极地存款理财投资是优于月光和过度消费的。在经济发展好的时候,个人即使贷款多一些也是有信心还上的;在经济下行的时候,个人就要尽量减少贷款和负债。因此,在日常生活中,大家也尽量避免月光和进行一些不必要的消费,能存钱的时候还是尽量存一些。通常个人能够背负的大的贷款就是房贷,如果每个月的还款金额大于税后收入的话,在失业的情况下确实会造成过大的压力。

在大公司内部每个人都有着自己的工作职责,有程序员,产品经理,运营等诸多岗位。如果能够基于现有的一些工作技能来开展副业,那么对于个人而言就是一个 Plan B。但是副业是需要长期日常积累的,并不是临时一两个月就可以完全搞得起来的。如果在日常工作生活中有条件的话,大家可以想办法搞一个或者多个副业,一开始并不需要盈利,但只要坚持下去和方法得当,就有可能成为一个盈利的工作,甚至未来可以通过它来养家糊口。Plan B 如何选择完全基于自身的具体情况,毕竟每个人所擅长的领域也是完全不同的。

对于互联网大厂的在职人士而言,平时也不要长期处于一个相对舒服的位置,能够保持上进心是很重要的。除了日常地看技术资料和论文提升自己之外,时不时地也去市场上看看机会,有合适甚至更好的机会也可以缓一缓。毕竟没有哪个公司是长期稳定的,每个公司的情况都是会随着市场变化而变化的。在突然失业的情况下,尽量保持一个良好和积极的心态去寻找市场的机会,在市场环境一般的情况下也需要适当地降低一下薪水和预期。

长期来看,如果该员工手上有一些现金,即使突然被公司裁员了,那短期内该员工确实不会特别慌,只需要拿着赔偿金积极寻找下家就行了。如果个人手上的现金特别少,还同时满足配偶是全职在家,家里有1-2个小孩,背负了20-30年的房屋贷款的条件,在每个月都在月光的情况下,在突然听到被裁员的通知时就会压力陡增。但是,条条大路通罗马,总有一个可以回旋的余地,往后积极地工作和生活吧。