机器学习必备数学知识

一、入门基础
1. 微积分(求导,极限,极值)例如传统的BP神经网络的训练算法实际上是基于复合函数求导的链式法则,又比如目前多数的监督学习训练算法都基于极大似然估计,而极大似然估计的求解往往涉及求导,求极值的内容。


a. 微积分是最基础的数学内容了,平时我们接触的用的也是最多的,微积分的教材和课程也是多如牛毛,仅仅推荐一个 Essence of calculus(https://goo.gl/sfHext),作者以拉风的动画,深入的理解带你回顾一下微积分的关键概念。


2. 线性代数(矩阵表示、矩阵运算、特征根、特征向量)是基础中的基础,主成分分析(PCA)、奇异值分解(SVD)、矩阵的特征分解、LU 分解、QR 分解、对称矩阵、正交化和正交归一化、矩阵运算、投影、特征值和特征向量、向量空间和范数(Norms),这些都是理解机器学习中基本概念的基础。某篇图像分割1w+引用的神文核心思想便就求解构造矩阵的特征向量。


a. 线性代数课程首推  MIT的 Gilbert Strang老爷子的课程。第一次听老爷子的课程,看到矩阵乘法竟然有四种理解方式的时候着实是惊呆了,原来线性代数可以这么美。看到SVD分解的时候马上就能感觉到SVD分解能在很多场景排上大用场。同时该课程深入浅出,相信一般本科生都可以看懂。课程链接如下:Video Lectures | Linear Algebra | Mathematics | MIT OpenCourseWare(http://t.cn/RmyqB2v)


b. 3Blue1Brown的Essence of linear algebra(https://goo.gl/ZuwgNK)以非常直观的角度审视了线性代数的重要概念,直观但不失深刻,配合上高大上的动画效果,让人体会到了大道至简的感觉。一共15个视频,每段视频大约十分钟左右,花费不了多少时间就能看完。


3. 数据处理当然需要编程了,因此C/C++/Python任选一门(推荐Python,因为目前很多库和Library都是用Python封装),数据结构可以学学,让你编程更顺手更高效,但是编程不是数据处理的核心。熟练使用Matlab或者Python调用opencv库是必要条件,但是again他们只是工具,业余时间自学,多练练就没问题。


a. C++:coursera上的 C++程序设计(https://goo.gl/eAGvSz) 就很好,适合有C语言基础的人去进一步学习。国内多数工科出身的非计算机软件专业的学生一般都只学过C语言,而C语言本身的风格比较“硬”,从C语言转到面向对象的程序设计,需要有一个思想上的适应过程。


b. 优达学城上的计算机科学导论(https://goo.gl/Lp3YjJ )是一门零基础的Python入门课程。该课程的特点是深入浅出的授课方式,在讲解Python语法的同时背后潜移默化的传递着程序设计的思想,包括数据结构,代码风格,Debug的小技巧。课程中间还穿插入一些对大牛的采访,大大提高了课程丰富性。


c. 最后说一下C++的经典教材C++ prime plus,该书的厚度达到了一个很厚的境界,初学者基本不可能从头看到尾,更倾向于本书是一个字典式的查询式的书籍,需要的时候读其中1-2章节。套用一句经典语:不要想着一下子掌握一门编程语言的所有特性。


4. 算法(算法复杂度)。通常高校都会有算法类的课程,会概述各类算法的基础和应用,其中包括:精确算法、近似算法、启发式算法、演化算法、递归算法、贪婪算法等待,还有各类优化算法。这部分内容很多会和数据结构相互关联。


a. 算法类的课程推荐coursera上面的 Algorithms(https://goo.gl/at64Gz), 这个课程分为part1 和 part2两部分。该课程基于Java语言,个人觉得熟悉任何一门面向对象的语言(例如:C++)也不妨碍对该课程的学习。对于非CS出身的同学,该课程有相当的难度,课件的动画非常赞能够帮助你很形象的去理解各种算法,同时对算法的理论分析也有相当的深度(如果对理论的推导不感兴趣可以跳过,先暂时直接记住结论也行)。


二、中级教程
1. 概率论+统计(很多数据分析建模基于统计模型)、统计推断、随机过程。可以毫不夸张的说,概率论+统计是机器学习的核心数学理论,前面提到的微积分和线性代数实际上是扮演打工仔的角色。进一步说大多数情况下,我们会依据概率论+统计推到出一个机器学习模型或者算法,而最终的计算过程往往要依赖微积分和线性代数。所以如果你仅仅是实现一个机器学习算法,那么掌握初级教程里边提到的微积分和线性代数就足够了,如果你想进一步探究机器学习算法为什么是这样的,你想解释机器学习模型为什么好用或者不好用,就需要概率论+统计的知识。


a. 一个是MIT的概率系统分析与应用概率Probabilistic Systems Analysis and Applied Probability(https://goo.gl/stzNFZ),这个是课程主页,课程视频相关资料和教材都有。这门课的主要教材是introduction to probability(https://goo.gl/qWeZzM),作者是Dimitri P. Bertsekas,作者以幽默的语言去诠释概率论,这一点是非吸引人的。


b. 国内也有一个不错的教材,就是陈希儒的概率论与数理统计,该教材最经典的莫过于,用一个时间段内某个路口发生交通事故的实例去解释泊松分布为啥是这个长这个样子,力图告诉你分布背后的故事,而不是拘泥于计算。该课程也有网络视频课程不熟悉英文课程的同学也可参考 中科大 概率论与数理统计(http://t.cn/RmyKd8W)。


2. 线性规划+凸优化(或者只学一门叫Numerical optimization,统计、机器学习到最后就是求解一个优化问题)、非线性规划等。个人觉得机器学习里边最常用到的优化内容都是属于Numerical optimization 和 凸优化的,所以各推荐一门课程学习。


a. 凸优化自然是首推Stephen Boyd 和 Lieven Vandenberghe的 教材Convex optimization(http://t.cn/Rmy9Z9w) 与该教材对应的斯坦福的课程为 Convex optimization(https://goo.gl/inJExJ)。该书分为三部分,理论(主要介绍凸集,凸函数,凸优化等等概念),应用(凸优化在各种问题上的应用,只有真正的做过这些应用问题才能对这一章感悟很深),算法(这部分相对来说比较普通)。


b. Numerical optimization 的主要内容是基于梯度的优化算法,线搜索方法,线性规划,可微的非线性规划问题。这里推荐Jorge Nocedal和Stephen J.Wright的 Numerical optimization 与该教材对应的课程为Numerical optimization(http://t.cn/Rmy9eQV)。该教材的特点是基本上把最常见的优化问题都覆盖了,同时完全可以感受到虽然是优化教材但是其思想很计算机,作者总是会用一些小技巧来千方百计的降低算法的计算量(就像数据结构里边的算法一样)。不同于上面那本凸优化书理论气息过于严重,本书的作者基本上是以算法为核心(虽然数学理论证明也一点不少),算法伪代码很多,如果会一门编程语言的同学马上就可以去实践了。初学者可以适当抛开部分数学理论证明,更多的放到理解算法Motivation上去,同时亲自去实践这些算法会更好一些。


补充说明:
1)概述
1.1. 线性代数
矩阵论、线性空间、特征值和特征根、范数和距离


1.2. 微积分
极限、导数、微分;向量微积分;泰勒展开式;离散性和连续性变量


1.3. 概率论
概率基础;统计与假设检验;贝叶斯理论;常用概率分布;随机过程


1.4. 动力学分析
微分方程;非线性动力系统


1.5. 优化理论
一阶优化;二阶优化;非线性优化


1.6. 信息论
墒的原理;信息的度量


1.7. 控制论


2)线性代数
想要学习深度学习,你第一个需要理解透彻的学问是线性代数。为什么?因为深度学习的根本思想就是把任何事物转化为高维空间的向量,强大无比的神经网络,说来归齐就是无数的矩阵运算和简单的非线性变换的结合。
线性代数核心需要掌握的是线性空间的概念和矩阵的各项基本运算,对于线性空间的各类概念,矩阵的各种基本运算等等都要有非常深厚的功力。


3)概率论
概率论是整个机器学习和深度学习的语言,因为无论是深度学习还是机器学习所做的事情均是预测未知。预测未知你就一定要对付不确定性,整个人类对不确定性的描述都包含在了概率论里面。


4)微积分
微积分和相关的优化理论算是第三个重要的模块,线性代数和概率论可以称得上是深度学习的语言,那微积分和相关的优化理论就是工具了。深度学习,用层层迭代的深度网络对非结构数据进行抽象表征,这不是平白过来的,这是优化出来的,用比较通俗的话说就是调参。整个调参的基础,都在于优化理论,而这又是以多元微积分理论为基础的。这就是学习微积分也很重要的根源。


5)优化理论
机器学习里的优化问题,往往是有约束条件的优化,因此拉格朗日乘子法就是你逃不掉的魔咒。
优化理论包含一阶和二阶优化,传统优化理论最核心的就是牛顿法和拟牛顿法。

猜你喜欢

转载自blog.csdn.net/zhaocen_1230/article/details/80248445