链式法则
type
status
date
slug
summary
tags
category
icon
password
Property
 
很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。需要一些简洁的方法。
 
向量对向量求导的链式法则
假设多个向量存在依赖关系,比如三个向量 存在依赖关系,则有下面的链式求导法则:
该法则也可以推广到更多的向量依赖关系。但是要注意的是要求所有有依赖关系的变量都是向量,如果有一个是矩阵,,比如是 , 则上式并不成立。
 
从矩阵维度相容的角度也很容易理解上面的链式法则,假设 分别是 维向量,则求导结果 是一个的雅克比矩阵,而右边 是一个 的雅克比矩阵, 是一个的矩阵,两个雅克比矩阵的乘积维度刚好是 ,和左边相容。
 

标量对多个向量的链式求导法则

机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量,无法使用上面的链式求导法则,比如2向量,最后到1标量的依赖关系: ,此时很容易发现维度不相容。
矩阵对矩阵的求导
type
status
date
slug
summary
tags
category
icon
password
Property
 
假设有一个 的矩阵要对 的矩阵求导,那么根据求导的定义,矩阵 中的 个值要对矩阵中的 个值分别求导,那么求导的结果一共会有 个。那么求导的结果如何排列呢?方法有很多种。
最直观可以想到的求导定义有2种:
第一种是矩阵 对矩阵 中的每个值 求导,这样对于矩阵 每一个位置 求导得到的结果是一个矩阵 ,可以理解为矩阵 的每个位置都被替换成一个 的矩阵,最后得到了一个 的矩阵
第二种和第一种类似,可以看做矩阵 中的每个值 分别对矩阵 求导,这样矩阵 每一个位置 对矩阵 求导得到的结果是一个矩阵 , 可以理解为矩阵$F$的每个位置都被替换成一个 的矩阵,最后得到了一个的矩阵。
这两种定义虽然没有什么问题,但是很难用于实际的求导。
目前主流的矩阵对矩阵求导定义是对矩阵先做向量化,然后再使用向量对向量的求导。而这里的向量化一般是使用列向量化。也就是说,现在的矩阵对矩阵求导可以表示为:
对于矩阵 ,列向量化后, 的维度是 的向量,同样的, 的维度是 的向量。最终求导的结果,这里使用分母布局,得到的是一个 的矩阵。
 

矩阵对矩阵求导的微分法

向量化的矩阵对矩阵求导有什么好处呢?主要是为了使用类似于前面讲过的微分法求导。回忆之前标量对向量矩阵求导的微分法里,有:
最小二乘法
type
status
date
slug
summary
tags
category
icon
password
Property

最小二乘法的原理与要解决的问题

形如下式:
观测值就是多组样本,理论值就是假设的拟合函数。目标函数也就是在机器学习中常说的损失函数,目标是得到使目标函数最小化时候的拟合函数的模型。
 
举一个最简单的线性回归的简单例子,比如有个只有一个特征的样本:
样本采用下面的拟合函数:
样本有一个特征,对应的拟合函数有两个参数需要求出。
 
目标函数为:
梯度下降
type
status
date
slug
summary
tags
category
icon
password
Property

梯度

在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数,分别对 求偏导数,求得的梯度向量就是 ,简称 或者 。对于在点 的具体梯度向量就是 .或者 ,如果是3个参数的向量梯度,就是 ,以此类推。
 
那么这个梯度向量求出来有什么意义呢?
从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数,在点 ,沿着梯度向量的方向就是 的方向是增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 的方向,梯度减少最快,也就是更加容易找到函数的最小值。
 

梯度下降与梯度上升

在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
梯度下降法和梯度上升法是可以互相转化的。比如需要求解损失函数的最小值,这时需要用梯度下降法来迭代求解。但是实际上,可以反过来求解损失函数的最大值,这时梯度上升法就派上用场了。
 
 

梯度下降法算法

线性回归
type
status
date
slug
summary
tags
category
icon
password
Property

原理

线性回归的模型函数和损失函数

线性回归的问题一般是这样的
个样本,每个样本对应于维特征和一个结果输出:
问题是:对于一个新的 ,它所对应的是多少呢? 如果这个问题里面的是连续的,则是一个回归问题,否则是一个分类问题。
 
模型
对于维特征的样本数据,如果决定使用线性回归,那么对应的模型是这样的:
 

代码

逻辑回归
type
status
date
slug
summary
tags
category
icon
password
Property

原理

线性回归到逻辑回归

线性回归的模型是求出输出特征向量 和输入样本矩阵之间的线性关系系数,满足是连续的,所以是回归模型。如果是离散的话,怎么办呢?一个可以想到的办法是,对于这个再做一次函数转换,变为。令的值在某个实数区间的时候是类别A,在另一个实数区间的时候是类别B,以此类推,就得到了一个分类模型。如果结果的类别只有两种,那么就是一个二元分类模型了。
 

二元逻辑回归的模型

对线性回归的结果做一个在函数上的转换,可以变化为逻辑回归。这个函数在逻辑回归中一般取sigmoid函数,形式如下:
 
 
 

代码

 
最大熵模型
type
status
date
slug
summary
tags
category
icon
password
Property

原理

直观理解

如果手里拿着一个骰子,扔下去后是每一面朝上的概率是多少? 1/6。
为什么是1/6呢?为什么不是1/2或者1/3?如果再告诉你1朝上的概率是1/2呢?
当我们在猜测概率时,不确定的部分我们都认为是等可能的,就好像骰子一样,知道有六个面,那么在概率的猜测上会倾向于1/6,也就是等可能,换句话讲,也就是倾向于均匀分布。为什么倾向均匀分布?因为这样最保险呀!当被告知1朝上的概率是1/2时,剩下的我们仍然会以最保险的形式去猜测是1/10。
最大熵就是这样一个朴素的道理:凡是我们知道的,就把它考虑进去,凡是不知道的,通通均匀分布!
 

熵和条件熵

 

代码

 
 
EM算法
type
status
date
slug
summary
tags
category
icon
password
Property
 
EM算法也称期望最大化(Expectation-Maximum)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断等等。

EM算法要解决的问题

从样本观察数据中,找出样本的模型参数,经常用的方法就是极大化模型分布的对数似然函数。
但是在一些情况下,得到的观察数据有未观察到的隐含数据,此时未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。怎么办呢?这就是EM算法可以派上用场的地方了。
 
EM算法解决这个的思路是使用启发式的迭代方法,既然无法直接求出模型分布参数,那么可以先猜想隐含数据(EM算法的E步),接着基于观察数据和猜测的隐含数据一起来极大化对数似然,求解模型参数(EM算法的M步)。由于之前的隐藏数据是猜测的,所以此时得到的模型参数一般还不是想要的结果。不过没关系,基于当前得到的模型参数,继续猜测隐含数据(EM算法的E步),然后继续极大化对数似然,求解模型参数(EM算法的M步)。以此类推,不断的迭代下去,直到模型分布参数基本无变化,算法收敛,找到合适的模型参数。
 
EM算法是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模型分布参数,直到收敛,即得到需要的模型参数。
一个最直观了解EM算法思路的是K-Means算法,在K-Means聚类时,每个聚类簇的质心是隐含数据。会假设个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM算法的M步。重复这个E步和M步,直到质心不再变化为止,这样就完成了K-Means聚类。
 

EM算法的推导

感知机
type
status
date
slug
summary
tags
category
icon
password
Property

原理

感知机模型

感知机的思想很简单,比如在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。当然,如果找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。
使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分神经网络可以通过激活函数和增加隐藏层来让数据可分
 
用数学的语言来说,如果有个样本,每个样本对应于维特征和一个二元类别输出,如下:
目标是找到这样一个超平面,即:
让其中一种类别的样本都满足 ,另一种类别的样本都满足 ,从而得到线性可分。如果数据线性可分,这样的超平面一般都不是唯一的,也就是说感知机模型可以有多个解。
 

代码

支持向量机
type
status
date
slug
summary
tags
category
icon
password
Property

原理

支持向量机(Support Vecor Machine,SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域,并牢牢压制了神经网络领域好多年。如果不考虑集成学习的算法,不考虑特定的训练数据集,在分类算法中的表现SVM说是排第一估计是没有什么异议的。
SVM是一个二元分类算法,线性分类和非线性分类都支持。经过演进,现在也可以支持多元分类,同时经过扩展,也能应用于回归问题。

线性支持向量机的硬间隔最大化模型

线性支持向量机的软间隔最大化模型

线性不可分支持向量机与核函数

SMO算法

线性支持回归

 
 

代码

K近邻法(KNN)
type
status
date
slug
summary
tags
category
icon
password
Property

原理

KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同。
KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别;而KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值。两者区别不大,KNN的分类方法的思想对KNN的回归方法也适用。
由于scikit-learn里只使用了蛮力实现(brute-force),KD树实现(KDTree)和球树(BallTree)实现,这里只讨论这几种算法的实现原理。其余的实现方法比如BBF树,MVP树等不做讨论。

KNN算法三要素

KNN算法主要要考虑三个重要的要素,对于固定的训练集,只要这三点确定了,算法的预测方式也就决定了。这三个最终的要素是值的选取,距离度量的方式和分类决策规则。
对于分类决策规则,一般都是使用多数表决法。所以重点是关注与值的选择和距离的度量方式。
对于值的选择,没有一个固定的经验,一般根据样本的分布,选择一个较小的值,可以通过交叉验证选择一个合适的值。
  • 选择较小的值,就相当于用较小的领域中的训练实例进行预测,训练误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是泛化误差会增大,换句话说, 值的减小就意味着整体模型变得复杂,容易发生过拟合;
 

代码

 
朴素贝叶斯
type
status
date
slug
summary
tags
category
icon
password
Property

原理

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,都是判别方法,也就是直接学习出特征输出和特征之间的关系,要么是决策函数,要么是条件分布 。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出和特征的联合分布,然后用得出。
朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用。
 

朴素贝叶斯相关的统计学知识

贝叶斯学派很古老,但是从诞生到一百年前一直不是主流。主流是频率学派。频率学派的权威皮尔逊和费歇尔都对贝叶斯学派不屑一顾,但是贝叶斯学派硬是凭借在现代特定领域的出色应用表现为自己赢得了半壁江山。
贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。
 
条件独立公式,如果相互独立,则有:
 

代码