最终,沃尔德的论文题目是:A Method of Estimating Plane Vulnerability Based on Damage of Survivors,翻译出来就是一种根据幸存飞机损伤情况推测飞机要害部位的方法。在论文中,他应用详细的数据来证明他自己的观点。弹孔最稀疏处就是战斗机的要害处,因为没有被击中要害处的飞机才有更多的机会返航,进入军方的统计样本。这就是幸存者偏差。
不过,核酸检测可以转换成一个抽象的数学问题。假设城市 A 的人口数是 n,当前感染传染病的人数是 m,并且 m 是远小于 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 个人的混合样本没有问题的概率是 ,有问题的概率是 。那么,这 k 个人总检测次数的期望值就是 。由于城市 A 总共有 n 个人,那么就需要 n / k 个桶,因此,总检测次数的期望是 。
如果进行十混一的混合检测方法,也就是当 k = 10 时,需要保证 p < 0.2;如果要进行二十混一的混合检测方法,也就是当 k = 20 时,需要保证 p < 0.14;如果要进行五十混一的混合检测方法,也就是当 k = 50 时,需要保证 p < 0.08。在绝大多数情况下,感染率 p 还是会小于 0.2 的,因此采用十混一或者二十混一的方法在现实生活中是可靠的。
在大公司内部每个人都有着自己的工作职责,有程序员,产品经理,运营等诸多岗位。如果能够基于现有的一些工作技能来开展副业,那么对于个人而言就是一个 Plan B。但是副业是需要长期日常积累的,并不是临时一两个月就可以完全搞得起来的。如果在日常工作生活中有条件的话,大家可以想办法搞一个或者多个副业,一开始并不需要盈利,但只要坚持下去和方法得当,就有可能成为一个盈利的工作,甚至未来可以通过它来养家糊口。Plan B 如何选择完全基于自身的具体情况,毕竟每个人所擅长的领域也是完全不同的。
强化学习是人工智能领域一个非常重要的分支,在游戏 AI 领域的应用是无处不在的,包括大家耳熟能详的 AlphaGo 和王者荣耀,其背后都使用了大量的强化学习方法。随着人工智能技术在互联网公司的日渐普及,人们对人工智能的期待也越来越高,也期待着人工智能未来能够做更多的事情。除了各种门禁系统,人脸识别系统在各个公司的应用之外,在游戏领域,强化学习也扮演着举足轻重的作用。
当前的强化学习技术除了使用在游戏 AI 领域之外,也在机器人控制,推荐系统等领域有着很多应用,也取得了不少商业价值。但强化学习的学习还是存在一定的门槛,除了一些在线的 tutorial 和零零散散的资料之外,其实还是需要一本相对完整和优秀的教材来辅助高校的老师和学生,只有这样,强化学习才能够成为一门课进入高校课堂。
从教育经历这一块来看,就开始有区分度了。不同的学历的面试标准和要求是存在一定差异性的,不同的学校也是存在一定的区分度的。当然学校的区分度并不是指 Top 2,C9,985,211 的学生就一定会通过面试,在面试的过程中,任何学校的候选人都存在机会。不同公司的不同部门会根据自身的实际情况招聘最合适的候选人,并且最合适的候选人并不是最强的人。
Liu, Jing, et al. “What’s in a name? An unsupervised approach to link users across communities.” Proceedings of the sixth ACM international conference on Web search and data mining. 2013. 本篇文章主要是基于用户的名字来识别跨网络的用户的,提取用户的特征之后,使用 SVM 分类器来进行识别;
Riederer, Christopher, et al. “Linking users across domains with location data: Theory and validation.” Proceedings of the 25th International Conference on World Wide Web. 2016. 本篇文章主要是基于用户的内容特征来进行建模;
Labitzke, Sebastian, Irina Taranu, and Hannes Hartenstein. “What your friends tell others about you: Low cost linkability of social network profiles.” Proc. 5th International ACM Workshop on Social Network Mining and Analysis, San Diego, CA, USA. 2011. 本篇论文是根据社交网络中的用户邻居数据,来判断用户之间相似性的。
参考文献
Shu, Kai, et al. “User identity linkage across online social networks: A review.” Acm Sigkdd Explorations Newsletter 18.2 (2017): 5-17.
Liu, Jing, et al. “What’s in a name? An unsupervised approach to link users across communities.” Proceedings of the sixth ACM international conference on Web search and data mining.
Riederer, Christopher, et al. “Linking users across domains with location data: Theory and validation.” Proceedings of the 25th International Conference on World Wide Web. 2016.
Labitzke, Sebastian, Irina Taranu, and Hannes Hartenstein. “What your friends tell others about you: Low cost linkability of social network profiles.” Proc. 5th International ACM Workshop on Social Network Mining and Analysis, San Diego, CA, USA. 2011.
a.build(n_trees, n_jobs=-1):n_trees 表示树的棵数,n_jobs 表示线程个数,n_jobs=-1 表示使用所有的 CPU 核;
a.save(fn, prefault=False):表示将索引存储成文件,文件名是 fn;
a.load(fn, prefault=False):表示将索引从文件 fn 中读取出来;
a.unload():表示不再加载索引;
a.get_nns_by_item(i, n, search_k=-1, include_distances=False):返回在索引中的第 i 个向量 Top n 最相似的向量;如果不提供 search_k 值的话,search_k 默认为 n_tree * n,该指标用来平衡精确度和速度;includ_distances=True 表示返回的时候是一个包含两个元素的 tuple,第一个是索引向量的 index,第二个就是相应的距离;
a.get_nns_by_vector(v, n, search_k=-1, include_distances=False):返回与向量 v Top n 最相似的向量;如果不提供 search_k 值的话,search_k 默认为 n_tree * n,该指标用来平衡精确度和速度;includ_distances=True 表示返回的时候是一个包含两个元素的 tuple,第一个是索引向量的 index,第二个就是相应的距离;
search_k:值越大表示搜索耗时越长,搜索的精度越高;如果需要返回 Top n 最相似的向量,则 search_k 的默认值是 n_trees * n;
Annoy 的使用案例
from annoy import AnnoyIndex
import random
# f 表示向量的维度
f = 40
# 'angular' 是 annoy 支持的一种度量;
t = AnnoyIndex(f, 'angular') # Length of item vector that will be indexed
# 插入数据
for i in range(1000):
v = [random.gauss(0, 1) for z in range(f)]
# i 是一个非负数,v 表示向量
t.add_item(i, v)
# 树的数量
t.build(10) # 10 trees
# 存储索引成为文件
t.save('test.ann')
# 读取存储好的索引文件
u = AnnoyIndex(f, 'angular')
u.load('test.ann') # super fast, will just mmap the file
# 返回与第 0 个向量最相似的 Top 100 向量;
print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
# 返回与该向量最相似的 Top 100 向量;
print(u.get_nns_by_vector([random.gauss(0, 1) for z in range(f)], 1000))
# 返回第 i 个向量与第 j 个向量的距离;
# 第 0 个向量与第 0 个向量的距离
print(u.get_distance(0, 0))
# 第 0 个向量与第 1 个向量的距离
print(u.get_distance(0, 1))
# 返回索引中的向量个数;
print(u.get_n_items())
# 返回索引中的树的棵数;
print(u.get_n_trees())
# 不再加载索引
print(u.unload())
基于 hamming 距离的 annoy 使用案例:
from annoy import AnnoyIndex
# Mentioned on the annoy-user list
bitstrings = [
'0000000000011000001110000011111000101110111110000100000100000000',
'0000000000011000001110000011111000101110111110000100000100000001',
'0000000000011000001110000011111000101110111110000100000100000010',
'0010010100011001001000010001100101011110000000110000011110001100',
'1001011010000110100101101001111010001110100001101000111000001110',
'0111100101111001011110010010001100010111000111100001101100011111',
'0011000010011101000011010010111000101110100101111000011101001011',
'0011000010011100000011010010111000101110100101111000011101001011',
'1001100000111010001010000010110000111100100101001001010000000111',
'0000000000111101010100010001000101101001000000011000001101000000',
'1000101001010001011100010111001100110011001100110011001111001100',
'1110011001001111100110010001100100001011000011010010111100100111',
]
# 将其转换成二维数组
vectors = [[int(bit) for bit in bitstring] for bitstring in bitstrings]
# 64 维度
f = 64
idx = AnnoyIndex(f, 'hamming')
for i, v in enumerate(vectors):
idx.add_item(i, v)
# 构建索引
idx.build(10)
idx.save('idx.ann')
idx = AnnoyIndex(f, 'hamming')
idx.load('idx.ann')
js, ds = idx.get_nns_by_item(0, 5, include_distances=True)
# 输出索引和 hamming 距离
print(js, ds)
基于欧几里得距离的 annoy 使用案例:
from annoy import AnnoyIndex
import random
# f 表示向量的维度
f = 2
# 'euclidean' 是 annoy 支持的一种度量;
t = AnnoyIndex(f, 'euclidean') # Length of item vector that will be indexed
# 插入数据
t.add_item(0, [0, 0])
t.add_item(1, [1, 0])
t.add_item(2, [1, 1])
t.add_item(3, [0, 1])
# 树的数量
t.build(n_trees=10) # 10 trees
t.save('test2.ann')
u = AnnoyIndex(f, 'euclidean')
u.load('test2.ann') # super fast, will just mmap the file
print(u.get_nns_by_item(1, 3)) # will find the 1000 nearest neighbors
print(u.get_nns_by_vector([0.1, 0], 3))
Nearest neighbors and vector models – part 2 – algorithms and data structures:https://erikbern.com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces.html
利弗莫尔 1900 年第一次结婚,后来炒股破产,妻子 Netit (Nettie) Jordan 不愿变卖首饰支持他炒股,两人感情失和,终于在1917年离婚。他的第二任演员妻子温德特(Dorothy Wendt)嗜酒、花名在外,最后温德特跟他离婚,还把他的财产挥霍一空,又在一次酒醉后,对长子开枪,造成长子残废。家庭生活的失衡,使他因为私人生活问题而致心灰意冷,他多次破产,但也多次从破产中崛起。1934 年 3 月 5 日第四次破产,患有深度抑郁症。他的儿子说服他写书,借此鼓舞情绪,1940 年 3 月,利弗莫尔出版《股票作手杰西·利弗莫尔尔操盘术》(How to Trade in Stocks),但书卖得不好。同年11月他在饭店用晚餐时,留下遗书给第三任妻子Harriett Metz Noble,然后在洗手间举枪自杀。 利弗莫尔的遗书:
“ Cant help it. Things have been bad with me. I am tired of fighting. Cant carry on any longer. This is the only way out. I am unworthy of your love. I am a failure. I am truly sorry, but this is the only way out for me. (忍受不了,所有事情对我来说都很差。我厌倦了抵抗,不能够再坚持下去,这是唯一的出路!我不值得你去爱,我是个失败者,我…真的很对不起,但这个方法是我唯一的出路。) ”
生命中最后一年的长期抑郁症应该是自杀的主要原因。
这位华尔街的传奇大亨的书籍《How to Trade in Stocks》至今被奉为经典之作。下面摘选书籍中部分经典交易法则。
一个本科生 XX 毕业之后充满理想的选择攻读博士学位,导师给他描绘了一个宏伟蓝图,做出来必定发 Annals of Mathematics / Invention Mathematicae,所做的每一件事情都可以推动学科的发展和进步,成就感和使命感都爆棚的那一种。
科研之后 XX 每次需要和导师探讨问题的时候,导师总说这个问题该自己思考,多思考才能有结果。然后读博三年期间导师几乎没有任何过问,事后解释起来要给学生独立发展的机会。第三年结束之后学生 XX 拿出来一个结果给导师,导师说不能发表,也不准挂 arxiv,继续往下做就行了。结果一年后看到导师的另一位学生在某杂志上发表了相同的结果,期间 arxiv 上没见过任何预印稿。
事已至此,XX 毫无办法,只好继续做出来进一步的结果。此刻,导师又说不忙发表,我这里会有博士后的位置,到时候再发表就行。于是学生 XX 就只好安心写毕业论文,等写好毕业论文提交系统之后,导师又说我这里的博士后没有了,你先回国休假吧。于是,XX 过上了没有薪资还要干活的苦日子。好不容易到了毕业那一天,导师说 XX 你要么就去巴西博士后,要么就不要留在学术界了。此时 XX 已经看透了学术界的本质,最终 XX 离开了学术界,极其不爽地去找了一份和科研毫不相关的工作。
过了一年,导师的另一位学生拿着这个课题弄到了青年基金。又过了四年,又是另外一位学生把 XX 博士论文其中的某些章节拆开重新发表,写了一篇极其 trivial 的论文,在此期间 arxiv 同样没有任何预印稿。
慢慢地 XX 接受了这样的人物设定,慢慢地 XX 确实淡化了对数学科研的期待,但慢慢地 XX 也看淡了所谓的科研过程。
在 2005 年左右,当年的手机还是 Nokia 的时代,移动端的娱乐方式并没有现在那么丰富。大家的娱乐方式通常来说就是聚在一起打扑克,或者在一起玩电脑游戏。当时比较风靡的单机游戏是暴雪公司开放的魔兽争霸,网络游戏也是该公司开发的魔兽世界。而大一的时候,绝大多数人还没有拥有自己的个人电脑,于是为了玩这些游戏通常都只能够去浦口大学门口的多瑙河网吧,因此一些人就出现了白天上课,晚上包夜的情况。也许是刚20岁出头的年纪身体比较好,到了30岁左右的时候,想通宵熬夜就是一件很困难的事情了。有趣的是,当时一个宿舍会有四个人,一旦有一个人开始打游戏,通常都会带动整个宿舍的人一起玩。
南大浦口的多脑河网络
而学生的想象力总是无穷的,总能够挖掘身边无数的资源,变腐朽为神奇。除了浦口大学门口的多瑙河之外,其实学校内部也有机房。当年大一的时候,数学系总会开设 C++ 编程设计这门课,既然是编程课,那么就需要上机实验,因此玉辉楼的数学系机房就是一个还不错的环境。不过既然是机房,那么它的硬件设施就肯定没有外面的网吧好。但是,机房总是免费的,于是就有一些同学会选择在机房玩一些小游戏,当年的几十台机器还是能够择优选择出几台机器可以运行 Diablo II 的。
南大浦口的玉辉楼
在 PC 游戏的时代,如果辅导员或者科任老师如果想抓学生玩游戏,只需要去网吧和宿舍转一圈,如果晚上没有去自习,基本上在宿舍打游戏的概率会很高。但是,目前是手机游戏的时代,除非这位老师有本事把成年人的手机全部没收,否则成年人只需要换个手机,换个电话号码,开个小号就可以解决问题了。手机的携带比电脑的携带方便太多了,只需要找个远离学校的地方就可以随便打游戏了,而且还不留下任何证据。
在大学本科期间,笔者也玩单机 PC 游戏,其中包括实况足球,魔兽争霸,暗黑破坏神 2;到了博士期间笔者也跟身边的博士生一起在玩暗黑破坏神 3,炉石传说,极品飞车等游戏。但是,玩这些游戏的同时并不影响笔者能够从学校正常毕业,不影响拿奖学金,更加不影响笔者未来在职场上的工作。直到今日,每周五晚上笔者都会跟身边的同事玩一玩王者荣耀放松心情。如果没有游戏的话,很难想象如何从枯燥乏味的学习,科研,工作中解脱出来。如果完全取消游戏的话,可能只能够去游泳健身了。读博的时候,笔者有一位师兄,属于少数的能够通过游戏赚钱的玩家,但是玩游戏这些事情并不影响其能够博士毕业,更加不影响他在未来的工作中取得很好的业绩。
在本人的毕业聚餐上,我表达了以后不继续做动力系统的想法,导师和答辩老师都说:“学了数学的人搞不了其他的,只能继续从事数学研究”。当时我就不以为然,觉得自己肯定能够做其他事情,但是修改论文一直在耗费我的时间,也没有努力学习转行技能,当时确实又不知道可以做什么。在最后一次见面的时候,导师跟我说:“如果想回数学界的话,两年内基本上还是可以回来的”。并且导师也跟我的同学表达 XX 未来肯定会回到数学界。但是,我后来找到了一份工作,日常搞搞机器学习和金融数学,最后就不考虑回数学界的事情了。