一直想写点东西,对各个知识块做一个梳理、总结,只是因为太懒,迟迟没有动笔。我很喜欢算法,而且我的编程之路是从MIT《算法导论》开始的,所以就从算法写起吧。
为什么学习算法?借用Charles(《算法导论》作者之一)在第一堂课上的一段话:”If you want to be a good programmer, you just program every day for two years, you will be an excellent programmer. If you want to be a world-class programmer, you can program every day for ten years, or you can program every day for two years and take an algorithms class.”
很多人喜欢形象化、故事化的描述,这种方式很吸引人而且比较有趣,但是只有直观感受是不够的,算法之美在于严谨之美、细节之美,而概括性的描述恰恰掩盖了细节。如果只是想了解一下某种算法大致是怎么回事,阅读一些描述性的文章是一个不错的选择,可是,如果想实现、分析甚至是优化算法,那就逃不掉严格的数学论证。算法的求解过程很大程度上就是一步步的数学推导与证明。
提起数学,就不能不谈《高等数学》、《线性代数》、《概率统计》,这三门课在大学是理工科学生的必修课。why? 因为这三门课涉及的数学知识是所有科学技术的基础,计算机自然也不例外。这三门课的核心是什么?有哪些是学习算法必须要掌握的呢?
高等数学的一大主题是微积分。对于微积分,应该知道微积分为什么会被引入数学,它解决了哪些问题。牛顿和莱布尼茨分别独立发明了微积分,他们不约而同使用了无穷小量,而无穷小量在逻辑上是矛盾的,这也是为什么当时有人质疑微积分,尽管它验证了很多自然规律。这一矛盾是通过极限概念的引入解决的,所以高数课本是从极限开始讲起的。
线性代数的核心是空间(四个基本子空间)和变换。所谓变换就是用不同的形式去描述同一个问题,这样的好处在于:有些看似不能解决的问题,经过恰当的变换往往变的很简单。比如分类:在二维空间里的一坨东西,当你它们变换到三维甚至是无穷维空间,哇,被很好的分开了,cool!但是这又引入了一些新的问题,比如数据稀疏,再比如计算机内存是有限的,怎么去存储无穷维的空间。世界就是这样,一个新问题的解决往往会引入更多的问题,有时候这些新问题反而更棘手。
概率是统计的基础。概率论分为频率学派和贝叶斯学派,我是贝叶斯学派的坚定支持者。这个世界本身是确定的,之所以会出现不确定性是因为我们的知识、信息有限,那么如何根据信息的变化,去更新我们的认知,从而达到对事物更精确的认识,这正是贝叶斯公式的魅力。
算法大致可以分为基础性的算法(排序、树、图…)和专业领域的算法。基础性的算法对数学技能的要求并不高,掌握数学归纳法就可以了。数学归纳法中学的时候就有学习和应用,是一种很朴素又很强大的数学工具。它可以解决很多算法设计问题。在《算法导论》的课堂上Erik曾经以调侃的语调说:“如果你们不知道这个问题该怎么解决,那就回答数学归纳法吧,大部分情况下它都是对的。”数学归纳法很简单,就像多米诺骨牌,只要证明第一张会倒;任意一张倒下,与它紧邻的下一张也会倒,那么所有的都会倒,多么自然。当然了数学归纳法也有一些变形,常见的有加强归纳、双向归纳、反向归纳等,套路都一样,把握好两个点:起始点和任意点,选择合适的归纳序列,就能驾驭数学归纳法了。对于这类常用算法,要重点掌握应用场景及其局限性,能够根据具体场景选择正确、高效的数据结构和算法。
专业领域算法,比如机器学习算法,对数学的要求就比较高了。机器学习玩的是概率,在很多的可能性中找到概率最大的那个,并以此为依据训练模型,在这个过程中会用到很多统计学规律,复杂的矩阵运算。又因为很多机器学习问题都可以转化为对目标函数的优化。凸函数具有很多优良的性质,所以对凸函数的优化也是一个重要主题。
学数学应该学什么?关键要充分理解抽象,学会从纷繁的表象中抽象出本质,培养深入思考的习惯,不断提升抽象的层次。数学证明是很枯燥的,兴趣很重要,首先你要喜欢数学,要不然一页一页的公式,很痛苦的。多看一些数学史和数学大师的故事对于数学兴趣的培养是有帮助的,你会看到深奥优美的数学是由这么一个又一个的人创造出来的:他们的一生或悲惨或动人,但都是传奇。
PS:
几门质量很高的数学和算法课程
1.MIT-线性代数
2.线性代数的本质
3.可汗学院-统计学
4.MIT-算法导论
5.斯坦福-机器学习
6.清华大学-数据结构
一个很棒的算法可视化网站:
VisuAlgo
刘未鹏算法三部曲:
1.知其所以然(以算法学习为例)
2.知其所以然(续)
3.知其所以然(三):算法为什么这么难
Lucida的博客《我的算法学习之路》(推荐的书都很不错):
我的算法学习之路