程序员的数学
去年我想了解一下这几年异常火热的人工智能方面的相关技术,在看了几本科技人文类型的书籍(例如《数据之巅》、《智能时代》)之后,买了一本教科书型的《机器学习》。然后却悲剧了... 因为我发现数学知识的不足阻碍了我流畅地阅读和理解这本书。很多人认为“不着急”是一个缺点,但我觉得有时候也是一个优点,不着急不意味着放弃,而是有一个长期奋战的准备。所以,我开始不着急读这本书,而是打算复习一下数学,以达到可以顺利看完这本书的程度。
然后从何看起呢?起初我打算重新复习下大学学过的数学三剑客:《高等数学》、《线性代数》、《概率论和数理统计》,但觉得周期可能过于漫长了,所以觉得还是曲线救国一下。于是买了这系列的三本书(另外两本的副标题分别是“概率统计”和“线性代数”),想要尽可能快速地复习一遍。因为重新复习数学不是为了研究,是为了能顺利学习机器学习(以及深度学习等),并进行相关的编程,因此也不追求过于深入,所以我觉得是合适的。
顺便一提,就算不学习机器学习,数学也是一个要长期学习的科目。再说一下《穷查理宝典》这本书,查理芒格在强调构建思维体系的时候,就建议搭建4个领域的知识模型:经济、会计、数学、心理。我也是打算将这四个学科作为计算机技术以外长期学习的方向。
闲扯了这么远,我们继续说回这本书。先说结果:我的如意算盘落空了,这本书过于基础,达不到我之前的期望。不知道这本书初中生能读不,但是高中生肯定可以。虽然读完也能有一些收获,但却比较少,好处是你不需要花很久,大概2天的时间,就可以通读完这本书。显然,我需要继续读本系列的其他两本书。
这本书分了9个章节,讨论了和程序员相关性比较高的数学问题。每个章节相对独立,即使挑选着一些章节阅读也不存在太大问题(不过好像很多技术书都是如此,和小说很不同)。
第1章,讲了数制,先讲了十进制,然后讲了十机制和二进制的转换。
第2章,逻辑。讲了命题和命题的真假、规则的完整性和排他性。由此,引申出了程序中的if判断语句,以及需要额外关注的边界值。还讲解判断复杂命题真假的工具:真值表和文氏图。
这章还讲了常见的逻辑关系:非、或、与、异或、相等、蕴含、这里比较难理解的是蕴含关系:若A则B。假设A命题是:乘客年龄为10岁以上,B命题是:乘客年龄为6岁以上,则它们的蕴含关系的真值表是这样的:
不满足“如果A,则B”这一命题的条件就是:A为true,而B为false的情况。当A为true,B为true时显然满足;而当A为false时,也满足。因为前提是:“如果A”,而A为false时,则不满足前提,所以不论B是真是假,都满足。
A | B | A => B |
---|---|---|
true | true | true |
true | false | false |
false | true | true |
false | false | true |
第3章,余数。这部分主要讲了使用余数去进行分组。去解决类似“今天是周一,1000天后是周几的问题”。还讲了奇偶校验和哥尼斯堡七桥问题。
第4章,数学归纳法。这部分高中数学都讲过了,又复习了一遍。作者举了个例子很有趣:数学归纳法就好像推倒多米诺骨牌。如果:1)第1张牌可以推倒;2)推倒其中的任何1张,它后面那张也会倒。那么就可以推倒全部的骨牌。
第5章,这部分讲了排列组合。这部分补充了一个概念,就是:置换。我记得以前学这里的时候,只有排列和组合,没有置换。这三个的定义和转换大体是这样的,因为符号不好敲,我就语言描述了:
- 置换:将n个事物进行排序,不同顺序的种类。按照乘法原理,结果是:n * (n-1) * (n-2) * ... * 1 = n!。
- 排列:从n个事物中取k个,考虑顺序。按照乘法原理,结果是:n * (n-1) * ... * (n-k+1)
- 组合:从n个事物中取k个,不考虑顺序。这就分成了两个步骤:先取排列,再除以重复计算的部分。而重复计算的部分,就是所选k个事物中重复的。其重复度,就是置换数,即k!。
第6章,这部分用汉诺塔为例子,讲解了递归。
第7章,讲了指数爆炸和对数,指数的简便运算方法。以及和对数相关的两分查找。这里比较有意思的是使用指数法则,将乘法转换为加法。
10a * 10b = 10a+b
所以如果要计算两个值:1000 * 10000,可以先取对数相加:3+4=7,然后再做指数运算 107。
第8章,是比较烧脑的一章。这章讲了反证法、可数和不可数、并由停机问题引出了无法编写的程序,即计算机无法解决的问题。这一章主要证明了并不是所有问题都可以藉由程序来解决。但实际工作中,几乎很少去考虑这种情况。
大概的内容就这些,总得来说,过于简单了。剩下的两本应该会更有难度一些吧。
感谢阅读,希望这篇文章能给你带来帮助!