机器学习应该准备哪些数学预备知识?简单举例最小二乘法,.拉格朗日乘子法,.朴素贝叶斯等


 

对于绝大多数从事于机器学习的人来说,学数学的目的,主要是便于(深入)理解算法的思路。那么问题来了,我们到底要把数学学到什么程度?

我这里举几个例子:

1.线性最小二乘法

大家可以随意搜索一下,相关的文章很多。长篇大论的不少,刚入门的朋友一看到那些公式可能就看不下去了。比如下面的解释:

毫无疑问,这样的解释是专业的,严谨的。事实上,这是深度学习圣经里的解释。我并没有诋毁大师的意思,只是觉得用一个具体的例子来说明,可能会让读者更加容易理解:

小明是跑运输的,跑1公里需要6块,跑2公里需要5块(那段时间刚好油价跌了),跑3公里需要7块,跑4公里需要10块,请问跑5公里需要多少块?

如果我们有初中数学基础,应该会自然而然地想到用线性方程组来做,对吧。

这里假定x是公里数,y是运输成本(β1和β2是要求的系数)。我们把上面的一组数据代入得到这么几个方程:

如果存在这样的β1和β2,让所有的数据(x,y)=(1,6),(2,5),(3,7),(4,10)都能满足的话,那么解答就很简单了,β1+5β2就是5公里的成本,对吧。

但遗憾的是,这样的β1和β2是不存在的,上面的方程组很容易,你可以把前面两个解出来得到一组β1和β2,后面两个也解出来同样得到一组β1和β2。这两组β1和β2是不一样的。

形象地说,就是你找不到一条直线,穿过所有的点,因为他们不在一条直线上。如下图:

可是现实生活中,我们就希望能找到一条直线,虽然不能满足所有条件,但能近似地表示这个趋势,或者说,能近似地知道5公里的运输成本,这也是有意义的。

现实生活当中,有很多这样的例子,想起以前在某公司上班的时候,CEO说我们研发部做事有个问题:一个研发任务,要求三个月做完,因为周期太短,完成不了,就干脆不做,这显然是不对的,要尽全力,哪怕三个月完成了80%,或者最终4个月完成,总比不作为的好。

其实最小二乘法也是这样,要尽全力让这条直线最接近这些点,那么问题来了,怎么才叫做最接近呢?直觉告诉我们,这条直线在所有数据点中间穿过,让这些点到这条直线的误差之和越小越好。这里我们用方差来算更客观。也就是说,把每个点到直线的误差平方加起来:

(如果上面的四个方程都能满足,那么S的值显然为0,这是最完美的,但如果做不到完美,我们就让这个S越小越好)

接下来的问题就是,如何让这个S变得最小。这里有一个概念,就是求偏导数。这里我想提一下,在培训的过程中,我发现机器学习的数学基础课程当中,微积分是大家印象最深刻的,而且也最容易理解:比如导数就是求变化率,而偏导数则是当变量超过一个的时候,对其中一个变量求变化率。如果这个概念也忘了,可以参考我在深度学习回答里那个王小二卖猪的例子。这里就不细讲了:

Jacky Yang:深度学习如何入门?

要让S取得最小值(或最大值,但显然这个函数没有最大值,自己琢磨一下),那么S对于β1和β2分别求偏导结果为0,用一个直观的图来表示:

我们看到这条曲线,前半部分是呈下降的趋势,也就是变化率(导数)为负的,后半部分呈上升的趋势,也就是变化率(导数)为正,那么分界点的导数为0,也就是取得最小值的地方。这是一个变量的情况,对于多个变量的情况,要让S取得最小值,那最好是对β1和β2分别求导(对β1求导的时候,把β2当常量所以叫求偏导),值为0:

看到这个我们就熟悉了,两个变量,刚好有两个方程式,初中学过,那么很容易得出:

其实也就意味着

这个函数也就是我们要的直线,这条直线虽然不能把那些点串起来,但它能最大程度上接近这些点。也就是说5公里的时候,成本为3.5+1.4x5=10.5块,虽然不完美,但是很接近实际情况。

在培训的过程中,一直在思考一个问题,也就是上面提到的那个,机器学习到底要把数学掌握到什么程度?首先我们得搞清楚我们到底要拿机器学习干什么,机器学习本来就是要通过分析现实生活中的数据得出其中的规律,以便为将来各方面提供指导意义。既然是这样,为何不直接从现实中来到现实中去,直接用数据和案例来讲解数学呢。我们显然不是为了学数学才学的机器学习,那就没必要堆砌哪些晦涩的公式了。除非我们要做纯理论研究。

当然,数学的一些理念,思想或者精髓是需要掌握的,其实很多时候,我们都是在做不到完美的情况下,求那个最接近完美的解,别忘了机器学习很多情况下其实是在做拟合,所以说最小二乘法对于机器学习非常重要,这也是我把它当做第一个例子的原因。其实深度学习里的反向传播不也是一样么?刚开始不完美,但我要想办法让它越来越接近完美,预测值与实际值差距越来越小。所谓训练,其实也就是不断追求完美的一个过程。

2.拉格朗日乘子法

听到拉格朗日乘子法这个名字的时候,很多人的第一反应是:这玩意儿是不是很高深啊,先入为主地有了畏难的情绪。但我把它讲完以后,大部分人表示并不难,而且现实生活中,我们经常潜移默化会用到拉格朗日乘子法。甚至可以说,不用拉格朗日乘子法的人生都是不完整的人生。

我们来看一下定义:

虽然这个定义应该说是很简洁明了的,但对于大部分人来说,依然还是有点懵。不太清楚为什么要这么做。拉格朗日到底要搞什么飞机?

我们还是举个例子:某工厂在生产过程中用到两类原材料,其中一种单价为2万/公斤,另一种为3万/公斤,而工厂每个月预算刚好是6万。就像下面的公式:

经过分析,工厂的产量f跟两种原材料(x1,x2)具有如下关系(我们暂且不管它是如何来的,而且假定产品可以按任意比例生产):

请问该工厂每个月最少能生产多少?

其实现实生活中我们会经常遇到类似的问题:在某个或某几个限制条件存在的情况下,求另一个函数的极值(极大或极小值)。就好比你要在北京买房,肯定不是想买什么房子就买什么房子,想买多大就买多大,而是跟你手头的金额,是否有北京户口,纳税有没有满五年,家庭开支/负担重不重,工作单位稳不稳定都有关系。

回到工厂的例子,其实就是求函数f的极值。上面我们提到,极值点可以通过求偏导(变化率为0的地方为极值点)来实现,函数f(x1,x2)对x1,x2分别求偏导,那么得出的结论是:x1,x2都为0的时候最小,单独看这个函数,这个结论对的,很显然这个函数的最小值是0(任何数的平方都是大于或等于0),而且只有x1和x2同时为0的时候,取得最小值。但问题是它不满足上面的限制条件。

怎么办呢?拉格朗日想到了一个很妙的办法,既然h(x1,x2)为0,那函数f(x1,x2)是否可以加上这个h(x1,x2)再乘以一个系数呢?任何数乘以0当然是0,f(x1,x2)加上0当然保持不变。所以其实就可以等同于求下面这个函数的极值:

我们对x1,x2以及λ分别求偏导(极值点就是偏导数均为0的点):

解上面的方程组得到x1=1.071,x2=1.286 然后代入f(x1,x2)即可。

这里为什么要多加一个乘子λ呢,试想一下,如果λ是个固定的数(比如-1),我们也能通过上面的方程式1,2求解得到x1,x2,但是我们就得不到方程式3,其实也就是没有约束条件了。所以看到没有,拉格朗日很聪明,他希望我们在求偏导(极值点)以后,还能保留原有的约束条件。我们上面提到,单独对函数求极值不能保证满足约束条件,拉格朗日这么一搞,就能把约束条件带进来,跟求其他变量的偏导结果放在一起,既能满足约束条件,又能保证是约束条件下的极值。借用金星的一句话:完美!

当然这是一个约束条件的情况,如果有多个约束条件呢?那就要用多个不同的λ(想想为什么),正如最上面的那个定义那样,把这些加起来(这些0加起来也是0)。

机器学习里的数学,我感觉只需要掌握里面这个核心思想即可,就像拉格朗日乘子法,求条件极值---》转化为求(函数+条件)的极值,每一步都很妙。其实我想说的是,体会这种妙处以后,再看SVM的算法,会感觉舒服很多,数学主要是为了让人更好地理解算法,并不是为了数学而学数学。人生苦短,还成天被晦涩的书籍所困扰,“感觉身体好像被掏空”,这样真的好么?

3.朴素贝叶斯

之所以把这个拎出来,是因为我一直想吐槽一下那个公式:

我想吐槽,是因为几乎没有一篇文章解释这个公式是怎么来的。很多文章一上来就是这个

公式。对于已经对条件概率没多少概念的朋友来说,脑子里其实一直有疑问。其实要解释并不难,把P(B)放到左边,除法改成乘法就容易理解多了。

P(A|B) x P(B) = P(B|A) x P(A)

也就是:B发生的概率 x B已经发生的情况下A发生的概率 = A发生的概率 x A已经发生的情况下B发生的概率。

如果这个不好理解,我们还是举个例子:

如上图所示,口袋里有5个球(2个蓝色,3个红色),每次取一个,可能的结果如下图所示:

第一次取出来是蓝色球的概率是2/5,我们把这个概率叫P(A),然后在A发生的情况下,再取出一个红球的概率是多少?显然是3/4,因为只剩下3个红球一个蓝球,这个3/4就是P(B|A),也就是在A发生的情况下,B发生的概率,这叫条件概率。我们把他们相乘得到:

(2/5) x (3/4)=3/10

接着我们换另一个方式算:如果第一次取到红球,第二次取到蓝球。同理,P(B)为3/5,P(A|B)为2/4,两个相乘:(3/5) x (2/4)=3/10

他们是相等的。也就是说:P(A|B) x P(B) = P(B|A) x P(A)

这个并不是特例,看下面的公式:

事实上,P(A and B) 和P(B and A)是一样的,只是一前一后发生的顺序不同。

我们把这个公式P(A|B) x P(B) = P(B|A) x P(A)的P(B)拿到另一边,这就是朴素贝叶斯的公式。

除了上面几个例子,其实还有很多方面,都可以用不那么晦涩的方式去解读。比如高斯分布,很多文章,包括一些经典书籍,一上来就是那个公式:

然而很多人并不太明白,为何要用这样的分布,为什么叫正态分布,而不叫变态分布。其实它是大自然的一种普遍规律。

其实可以用这个图:

这是统计学生两门学习成绩总和(总分200分),横轴是分数,纵轴是所占的比例。我们发现,学霸和学渣都比较少,大部分人都集中在150分左右(很显然,大部分人都是你我这种普通人嘛),如果统计样本足够大,以至于达到无穷,那就变成了钟形曲线。普通人的平均分数,就是高斯分布里的那个μ,也就是均值,而那个σ怎么解释呢?就是你这个曲线越陡,σ越小,这个叫方差。试想一下,如果大家都挤成一坨,成绩都差不多,差别小,也就是方差小,中间的方块占的比例就越高,当然就越陡了。如下图:

另外,还有一些概念,比如正交,很多朋友问起过这个问题:Jacky,向量正交的概念我在大学里学过,但就是不知道为啥要正交?

其实我们要理解正交,可以先理解什么是相交,两条直线相交表明存在一定的夹角,但这个夹角可大可小,如果是0的情况下,他们是在一条线上的(向量都是过原点的,这里我们不考虑不过原点的情况),180度的时候也是在一条直线上,这个两种情况我们都可以认为他们是线性相关的,那么什么时候,最不相关呢,很显然是90度的时候,也就是垂直的时候。除了垂直和平行的情况,夹角在0-90度或者90度到180度之间的情况,相关性介于垂直和平行之间。

我们试想一下,如果我们要把一组数据分解成不同的特征,我们希望每个分量各自具有独立的特点呢?还是希望每个分量,你中有我,我中有你好呢?显然是越无关越好,如果他们之间太“暧昧”,就没有特点了。最好是各个分量,两两互相垂直。当然,垂直是几何上的解释,对于向量来说,更严谨的说法(多维)就是正交。

关于机器学习中数学的通俗化表达,限于篇幅(太长看了也累),先聊到这里,目前还在继续整理当中,想到哪说到哪,思路还不够清晰,希望在本次培训结束以后,能整理出一个完整的版本。同时也请业内朋友多提宝贵意见和建议。

如果在阅读PRML和deep learning的过程中,对有些数学部分不太清楚,也请在评论区留言或者私信给我也可以。请列出具体的内容或对应的书的页数。最近在写一本小册子,也很希望收到朋友们的需求,痛点及反馈。谢谢。

关于数学基础课程列表,几个高票答案总结的很全了,这里我就不重复贴了。不过有人总结了一份文档,里面列出了机器学习中用到的数学基础,虽然没有详细描述,但思路清晰,简洁明了,可以参考:

http://www.cogsci.ucsd.edu/~ajyu/Teaching/Cogs118A_wi10/Refs/basic_math.pdf

编辑于 2017-11-10 08:13

​赞同 1032​​83 条评论

​分享

​收藏​喜欢收起​

更多回答

机器之心

机器之心

数学等 2 个话题下的优秀答主

​ 关注

727 人赞同了该回答

机器之心整理

本文作者依据自身经验给出了一套快速上手的可行方法及学习资源的分类汇总,机器之心在其基础上做了增益,希望对读者有所帮助。

先决条件
机器学习的基础是数学。数学并非是一个可选可不选的理论方法,而是不可或缺的支柱。如果你是一名计算机工程师,每天使用 UML、ORM、设计模式及其他软件工程工具/技术,那么请闭眼一秒钟,忘掉一切。这并不是说这些概念不重要,绝不是!但是机器学习需要一种不同的方法。如今 Python 如此流行的原因之一是其「原型设计速度」。在机器学习中,一种使用几行代码即可建模算法的语言绝对是必要的。

微积分、线性代数、概率论在机器学习几乎所有算法中不可或缺。如果你的数学背景很扎实,请跳过这一章节。如若不然,那么重新温习一下这些重要概念也不错。考虑到理论的数量,我并不建议大家从大部头开始。尽管一开始可以用它查询具体概念,但是初学者先关注简单的话题比较好。网上有很多好的在线资源(比如 Coursera、可汗学院或优达学城),实用且适合各种背景的人群。但是我建议从提纲之类的简明书籍上手,其中所有核心概念均被涉及,次要概念可在需要的时候自行查询。这种方法虽然不够系统,但却避免了这样的缺陷:大量晦涩概念使得没有扎实理论背景的人望而却步。

初学者最好先学习下列内容:

概率论

  • 离散型和连续型随机变量
  • 主要分布(伯努利分布、二项式分布、正态分布、 指数分布、 泊松分布、Beta 和 Gamma 分布)
  • 矩估计和最大似然估计
  • 贝叶斯统计
  • 相关性系数和协方差(Correlation and Covariance)

线性代数

微积分

网上有很多免费资源,比如

维基百科上也有很多好资源,对方程、定理等进行了清晰易懂的解释。

机器之心也介绍过许多数学基础与概念:

机器学习主要需要的数学基础就是微积分、线性代数、概率论,我们感觉只需要掌握大学中常见的高数、线性代数、概率论与数理统计三门课程,基本上概念的理解就没什么问题了。如果再学一点数值计算和最优化等,我们基本上就能理解机器学习的学习过程推导。

机器学习方法建议(面向初学者)

特征工程

开始机器学习的第一步是理解如何评估和改进数据集的质量。管理特征的类别和缺失、归一化和降维(PCA、ICA、NMF)是大幅提高算法性能的基本技术,而且还有助于研究如何将数据集分割成训练集和测试集、如何采取交叉验证来取代传统的测试方法。

机器之心也曾详解过特征工程如 PCA 降维算法的详细理论与推导,当然我们还介绍了其它有关特征的概念:

Numpy:Python 数值计算之王!

使用 Python 时,Numpy 不仅仅是一个库。它是几乎所有机器学习实现的基础,因此了解它的工作原理、关注向量化和广播(broadcasting)是非常必要的。这些技术可以帮助加速大多数算法的学习过程,利用多线程和 SIMD、MIMD 架构的力量。

官方文档已经很完整了,不过,我还建议大家看一下以下资源:

数据可视化

Matplotlib 即使不是纯粹的机器学习话题,了解如何可视化数据集也很重要。Matplotlib 可能是最广泛使用的解决方案:Matplotlib 易用,允许绘制不同种类的图表。Bokeh 和 Seaborne 提供了有趣的替代方案。不必要彻底了解所有包,但是了解每一个包的优点和弱点还是很有用的,可以帮助你选择合适的包。

了解 Matplotlib 细节的资源:《掌握 Matplotlib》,McGreggor D. 著

线性回归

线性回归是最简单的模型之一,可以把它作为一个优化问题来研究,该问题可通过最小化均方误差而得到求解。该方法虽然有效,但是限制了可利用的可能性。我建议还可以把它当作贝叶斯问题,使用之前的可能性展示参数(比如,高斯分布),优化变成了最大似然估计(Maximum Likelihood Estimation,MLE)。即使这看起来更加复杂,但该方法提供了一个可供几十个其他复杂模型共享的新方法。

Coursera 上介绍贝叶斯统计的课程:

以及这两本书:

包括线性回归在内,机器之心曾介绍了一些解决回归问题的方法(后文提供了 CART 算法进行回归分析):

线性分类

通常情况下,Logistic 回归是最佳起始点,也是研究信息论进而了解信息熵、交叉熵互信息的好机会。类别交叉熵(Categorical cross-entropy)是深度学习分类中最稳定、使用最广泛的代价函数,一个简单的 logistic 回归可以展示它是如何加速学习过程的(与均方差相比)。另一个重要的话题是正则化(Ridge、Lasso 和 ElasticNet)。很多情况下,人们认为它是一种提高模型准确率的深奥方式,但是它的真实意义是更准确,在具体实例的帮助下变得易于理解。我还建议刚开始的时候,把 logistic 回归当作一个简单的神经网络,可视化(以 2D 实例为例)权重向量在学习过程中的移动轨迹。

我还建议本节应包括超参数网格搜索。网格搜索不在没有完整了解的情况下尝试不同的值,而是评估不同的超参数集的性能。因此,工程师可以将注意力集中在可达到最高准确率的组合上。当然还有更加强大的贝叶斯优化方法,即利用先验知识逼近未知目标函数的后验分布从而调节超参数的方法。

支持向量机(SVM)

支持向量机提供了不同的分类方法(包括线性和非线性方法)。该算法非常简单,具备基础几何知识的人也可以学会。不过,了解核支持向量机的工作原理非常有用,因为它会在线性方法失败的时候展示出其真正实力。

一些有用的免费资源:

决策树

决策树提供了另一种分类和回归的方法。通常,它们不是解决复杂问题的首选,但它们提供了完全不同的方法,即使是非技术人员也可以很容易理解,该方法还可以在会议或演示中可视化。

集成学习一览

在理解了决策树的动态特性以后,研究集成训练树的集(集成)来提高整体准确率的方法很有用。随机森林、梯度树提升和 AdaBoost 都是强大的算法,且复杂度较低。对比简单的树和提升方法与 bagging 方法采用的树的学习过程挺有趣的。Scikit-Learn 提供了最常见的实现方法,但是如果你想更好地驾驭这些方法,我还是建议你在 XGBoost 上多花些时间,XGBoost 是一个既适用于 CPU 又适用于 GPU 的分布式框架,即使在较大的数据集上也能加速学习过程。

聚类

当开始聚类方法的学习时,我的建议是从高斯混合算法(基于期望最大化/EM)学起。虽然 K-均值聚类要更加简单易懂(也是必须要学习的),但是高斯混合算法为我们提供了纯粹的贝叶斯方法,在其他类似任务中也十分实用。其它必学的算法还有层次聚类(Hierarchical Clustering)、谱聚类(Spectral Clustering)和 DBSCAN。这对你了解基于实例的学习或研究 K-近邻算法(既适用于有监督又适用于无监督任务)也是有帮助的。谱聚类的一个有用的免费资源是:

  • 《谱聚类教程》,Von Luxburg U 著

聚类算法是无监督学习中的代表,机器之心也曾详细地介绍过各种聚类方法与实现:

神经网络入门

神经网络是深度学习的基础,你可以在单独的课程中学习神经网络。但是,我认为理解感知机、多层感知机以及反向传播算法的概念也很有帮助。Scikit-Learn 提供了一个实现神经网络的简单方法,但是,开始探索 Keras 也是一个好主意,Keras 是一个基于 Tensorflow、Theano 或 CNTK 的高级架构,允许使用最少的努力对神经网络进行建模和训练。开始神经网络学习的一些好资源:

目前最好的深度学习书籍可能就是:

最后,我们将介绍部分机器之心曾发过的综述性技术文章或论文,并希望这些文章能对大家全面理解各种方法有所帮助:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值