learn-tech/专栏/程序员的数学课/23站在生活的十字路口,如何用数学抉择?.md
2024-10-16 09:22:22 +08:00

250 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
23 站在生活的十字路口,如何用数学抉择?
人的一生需要面临很多重大的选择和决策,举例而言:
大漂亮毕业一年后遇到了一个小伙靠谱哥;面对靠谱哥的追求,大漂亮是应该接受还是拒绝?
大迷糊工作 3 年,猎头推荐给他一个不错的工作机会,面对年薪 30% 的涨幅,大迷糊是接受 offer 还是拒绝 offer
除了这些重大决策以外,我们生活中也需要做一些小的决策。
例如,点外卖时遇到满 30 元减 8 元,是强迫自己多消费到 30 元,还是只买自己所需的物品?
打德州扑克的时候,面对对手的加注,是跟注还是弃牌?
其实,当你面对这些选择时,完全可以利用数学知识来做出更合理的决策。这一讲的彩蛋,我们就围绕其中的几个场景,试着从数学的角度来进行解析。
放弃还是继续,如何选择最优?
人生充满了不确定性。在面临不确定性的时候,我们经常会面临下面的选择:是珍惜眼前,还是寄希望于未来?
举个例子,大漂亮是个各方面条件都很不错的女孩子。工作之后,她遇到一个男生靠谱哥,靠谱哥身上有优点,也有缺点,但综合来看,确实是个靠谱的年轻人。
那么,大漂亮是应该放弃靠谱哥,期待以后能遇到更优秀的男生;还是珍惜眼前,接受聪明哥的爱意,继续这段姻缘呢?
这就是一个在不确定性环境中,需要做出最优决策的问题。在这里,大漂亮面对的不确定性环境是,拒绝靠谱哥后还能不能遇到更优秀的男生。
人生的魅力就在于未来,而未来的特点就是不确定,人生中诸如此类的选择还有很多。而我们的数学家们,对这一类问题进行了抽象,总结出了经典的最优停止问题。
【最优停止问题】
最优停止问题有很多中描述方式,我们以“聘请秘书”为例来描述。
假设大聪明要聘请一名秘书,现在有 n 人来面试,其中 n 是已知的,每个候选人的能力有量化的得分。现在,这些候选人被按照随机的顺序进行面试,大聪明每次只能面试一个候选人,查看该候选人的能力得分,并需要立即决定是否聘用该候选人。
如果决定不聘用该候选人,这个候选人便不会再回来;如果决定聘用该候选人,后续的候选人就没有面试的机会了。
问:大聪明用怎样的策略,才能让他有更高的概率选到能力得分最高的候选人?
顾名思义,最优停止问题,就是面对一个又一个的输入样本,去选择一个最好的停止时刻。它有以下几个特点。
第一,候选人只能一个接一个地面试,不能同时参加面试;
第二,面试官大聪明能且只能选择聘用 1 个候选人;
第三,面试当场,大聪明就需要做出聘用与否的决策,不能“骑驴找马”地选择待定。
接下来,我们就来通过数学的方式去计算出最优的策略。
其实,最优停止问题的答案很简单;有时候,也被人简称为“三七法则”。具体而言,是对前 m 个候选人,不论多么优秀,都拒绝聘用。接着,从第 m+1 个人开始,如果遇到了一个比先前所有面试者都优秀的候选人,那么就聘请这个人。
流程上如上图所示,而之所以被称为“三七法则”,是因为当 m/n 等于 37% 时,选到能力得分最高的候选人的概率是最大的,而且这个选中最优候选人的最大的概率也恰好是 0.37。
【代码实现】
我们先试着用代码仿真一下上面的结论。我们假设候选人的人数 n 为 100每个候选人都有一个能力得分取值为 0 到 1 之间的小数,则代码如下:
import random
import numpy as np
t = 0
f = 0
for i in range(1000):
a = np.random.random((100,1))
all_max = max(a)
get = 0
m_max = max(a[0:37])
for k in range(37,100):
if a[k] > m_max:
get = a[k]
break
if get == all_max:
t += 1
else:
f += 1
print "true: " + str(t)
print "false: " + str(f)
print "percentage: " + str(100.0*t/(t+f))
我们对代码进行走读:
第 4 行和第 5 行,分别定义两个变量,用来存放找到最优候选人的次数和没有找到最优候选人的次数;
第 6 行开始,执行一个 1000 次的循环;
在每次的循环中,第 7 行,调用随机函数生成一个 100 维的数组 a数组 a 中的每个元素,都是 0 到 1 之间的小数,代表候选人的能力得分;
第 8 行,调用 max 函数,保存好数组 a 中的最大值,也就是能力最高的候选人的能力得分;
第 9 行,定义 get 变量,用来保存用“三七法则”找到的候选人的能力得分;
第 10 行,再调用 max 函数,计算出前 37% 的候选人的能力最大值;
第 11 行开始,对 a 数组的 37% 位置之后的元素,开始执行 for 循环;
第 12 行,判断循环过程中的元素,是否比前 37% 个元素的最大值还要大;
如果是,则执行第 13 行,找到“三七法则”的输出结果,并跳出循环;
接着,第 15 行判断“三七法则”找到的最大值和a数组全局视角的最大值是否相等
如果是,则第 16 行的 t 变量加 1
否则,则第 18 行的 f 变量加 1
最后,第 1921 行,打印 1000 次循环的结果。
我们运行代码的结果如下图所示。在 1000 次的试验中,采用“三七法则”找到最大值的次数有 376 次,没有找到最大值有 624 次。综合来看,找到最大值的概率是 37.6%这远比我们随机去猜100 个样本选最优1% 的选中概率)要好得多。
这里我们通过代码仿真,已经模拟并验证了“三七法则”这一结论;而关于“三七法则”的数学推导,则需要用到调和级数等高等数学的知识,感兴趣的同学可以自己去查阅一些资料来补充学习。
【婚恋中的“三七法则”】
在这里,我们给出一些基于“三七法则”的实战建议。老话说,“枪打出头鸟”“万事开头难”,这些话在“三七法则”面前还是有一定道理的。
如果最优秀的候选人出现在了前 37% 个样本中,那么无论如何他都是不会被选中的;反过来,躲在最后也不是最好的选择。这是因为,如果最优秀的候选人躲在最后才去参加竞争,很可能被第二优秀或者第三优秀的人,捷足先登抢到了机会。
我们回到最开始大漂亮和靠谱哥的故事中,试着用“三七法则”给大漂亮一些建议。我们假设女孩子会在 1830 岁结婚。那么,这个年龄段的前 37% 的时间内,不论遇到谁、不论他多么优秀,大漂亮都不应该去考虑结婚。
而此阶段的终止年龄是 18+(30-18)×0.37=22.44 岁,也就是大漂亮到了 22.44 岁后,如果她遇到了一个比先前所有遇到的人都优秀的男孩子,那么她应该去考虑与这个男孩子相处并结婚。所以,决定大漂亮是否要接受靠谱哥有两个条件,分别是:
大漂亮的年龄是否到达了 22.44 岁;
靠谱哥是否比大漂亮之前遇到过的人都优秀。
在《王牌对王牌》的一期节目中,韩雪喊出的青春告白,就是“三七法则”的道理。虽然她的表述不完全正确,但她还是准确地提到了 22.44 岁。看来,这背后定有数学高人在指导韩雪和节目组啊。
当然啦,你可能认为人在大学四年的时期都过于幼稚迷茫,并不是好的择偶期,那你可以将时间定义为 2230 岁,那么对应的 37% 就是 25 岁,也刚好是毕业三年后,职场新人蜕变的时期,希望你可以在这时事业、爱情双丰收。
又聊回了“职场话题”,我们看看大漂亮的学长“大迷糊”的职业发展情况吧。
涨薪 30%,跳槽吗?
很多人,尤其是那些不愁 offer 的优秀的人,常常会纠结要不要跳槽。其实,这也可以用数学去进行一些计算,来辅助做出一些决策的。
我们先把所有可能影响跳槽的因素列出来。在这里,我大致总结出以下几个关键因素:薪酬、职级、个人能力成长空间、适应成本、与领导的信任关系、公司发展前景。接着,我们需要对比出新旧两份工作在这些因素上的得失。如果总得比总失多,就可以考虑跳槽;如果总得比总失少,得不偿失,就不应该跳槽。
下面给你一个关于跳槽涨薪的案例。大迷糊是一线互联网公司的工程师,他的薪酬在所在职级中是中等偏上的水平。由于多年的刻苦努力工作,大迷糊在公司中与领导的信任关系很好。下半年,因为公司高管调整,大迷糊的主管被调整到其他部门。随之而来的,是一个毫不认识的新主管。
在同年 11 月,大迷糊拿到了另一个超一线互联网公司的工程师 offer获得了 30% 的薪酬涨幅,职级也相应提高了一级。对方要求大迷糊在 11 月内做出决策,是否接受 offer 并入职。
【现在是否应该跳槽?】
我们来帮大迷糊计算一下得失吧,以“新 offer”代表新机会以“旧公司”代表当前的公司。
首先,算一下薪酬
在 11 月内跳槽,意味着失去了旧公司当年的年终奖,这是“失”。我们假设年终奖是 3 个月,大迷糊在旧公司的月薪是 a 元,那么总“失”为 L=3a
新的 offer 年薪上有 30% 的涨幅,但 11 月入职的员工,却不会被新公司普调覆盖,而旧公司的普调平均值是 8%。那么大迷糊未来一年内的总“得”,为 G=(30%-8%)a×(12+3)=3.3a。
这样,总“得”和总“失”的差值为 G-L=0.3a>0。
其次,再计算一下职级
新的 offer 涨了一级,这是“得”;然而,旧公司次年也有晋升机会,大迷糊是骨干,我们假设大他在旧公司的晋升概率为 0.7,这显然就是潜在的“失”。
那么在职级这里的总“得”和总“失”的差值,为 G-L=1-0.7×1=0.3级 > 0
接着,个人能力成长空间
我们假设这一项是差不多的,毕竟在一线互联网公司中,工程师还是比较吃香的。
下一个,适应成本
大迷糊是旧公司的老员工,对于公司的制度文化、工作环境、同事相处,都必然会更适应,这里没有“得”,因为不跳槽并不会让自己的适应性增强。
然而,到了新公司后,新的工作环境、全新的同事、新公司的文化氛围,都是需要一定的时间来适应。这样看,适应成本就由适应期时间长短决定了。
因为适应期必然大于零,所以这里一定会有“失”,即 G-L。
再下一个,与领导的信任关系
很多人会说,旧公司因为高管调整,空降了一个新的主管。这对阿强来说并不是个好消息。然而问题就在于,跳槽也是无法解决这个矛盾的。大迷糊去了一个新的公司,仍然要与一个不认识的领导,要去重新相处,去建立新的信任关系。
所以说,在这个维度上,没有“得”,也没有“失”,即 G-L=0。
最后,公司发展前景
大迷糊由一线公司,跳槽到超一线公司,公司前景必然是更广阔了。然而,公司的前景和个人的回报之间,很难有明确、量化的兑换关系,这里的得和失很难被计算了。
明确的是得大于失G-L>0。
好了,我们把以上所有的因素总结在下面的表格里,来帮助大迷糊做最后的抉择。
|
根据这个表格,我们能发现,任何一个维度都不支持大迷糊做出跳槽的动作。所以,大迷糊更好的选择是,拒绝 offer继续在旧公司工作。
【跳槽合适的时机?】
那么,什么时候大迷糊才能跳槽呢?我们把上面的环境稍稍改动就会得到不一样的结果。假设,新 offer 的时间并不是 11 月,而是次年的 4 月份,此时改变的因素有二:
第一,大迷糊已经收到了年终奖,或者旧公司经营惨淡,年终奖几乎为 0
第二,大迷糊已经参加了旧公司的晋升,并且晋升失败。
那么上面的表格就要做出下面红色部分的修正。在薪酬和职级上,原本的损失都没了。得失关系,也由原来的“大得大失”变成了“大得无失”。此时的环境,就足够支撑大迷糊去做出跳槽的抉择了。
最后,我们为跳槽的决策做一些实战性总结。跳槽时,一定要算清楚、想明白“得”和“失”。在考虑跳槽时机的时候,一定要尽量让结果是增加自己的“得”,降低自己的“失”,充分考虑清楚,千万不能因为一时冲动而做出“小得大失”的决定。那样,最终吃亏的还是自己。
另外,在薪酬和职级这两个维度上,通常在上半年的 34 月是“失”最小的时间。这是因为,你已经拿到了上一年的年终奖,且绝大多数的互联网公司的晋升和普调都是在这个时间点上。这样,不管是钱还是级,你的损失都已经降到了最低。这也是找工作中常说的“金三银四”背后的道理。
当然了,如果你决定跳槽,也一定要在拉勾网这样的大平台上去多多寻找机会。大平台有更多一线以上公司的招聘机会,所以你在公司发展前景这个维度上,会有更多收益。
小结
人生的魅力来自未来的不确定性。也是因此,人们常常需要在不确定性的环境中,做出选择。在做抉择时,一个通用的思路是计算得失。你所有的决策依据,都应该是尽可能降低自己的“失”,而谋求更多的“得”。
与此同时,有了数学武器,不代表你能做出最完美的选择。这是因为,在人生的不确定性中,总有你计算之外的不确定因素。因此,在做抉择时,你还需要调整好心态,做到“不以物喜,不以己悲”。只要你计算的过程是正确的,就不需要因为一时的得失而气馁。
因为,只要你坚持这样的思考方式,长期统计看,收益一定是更可观的。相信无论哪个决定,只要你脚踏实地,深耕你的专业,热爱你的生活,你一定会有意外之喜。