机器学习算法

目录

线性回归

线性回归到底是什么?

假设数据为:
D=(x1,y1),,(xN,yN)D = (x_1,y_1), \cdots , (x_N,y_N)
记为:
X=(x1,x2,,xN)T,Y=(y1,y2,,yN)TX = (x_1,x_2,\cdots,x_N)^T,Y = (y_1,y_2,\cdots, y_N)^T
假设:
h(x)=hθ(x)=θ0+θ1x1+θ2x2++θNxN=θTXh(x) = h_\theta(x) = \theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_Nx_N = \theta^TX
线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。

x1,,xNx_1, \cdots,x_N代表了不同的特征(features),θ\theta在这里是参数,也可以理解为权重,意思是调整特征中每个分量的占比,那么我们需要设计一个机制来对θ\theta进行评估,来用一个函数J(θ)J(\theta)来描述hθ(x)h_\theta(x)不好的程度。

核心思想

所以如何构造J(θ)J(\theta),也就是我们所谓的损失函数就十分重要!

最小二乘法

我们采用二范数定义的平方误差来定义损失函数:

J(θ)=i=1NθTxiyi22J(\theta) = \sum_{i=1}^{N} ||\theta^Tx_i-y_i||_2^2
展开得到:
J(θ)=(θ)TXTXθ2θTXTY+YTYJ(\theta) = (\theta) ^TX^TX\theta-2\theta^TX^TY+Y^TY
估计最小化上面的值的θ^\hat{\theta}
θ^=argminθJ(θ)\hat\theta = arg\min \limits_{\theta} J\left(\theta\right)
我们对损失函数关于参数θ\theta求导使其等于0,从而解出θ^\hat{\theta}
θ^=(XTX)1XTY=X+Y\hat{\theta} = (X^TX)^{-1}X^TY=X^+Y
这个等式也叫normal equation,其中的θ^=(XTX)1XT\hat{\theta} = (X^TX)^{-1}X^T被称为伪逆。对于行或列满秩的XX,可以直接求解,但是矩阵的逆可能会求起来比较慢,而对于非满秩的样本,需要使用奇异值分解,也就是SVD方法,得到
X=UΣVTX=U\Sigma V^T
所以:
X+=VΣ1UTX^+=V\Sigma^{-1}U^T

在几何角度上

这里,最小二乘法相当于直线与实验值的距离的平方和,我们希望这个距离越小越好,也就是所谓点到直线的最短距离,就是垂直的情况。那么延伸到高维的情况,假设我们的实验样本张成一个p维空间(满秩):X=Span(x1,,xN)X = Span(x_1, \cdots , x_N),而h(x)=hθ(x)=θTXh(x) = h_\theta(x) = \theta^TX,也就是x1,,xNx_1, \cdots , x_N的某种线性组合,那么这个距离的差值应该和这个张成的空间垂直才能保证距离的最小化。
XT(YθTX)=0θ=(XTX)1XTYX^T \cdot (Y-\theta^TX) = 0 \Rightarrow \theta = (X^TX)^{-1}X^TY

梯度下降法

J(θ)=12i=1N(hθ(x(i))y(i))2J(\theta) = \frac{1}{2} \sum_{i=1}^{N} (h_\theta(x^{(i)})-y^{(i)})^2
我们要寻找θ\theta使得J(θ)J(\theta)最小,因此问题归结为求极小值问题,步骤如下:

  1. 首先对参数随机赋值
  2. 改变参数,使得损失函数按梯度下降的方向减少,梯度方向有偏导决定,因为求的为极小值,所以梯度方向是偏导的反方向,迭代方式有两种:
      • 批梯度下降:
        对全部的训练数据求得误差后在对参数进行更新
      • 增量梯度下降:
        每扫描一步都对参数进行更新(可能不断在收敛出徘徊)
  3. 重复直到收敛

选用误差函数为平方和的概率解释

至于为什么我们把损失函数定义为上述的形式,我们从概率方面来解释。假设根据特征的预测结果和实际结果有误差ϵ(i)\epsilon^{(i)},那么预测结果和真实结果满足:
y(i)=θTx(i)+ϵ(i)y^{(i)}=\theta^Tx^{(i)}+\epsilon^{(i)}
一般,误差满足均值为0的正态分布,那么
p(y(i)x(i);θ)=12πσexp((y(i)θTx(i))22σ2)p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp\Big(-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}\Big)
这样就估计了一条样本结果的概率,然而我们希望概率积最大。注意这里的概率积是概率密度函数积,连续函数的概率密度函数与离散值的概率函数不同。这个概率积成为最大似然估计。
J(θ)=log p(YX;θ)=log i=1Np(y(i)x(i);θ)J(\theta) = log \space p(Y|X;\theta) = log \space \prod_{i=1}^{N}p(y^{(i)}|x^{(i)};\theta)
argminθJ(θ)=argminθi=1N(y(i)θTx(i))2arg\min \limits_{\theta} J(\theta) = arg\min \limits_{\theta} \sum_{i=1}^{N}(y^{(i)}-\theta^Tx^{(i)})^2
这就解释了为什么损失函数使用平方和。

线性回归的优缺点

改进

正则化

针对过拟合情况,我们有以下选择:

补充:

实际应用和代码展示

小结

线性回归模型是最简单的模型,但是麻雀虽小,五脏俱全,在这里,我们利用最小二乘误差得到了闭式解。同时也发现,在噪声为正态分布的时候,MLE的解等价于最小二乘误差,而增加了正则项后对模型过拟合情况进行改善,分别介绍了Lasso和Ridge的特点和区别。

虽然线性模型简单且易于理解,但是也有很多局限性,比如对非线性数据效果不好,对异常值敏感,无法解决分类问题,受制于特征间的线性相关性以及易造成维数灾难等等。

逻辑回归

逻辑回归是什么?为什么要引入?

一句话概括:逻辑回归假设数据服从伯努利分布,通过极大似然化函数的方法,运用梯度下降来求解参数,从而达到二分类的目的。

首先逻辑回归虽名为回归,但并不是一个回归方法,它主要用来解决二分类问题,面对分类问题,上文的线性回归显得无能为力,从下图可以看到,线性回归在对作为离散变量存在的y时,只能用直线进行拟合,并且所预测的y可能会超过0到1的范围,并且对异常值非常敏感

那么我们想引入非线性元素,来解决以上两个问题,我们希望输出的值p(y=1X;θ)p(y=1|X;\theta)保证在 0011 之间,并且对异常值不在敏感。

对一个二分类问题,我们假设:

Predict={1if hθ(x)0.50if hθ(x)<0.5 Predict=\left\{ \begin{array}{rcl} 1 & & {if \space h_\theta(x) \geqslant0.5}\\ 0 & & {if \space h_\theta(x)<0.5} \end{array} \right.

这里的hθ(x)h_\theta(x)跟前面定义的一样,是θTX\theta^TX,相当于所有特征的线性组合,当然这里的0.5并不是绝对的,我们只是常用0.5来作为一个门槛,来界定如何分类。

那么我们如何引入非线性因素来完成二分类任务呢?

核心思想:Sigmoid函数、极大似然估计、损失函数(包含理论推导)

第一部分:Sigmoid函数

我们利用判别模型来对 p(y=1X;θ)p(y=1|X;\theta) 建模,利用贝叶斯定理:

p(y=1X;θ)=p(X;θy=1)p(y=1)p(X;θy=1)p(y=1)+p(X;θy=0)p(y=0) p(y=1|X;\theta) = \frac{p(X;\theta|y=1) p(y=1)}{p(X;\theta|y=1) p(y=1)+p(X;\theta|y=0) p(y=0)}
a=lnp(X;θy=1)p(y=1)p(X;θy=0)p(y=0)a = ln\frac{p(X;\theta|y=1) p(y=1)}{p(X;\theta|y=0) p(y=0)},于是:

p(y=1X;θ)=11+exp(a)p(y=1|X;\theta) = \frac{1}{1+exp(-a)}

上面的公式就是所谓的Sigmoid函数,图像如下:

其中的参数表示了两类联合概率比值的对数,我们并不关心这个参数的具体值,因为我们可以关于模型直接对aa假设:
a=θTXa = \theta^TX

所以,Sigmoid函数就变为了

p(y=1X;θ)=11+eθTX=hθ(x)=p1p(y=1|X;\theta) = \frac{1}{1+e^{-\theta^TX}}=h_\theta(x)=p_1

于是,问题便转化成了找 θ\theta 的最佳值从而最优化模型,但是怎么衡量模型的好坏呢?也就引出了所谓的损失函数,我们不断优化参数来最小化损失函数,找到最优的参数,那么概率判别模型常用最大似然估计(MLE)的方法来确定参数。

第二部分:极大似然估计(MLE)、损失函数

之前总结过,我们假设数据服从伯努利分布,什么是伯努利分布?

伯努利试验是单次随机试验,只有 成功(值为1)或 失败(值为0) 这两种结果,在这里也就是随机抽取一个数据点,不是属于第一类(y=1y=1)就是属于第二类(y=0y=0)的情况,所以对于一次观测,得到分类y的概率是

p(yx;θ)=p1y(1p1)(1y)p(y|x;\theta)=p_1^y(1-p_1)^{(1-y)}

这里 y=1y=1 或者 00,所以对于NN次独立的观测,每一个观测情况下, 我们有

p(yixi;θ)=hθ(xi)yi(1hθ(xi))(1yi)p(y_i|x_i;\theta)=h_\theta(x_i)^{y_i}(1-h_\theta(x_i))^{(1-y_i)}

所以对于所有NN个独立的观测值,我们有

p(yX;θ)=i=1N[hθ(xi)yi(1hθ(xi))(1yi)]=L(θ)p(y|X;\theta)=\prod_{i=1}^{N}[h_\theta(x_i)^{y_i}(1-h_\theta(x_i))^{(1-y_i)}]=L(\theta)

我们对等式两边同时取对数得到:

l(θ)=i=1N[yilog(hθ(xi))+(1yi)log(1hθ(xi))]l(\theta)=\sum_{i=1}^{N}[y_ilog(h_\theta(x_i))+(1-y_i)log(1-h_\theta(x_i))]

从而我们要利用极大似然估计的方法得到:

θ^=argmaxθl(θ)=argmaxθi=1N[yilog(hθ(xi))+(1yi)log(1hθ(xi))]\hat\theta = arg\max\limits_{\theta}l(\theta)=arg\max\limits_{\theta}\sum_{i=1}^{N}[y_ilog(h_\theta(x_i))+(1-y_i)log(1-h_\theta(x_i))]

这里我们发现,要最大化 l(θ)l(\theta) 来确定参数,那么最小化 l(θ)-l(\theta) 不就是相当于最小化损失函数了么?那么我们终于找到了所谓的损失函数了!

θ^=argminθJ(θ)=argminθi=1N[yilog(hθ(xi))+(1yi)log(1hθ(xi))]\hat\theta = arg\min\limits_{\theta}J(\theta)=arg\min\limits_{\theta}-\sum_{i=1}^{N}[y_ilog(h_\theta(x_i))+(1-y_i)log(1-h_\theta(x_i))]

这里的损失函数为:

J(θ)=1Ni=1N[yilog(hθ(xi))+(1yi)log(1hθ(xi))]J(\theta)=-\frac{1}{N}\sum_{i=1}^{N}[y_ilog(h_\theta(x_i))+(1-y_i)log(1-h_\theta(x_i))]

注意这里的1N\frac{1}{N}是个常数,用来归一化,对于上式中的最小化不影响,所以省略了。

那么我们继续刚才的推导,我们对于 l(θ)l(\theta) 关于 θ\theta 求偏导数得到(我们以一个观测值为例)

l(θ)θ=yihθ(xi)hθ(xi)θ+1yi1hθ(xi)hθ(xi)θ \frac{\partial l(\theta) }{\partial \theta} = \frac{y_i}{h_\theta(x_i)} \cdot \frac{\partial h_\theta(x_i)}{\partial \theta} + \frac{1-y_i}{1-h_\theta(x_i)} \cdot -\frac{\partial h_\theta(x_i)}{\partial \theta}

注意到
hθ(xi)θ=xihθ(xi)(1hθ(xi)) \frac{\partial h_\theta(x_i)}{\partial \theta} = x_ih_\theta(x_i)(1-h_\theta(x_i))

如果不信的话,可以自己求一下下,比较简单,所以带入后最终结果为

l(θ)θ=i=1Nyi(1p1)xip1xi+yip1xi=i=1N(yip1)xi \frac{\partial l(\theta) }{\partial \theta} = \sum_{i=1}^{N}y_i(1-p_1)x_i-p_1x_i+y_ip_1x_i=\sum_{i=1}^{N}(y_i-p_1)x_i

注意这里的 p1=hθ(xi)p_1 = h_\theta(x_i),也就是给定数据和参数,使其分类为 y=1y=1 的概率这个很重要,一定要搞清楚,记牢固!

思考:

为什么不想线性回归那样定义损失函数呢?在线性回归中,我们有

J(θ)=1Ni=1N12(hθ(xi)yi)2 J(\theta) = \frac{1}{N}\sum_{i=1}^{N}\frac{1}{2}(h_\theta(x_i)-y_i)^2

但是如果我们把 hθ(xi)=11+eθTxih_\theta(x_i) = \frac{1}{1+e^{-\theta^Tx_i}} 带入上式中,我们会发现这个函数不是凸函数(convex)了,如图所示:

因此我们采用MLE的方法来确定参数!

第三部分:梯度下降法

那么,我们知道对于逻辑回归,损失函数为(一个观测值为例)

J(θ)=1Ni=1NCost(hθ(x),y) J(\theta) = \frac{1}{N}\sum_{i=1}^{N}Cost(h_\theta(x),y)

这里的 hθ(x)h_\theta(x) 为预测值,yy 为实际值,并且

Cost(hθ(x),y)={log(hθ(x))if y=1log(1hθ(x))if y=0 Cost(h_\theta(x),y) =\left\{ \begin{array}{rcl} -log(h_\theta(x)) & & {if \space y=1}\\ -log(1-h_\theta(x)) & & {if \space y=0} \end{array} \right.

上面我们提到了要最小化损失函数,那么要利用到梯度下降法(Gradient Descent)

这里的 α\alpha 代表学习率,这个 mm 代表的就是带入模型的观测值数量(也可称做batch size,以后会讲),适当选取学习率和批大小对梯度下降的结果,也就是参数确定的结果有非常重要的影响!(后文会深入讨论)

当然,我们不光可以用梯度下降法来进行对损失函数的最小化,我们有多种optimization的选择,多种方法的速度和效率如下图所示:

实际应用和代码展示

逻辑回归面经和其他资料

小结

逻辑回归模型是非常基础的二分类模型,也是我们接触更多机器学习算法的必经之路,在二分类问题上有非常优秀的表现,但同时也有一些缺点和局限性,比如对很依赖特征工程和特征选择(这个对于模型的结果十分重要!),容易欠拟合(模型复杂度不够),对分布很不均匀的数据效果不好等等,最重要的是,当某个或某些特征可以完全对目标类别进行分类时,逻辑回归会表现得很不稳定,也就是其中的 p(Y=1X;θ)=1p(Y=1|X;\theta) = 1,那么 ln(p(Y=1X;θ)1p(Y=1X;θ))=θTXln(\frac{p(Y=1|X;\theta)}{1-p(Y=1|X;\theta)}) = \theta^TX 无解,系数会达到无穷,那么接下来我们引入生成模型,来探究其和判别模型的区别。

朴素贝叶斯

判别模型与生成模型

判别模型

我们知道,其实机器学习就是想办法从特征 XX 来预测目标 yy,也就是求概率 p(yX)p(y|X)

那么对于判别模型,我们只考虑去估计条件概率,是在有限样本的条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型,也可以理解为在二分类问题中,p(y=1X)+p(y=0X)=1p(y=1|X) + p(y=0|X) = 1,条件概率之和等于 11

生成模型

而生成式模型求得 p(y,X)p(y,X),我们需要求出 XX 与不用目标之间的联合分布概率,然后大的获胜,简单来说就是求两个联合概率分布,比较取大的。

什么是朴素贝叶斯?

首先,朴素贝叶斯是个生成模型,朴素贝叶斯分类器是一系列以假设特征之间强独立下运用贝叶斯定理为基础的简单地概率分类器。

朴素贝叶斯自20世纪50年代已广泛研究。在20世纪60年代初就以另外一个名称引入到文本信息检索界中,[1]:488 并仍然是文本分类的一种热门(基准)方法,文本分类是以词频为特征判断文件所属类别或其他(如垃圾邮件、合法性、体育或政治等等)的问题。通过适当的预处理,它可以与这个领域更先进的方法(包括支持向量机)相竞争。[2] 它在自动医疗诊断中也有应用。[3]

朴素贝叶斯是一种构建分类器的简单方法。该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。它不是训练这种分类器的单一算法,而是一系列基于相同原理的算法:所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。

对于某些类型的概率模型,在监督式学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法;换而言之,在不用到贝叶斯概率或者任何贝叶斯模型的情况下,朴素贝叶斯模型也能奏效。

尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够获取相当好的效果。2004年,一篇分析贝叶斯分类器问题的文章揭示了朴素贝叶斯分类器获取看上去不可思议的分类效果的若干理论上的原因。[5] 尽管如此,2006年有一篇文章详细比较了各种分类方法,发现更新的方法(如决策树随机森林)的性能超过了贝叶斯分类器。[6]

朴素贝叶斯分类器的一个优势在于只需要根据少量的训练数据估计出必要的参数(变量的均值和方差)。由于变量独立假设,只需要估计各个变量的方法,而不需要确定整个协方差矩阵

核心思想:贝叶斯公式,独立性假设

第一部分:贝叶斯公式

理论上,概率模型分类器是一个条件概率模型,这个我们已经并不陌生了,也就是要求出:

p(yX)p(y|X)
独立的类别变量 yy 有若干类别, 条件依赖于若干特征变量 X=X1,X2,,XnX = X_1,X_2, \cdots,X_n,但问题在于如果特征数量 nn 较大或者每个特征取值较大时, 基于概率模型列出的概率需要进行修改,而变得可行:

p(yX)=p(y)(p(Xy)p(X)p(y|X) = \frac{p(y)(p(X|y)}{p(X)}

用简单的语言可以表示为:

举个例子,假如我们有一副扑克,我们想知道在给定它是一张带人的牌的情况下,我们抽的牌是king的概率。所以根据贝叶斯公式,我们知道

接下来这个式子是我们会经常遇到的

posterior=prior×likelihoodevidenceposterior = \frac{prior \times likelihood}{evidence}

而实际中,我们只关心分式的分子部分, 因为分母不依赖于 yy 而且特征 XX 的值是给定的,我们可以认为分母是一个常数,这样分子就等价于联合分布模型。

p(y,X=X1,X2,,Xn)p(y, X = X_1,X_2, \cdots,X_n)

重复使用链式法则,可以将该式写成条件概率的形式,如下:
p(y,X1,X2,,Xn)p(y)p(X1,X2,,Xny)p(y)p(X1y)p(X2,,Xny,X1)p(y)p(X1y)p(X2y,X1)p(X3,,Xny,X1,X2)p(y)p(X1y)p(X2y,X1)p(X3y,X1,X2)p(Xny,X1,X2,,Xn1) \begin{aligned} p(y, X_1,X_2, \cdots,X_n) \\ &\propto p(y)p(X_1,X_2, \cdots,X_n|y) \\ &\propto p(y)p(X_1|y)p(X_2,\cdots,X_n|y,X_1) \\ &\propto p(y)p(X_1|y)p(X_2|y,X_1)p(X_3,\cdots,X_n|y,X_1,X_2) \\ &\cdots \\ &\propto p(y)p(X_1|y)p(X_2|y,X_1)p(X_3|y,X_1,X_2)\cdots p(X_n|y,X_1,X_2,\cdots,X_{n-1}) \end{aligned}

第二部分:条件独立假设

从现在开始, “朴素”的条件独立假设开始发挥作用,什么叫条件独立呢?当两个事件 AABB 在给定的另一个事件 YY 发生时,AA 发生与否和 BB 发生与否就条件概率分布而言是独立的,也就是 AABB 在给定 YY 发生时条件独立,当且仅当已知_Y_发生时,知道 AA 发生与否无助于知道 BB 发生与否,同样知道 BB 发生与否也无助于知道 AA 发生与否。

所以我们假设每个特征 XiX_i 对于其他特征 XjX_jjij \neq i 是条件独立的,意味着

p(Xiy,Xj)=p(Xiy)p(X_i|y,X_j) = p(X_i|y)

对于 iji \neq j,所以联合分布模型可以表达为

p(yX1,X2,,Xn)p(y,X1,X2,,Xn)p(y)p(X1y)p(X2y)p(X3y)p(y)i=1np(Xiy) \begin{aligned} p(y|X_1,X_2, \cdots,X_n) \\ &\propto p(y, X_1,X_2, \cdots,X_n) \\ &\propto p(y)p(X_1|y)p(X_2|y)p(X_3|y) \cdots \\ &\propto p(y)\prod_{i=1}^{n}p(X_i|y) \end{aligned}

所以这意味着,类变量 yy 的条件分布可以表达为:

p(yX1,X2,,Xn)=1Zp(y)i=1np(Xiy)p(y|X_1,X_2, \cdots,X_n) = \frac{1}{Z}p(y)\prod_{i=1}^{n}p(X_i|y)

其中 ZZ (evidence)是一个只依赖于 X1,X2,,XnX_1,X_2, \cdots,X_n 等的缩放因子,因为这个时候的特征变量的值是个常数,只是一个积分而已。由于分解成所谓的先验概率(prior) p(y)p(y) 和独立概率分布 p(Xiy)p(X_i|y), 从而演变成他们的乘积 i=1np(Xiy)\prod_{i=1}^{n}p(X_i|y) (likelihood) 上述模型概率的稳定性得到很大提升。

第三部分:从概率模型中构造分类器

那么如何从朴素贝叶斯概率模型来构造一个分类器,这需要建立一个决策法则,一个很常见的法则就是选出最有可能的那个,就是最大后验概率(MAP)决策准则,相应的分类器是如下定义的公式,这里我们假设 yyKK 个类别,所以对于其中的某个 kk 我们

y^=arg maxk[1,,K]p(yk)i=1np(Xiyk)\hat y = \argmax\limits_{k \in [1,\cdots,K]}p(y_k)\prod_{i=1}^{n}p(X_i|y_k)

所有的模型参数都可以通过训练集的相关频率来估计,类的先验概率可以通过假设各类等概率来计算
=1先验概率 = \frac{1} {类的数量}
或者通过训练集的各类样本出现的次数来估计
A=AA类先验概率=\frac{A类样本的数量}{样本总数}
为了估计特征的分布参数,我们要先假设训练集数据满足某种分布或者非参数模型

延伸:高斯朴素贝叶斯(GBN),线性判别分析(LDA),二次判别分析(QDA)

第一部分:高斯朴素贝叶斯(GBN)

如果要处理的是连续数据,一种通常的假设是这些连续数值为高斯分布。 例如,假设训练集中有一个连续特征 xx,我们首先对数据根据类别分类,然后计算每个类别中 xx均值方差

我们有:

p(y=kX=x)=πkfk(x)l=1kπlfl(x)p(y=k|X=x)=\frac{\pi_kf_k(x)}{\sum_{l=1}^{k}\pi_lf_l(x)}

其中 πk\pi_k先验概率(prior),fk(x)f_k(x)似然函数(likelihood)。

我们用一个特征 x=vx=v 来举例

p(x=vy=k)=fk(x)=12πσy2exp((vμy)22σy2)p(x = v|y=k) =f_k(x)= \frac{1}{\sqrt{2\pi\sigma_y^2}}exp\Big(-\frac{(v-\mu_y)^2}{2\sigma_y^2}\Big)

处理连续数值问题的另一种常用的技术是通过离散化连续数值的方法。通常,当训练样本数量较少或者是精确的分布已知时,通过概率分布的方法是一种更好的选择。在大量样本的情形下离散化的方法表现更优,因为大量的样本可以学习到数据的分布。由于朴素贝叶斯是一种典型的用到font color=red>大量样本的方法(越大计算量的模型可以产生越高的分类精确度),所以朴素贝叶斯方法都用到离散化方法,而不是概率分布估计的方法。

下面是GBN分类器的工作原理,在每一个数据点,在这一点和每个类平均(class-mean)的z-score都可以被计算出来。

如果一个给定的类和特征值在训练集中没有一起出现过,那么基于频率的估计下该概率将为0。这将是一个问题。因为与其他概率相乘时将会把其他概率的信息统统去除。所以常常要求要对每个小类样本的概率估计进行修正,以保证不会出现有为0的概率出现。

尽管实际上独立假设常常是不准确的,但朴素贝叶斯分类器的若干特性让其在实践中能够获取令人惊奇的效果。特别地,各类条件特征之间的解耦(数学中解耦是指使含有多个变量的数学方程变成能够用单个变量表示的方程组,即变量不再同时共同直接影响一个方程的结果,从而简化分析计算)意味着每个特征的分布都可以独立地被当做一维分布来估计。

这样减轻了由于维数灾难带来的阻碍,当样本的特征个数增加时就不需要使样本规模呈指数增长。然而朴素贝叶斯在大多数情况下不能对类概率做出非常准确的估计,但在许多应用中这一点并不要求。

例如,朴素贝叶斯分类器中,依据最大后验概率决策规则只要正确类的后验概率比其他类要高就可以得到正确的分类。所以不管概率估计轻度的甚至是严重的不精确都不影响正确的分类结果。在这种方式下,分类器可以有足够的鲁棒性去忽略朴素贝叶斯概率模型上存在的缺陷。

第二部分:线性判别分析(LDA)

LDA核心思想

LDA作为一种有监督学习的降维、分类技术,可以在保持分类的前提下把数据投影到低维空间以降低计算复杂度。

LDA要求类间的方差最大,而类内的方差最小,以保证投影后同一分类数据集中,不同分类间数据距离尽可能大。

LDA数学推导

回顾一下之前说过的朴素贝叶斯方法,我们有:

Priors=p(y=k)=πkPriors = p(y=k) = \pi_k
Likelihood=p(X=xy=k)=fk(x)=1(2π)n/2Σ1/2exp(12(xμk)TΣ1(xμk))Likelihood = p(X=x|y=k)=f_k(x)=\frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}}exp(-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k))
μk\mu_k: Mean of the inputs for category kk
Σ\Sigma: Covariance Matrix (Common to all categories) 十分重要的假设,我们假设对每一类数据的协方差矩阵是相等的!

根据贝叶斯公式,我们计算出后验概率:

p(y=kX=x)=fk(x)πkP(X=x)p(y=k|X=x)=\frac{f_k(x)\pi_k}{P(X=x)}

同样,分母可看做常数

p(y=kX=x)=C×fk(x)πkp(y=k|X=x)=C\times{f_k(x)\pi_k}

展开可得

p(y=kX=x)=Cπk(2π)n/2Σ1/2exp(12(xμk)TΣ1(xμk))p(y=k|X=x)=\frac{C\pi_k}{(2\pi)^{n/2}|\Sigma|^{1/2}}exp(-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k))

下面,我们把与 kk 无关的项合并到一起,作为 CC'

p(y=kX=x)=Cπke12(xμk)TΣ1(xμk)p(y=k|X=x)=C'\pi_ke^{-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)}

下面,对等式两边取对数

log p(y=kX=x)=log C+log πk12(xμk)TΣ1(xμk)log\ p(y=k|X=x)=log\ C'+log\ \pi_k-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)

注意,log Clog\ C'对于每一个 kk 是一样的,我们要把后面的式子关于 kk 最大化。

Target=log πk12(xμk)TΣ1(xμk)=log πk12[xTΣ1x+μkTΣ1μk]+xTΣ1μk=C+log πk12μkTΣ1μk+xTΣ1μk \begin{aligned} Target &= log\ \pi_k-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k) \\ &= log\ \pi_k-\frac{1}{2}[x^T\Sigma^{-1}x+\mu_k^T\Sigma^{-1}\mu_k]+x^T\Sigma^{-1}\mu_k \\ &= C''+log\ \pi_k - \frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k+x^T\Sigma^{-1}\mu_k \end{aligned}

我们定义我们要最大化的目标函数

δk(x)=log πk12μkTΣ1μk+xTΣ1μk\delta_k(x) = log\ \pi_k-\frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k+x^T\Sigma^{-1}\mu_k

通过最大化 δk(x)\delta_k(x),我们可以通过 xx 来预测目标。

下面来看看LDA的决策边界

什么是决策边界?也就是一系列的数据点使得:

δk(x)=δl(x)\delta_k(x) = \delta_l(x)

log πk12μkTΣ1μk+xTΣ1μk=log πk12μlTΣ1μl+xTΣ1μllog\ \pi_k-\frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k+x^T\Sigma^{-1}\mu_k = log\ \pi_k-\frac{1}{2}\mu_l^T\Sigma^{-1}\mu_l+x^T\Sigma^{-1}\mu_l

那么接下来就到了参数估计的步骤了,记得之前我们已经说过 πk\pi_k,也就是先验概率的估计方法,接下来我们要估计 μk\mu_kΣ\Sigma

μ^k=1#(i;yi=k)i;yi=kxi\hat\mu_k = \frac{1}{\#(i;y_i=k)}\sum_{i;y_i=k}x_i

σ^2=1nKk=1Ki;yi=k(xiμ^k)2\hat\sigma^2=\frac{1}{n-K}\sum_{k=1}^{K}\sum_{i;y_i=k}(x_i-\hat\mu_k)^2

这里的 i;yi=k\sum_{i;y_i=k} 指的是在第 kk 类下的所有样本的相应计算(求样本方差或者样本均值)的总和。

X=(X1,X2,,Xn)X = (X_1,X_2,\cdots,X_n)是从多变量正态分布中抽样得出,所以我们有 XN(μ,Σ)X \sim N(\mu,\Sigma)

所以根据我们之前推出的 δk(x)\delta_k(x),我们有

δ^k(x)=log π^k12μ^kTΣ^1μ^k+xTΣ^1μ^k\hat\delta_k(x) = log\ \hat\pi_k-\frac{1}{2}\hat\mu_k^T\hat\Sigma^{-1}\hat\mu_k+x^T\hat\Sigma^{-1}\hat\mu_k

LDA与逻辑回归的关系

  1. 首先LR对于可以类别可以很准确分类的情况(well-seperated)很不稳定,而且很难处理多类分类问题,所以LDA作为一个生成模型,针对那些 f(Xy)f(X|y) 服从正态分布的情况会更加稳定。
  2. 对于LR,我们有
    p(y=1X)=p1=11+eθTxp(y=1|X)=p_1=\frac{1}{1+e^{-\theta^Tx}}
    log(p11p1)=θTxlog(\frac{p_1}{1-p_1})=\theta^Tx
    而对于LDA,我们也可以把上式写成
    log(p11p1)=wTxlog(\frac{p_1}{1-p_1})=w^Tx
    其中 wwμk\mu_kσk\sigma_k 的函数。

第三部分:二次判别分析(QDA)

至于QDA,它跟LDA的区别在于我们去掉了之前重要的假设,也就是在QDA中,我们要对每个类 kk 来分别估计 μ^k\hat\mu_kΣ^k\hat\Sigma_k

根据之前推导的 δk(x)\delta_k(x),我们有

δk(x)=log πk12μkTΣ1μk+xTΣ1μk12xTΣk1x12log Σk\delta_k(x) = log\ \pi_k-\frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k+x^T\Sigma^{-1}\mu_k - \frac{1}{2}x^T\Sigma_k^{-1}x-\frac{1}{2}log\ |\Sigma_k|

可以看出 δk(x)\delta_k(x)xx二次函数

来看一下LDA和QDA的决策边界的对比

当我们分别去求 Σ^k\hat\Sigma_k,这样加大了计算量,提高了模型的复杂度,甚至可以说复杂度与LDA差别较大,当训练集很大时,我们可以使用QDA。

实际应用和代码展示

朴素贝叶斯方法相关面经和其他资料

小结

朴素贝叶斯算法的基本思想是建立特征 XX 与输出 yy 之间的联合概率分布 p(X,y)p(X,y) ,在对给定的特征进行预测时,通过贝叶斯定理求出所有可能的输出 p(X|y) ,取其中最大的作为预测结果。其优点是模型简单,效率高,在很多领域有广泛的使用。朴素贝叶斯、LDA/QDA都属于生成模型,收敛速度将快于判别模型(如逻辑回归)。

支持向量机

什么是支持向量机?

支持向量机(Support Vector Machine, SVM)是一种二类分类器。它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使其成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划(convex quadratic programming)的问题,也等价于正则化的**合页损失函数(Hinge Loss)**的最小化问题。支持向量机的学习算法是求解凸二次规划的最优化算法。

支持向量机包含构建由简至繁的模型:线性可分支持向量机、线性支持向量机以及非线性支持向量机。当数据线性可分时,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器;当数据近似线性可分时,通过软间隔最大化(soft margin maximization),也学习一个线性的分类器,也就是线性支持向量机,也叫做软间隔支持向量机;当数据线性不可分时,通过使用核技巧(kernel trick)以及软间隔最大化,学习非线性支持向量机。

核心思想:硬(软)间隔最大化、合页损失函数、决策边界、核函数

第一部分:硬(软)间隔最大化

首先,考虑一个二分类问题,我们假设给定一个特征空间上的训练数据集

T={(x1,y1),(x2,y2),,(xN,yN)}T = \{ (x_1,y1), (x_2,y_2), \cdots, (x_N,y_N)\}

其中,xi=Rn,yi={+1,1},i=1,2,,Nx_i = R^n, y_i = \{+1,-1\}, i = 1,2,\cdots,Nxix_i 为第 ii 个特征向量,也称为实例,yiy_ixix_i 的类标记,我们的目标是在特征空间中找到一个分离超平面,能将实例分到不同的类,分离超平面对应方程 wx+b=0w\cdot x+b = 0,它由法向量 ww 和截距 bb 决定,分离超平面将特征空间划分成两部分,一部分为正类(yi=+1y_i = +1),一部分是负类(yi=1y_i = -1)。法向量指向的一侧为正类,另一侧为负类。

一般来说,在训练集线性可分,存在无穷个分离超平面进行分类,感知机利用误分类最小的策略,求分离超平面,这时解有无穷多个。线性可分支持向量机可以利用间隔最大化求最优分离超平面,这时,解是唯一的!

下面来说说间隔最大化,最直观的解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。这样的超平面应该对未知的新实例有很好的分类预测能力。

具体来说,这个问题可以表示为下面的约束最优化问题:

maxw,bγ\max_{w,b} \quad \gamma

s.t.yi(wwxi+bw)γ,i=1,2,,Ns.t. \quad y_i \Big(\frac{w}{||w||} \cdot x_i + \frac{b}{||w||}\Big)\geq\gamma, \quad i=1,2,\cdots,N

我们希望最大化超平面 (w,b)(w,b) 关于训练数据集的几何间隔 γ\gamma,约束条件表示的是超平面关于美国训练样本点的几何间隔至少是 γ\gamma

注意到函数间隔的取值并不影响最优化的解。事实上,假设将 wwbb 按比例改变,这是函数间隔也按相应的比例改变,所以没影响,这样我们可以取 γ=1\gamma = 1。将其代入上面的式子,注意到最大化 1w\frac{1}{||w||} 和最小化 12w2\frac{1}{2}||w||^2 是等价的,那么我们可以把问题转化成一个凸二次规划问题

十分重要!

minw,b12w2\min_{w,b} \quad \frac{1}{2}||w||^2

s.t.yi(wxi+b)10,i=1,2,,Ns.t. \quad y_i(w\cdot x_i+b) - 1 \geq 0, \quad i=1,2,\cdots,N

下面来说一下什么是硬(软)间隔,我们知道SVM本质就是最大化margin,但是面对如下图所示的一些overlapping或者说是异常点,我们很难找到一个合适的决策边界来分类,但是我们如果绝对遵从正确分类的话,会造成下图右边的图片所示的情况,但是这明显有悖于我们全局边际最大化的初衷,自然我们要做些取舍,我们要允许错误分类(misclassification)从而保证全局最优化。

再从数学层面上解释为什么要引入软间隔最大化,是因为在面对线性不可分数据时,上述的不等式约束 yi(wxi+b)10,i=1,2,,N\quad y_i(w\cdot x_i+b) - 1 \geq 0, \quad i=1,2,\cdots,N 并不能都成立。

那为了解决这个问题,我们对每个样本点 (xi,yi)(x_i,y_i) 引入松弛变量 ξi0\xi_i \geq 0,使得函数间隔加上松弛变量大于等于1,这样,约束条件变为

yi(wxi+b)1ξi\quad y_i(w\cdot x_i+b) \geq 1 - \xi_i

同时,对每个 ξi\xi_i,支付一个代价 ξi\xi_i,目标函数由原来的 12w2\frac{1}{2}||w||^2变成

12w2+Ci=1Nξi\frac{1}{2}||w||^2+C\sum_{i=1}^{N}\xi_i

这里的 C>0C>0 称为惩罚函数,CC 越大对错误分类的惩罚越大,而最小化 12w2+Ci=1Nξi\frac{1}{2}||w||^2+C\sum_{i=1}^{N}\xi_i 的意义在于两点:使得 12w2\frac{1}{2}||w||^2 尽量小也就是间隔尽量大,同时使错误分类点的个数尽量小

所以我们有

minw,b,ξ12w2+Ci=1Nξi\min_{w,b,\xi} \quad \frac{1}{2}||w||^2 + C\sum_{i=1}^{N}\xi_i

s.t.yi(wxi+b)1ξi,i=1,2,,Ns.t. \quad \quad y_i(w\cdot x_i+b) \geq 1 - \xi_i, \quad i=1,2,\cdots,N

第二部分:支持向量和间隔边界

支持向量

在线性可分的情况下,训练集的样本点钟与分离超平面距离最近的样本点的实例称为支持向量(support vector)。支持向量是使约束条件等式成立的点,即:

yi(wxi+b)1=0,i=1,2,,N\quad y_i(w\cdot x_i+b) - 1 = 0, \quad i=1,2,\cdots,N

yi=+1y_i = +1 的正例点,支持向量在超平面

H1=wx+b=1H_1 = w\cdot x+b=1

上,对 yi=+1y_i = +1 的负例点, 支持向量在超平面

H1=wx+b=1H_1 = w\cdot x+b=-1

上。如下图所示,在 H1H_1H2H_2 上的点就是支持向量。

间隔边界

注意到 H1H_1H2H_2 平行,并且没有实例点落在其间。H1H_1H2H_2 的距离叫做间隔(margin)。间隔依赖于分离超平面的法向量 ww, 等于 2w\frac{2}{||w||}H1H_1H2H_2 称为间隔边界

再决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。如果移动支持向量将改变所求的解;但是如果在间隔边界意外移动其他实例点,甚至去掉这些点,则解不会改变。也就是说解只跟支持向量相关

由于支持向量在确定分离超平面起着决定性作用,所以支持向量机就由此而来。一般来说,支持向量的个数相对较少,所以支持向量机由很少的“重要”样本确定。

第三部分:对偶算法

这一部分是SVM最核心也是最理论的部分,所以分成几小部分展开。

无约束最小化

我们之前所讨论的最小化问题是带有边界条件的,也就是我们要满足数据集里所有的点到分离超平面的距离都要超过 1w\frac{1}{||w||}。那么我们如果不考虑限制条件只单纯的对函数最小化,问题会简单一些,也就是无约束最小化(Unconstrained minimization)。

定理:令 f:ΩRf: \Omega \rarr \mathbb{R} 为在点 xx^* 的连续二阶导函数。如果 xx^* 满足 f(x)=0\nabla f(x^*) = 0 并且 2f(x)\nabla^2 f(x^*) 是正定的(positive definite),那么 xx^* 是一个局部最小点。(证明,第11页)

敲黑板!!!

也就是说,如果 xx^* 满足:

  1. ffxx^* 梯度为 0:
    f(x)=0\nabla f(x^*) = 0
    并且
  2. ffxx^* 的海森矩阵(Hessian)是正定的:
    zT((2f(x))z>0,zRnz^T((\nabla^2 f(x^*))z>0, \forall z \in \mathbb{R}^n
    其中
    2f(x)=(2fx122fx1xn2fxnx12fxn2)\nabla^2f(\mathbf x) = \begin{pmatrix}\frac{\partial^2f}{\partial x^2_1 } & \cdots & \frac{\partial^2f}{\partial x_1 \partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial^2f}{\partial x_n \partial x_1} & \cdots & \frac{\partial^2f}{\partial x^2_n}\end{pmatrix}
    那么 xx^* 是一个局部最小点。

这里主要说一下海森矩阵

海森矩阵一般简写为 HH, 但是我们在这里叫它 2f(x)\nabla^2 f(x^*),这里的 2\nabla^2 代表的是二阶偏导

我们把数据带进去是可以算出海森矩阵的,海森矩阵是一个关于一个标量函数的二阶偏导所构成的对称方阵,它描述了多变量函数的局部曲率。

下面说一下什么是正定

我们需要判断海森矩阵在 xx^* 是不是正定的。

定义:如果对于所有 xRnx \in \mathbb{R}^n,如果 xTAx>0x^TAx>0,那么对称矩阵 AAA=ATA = A^T)就叫作正定矩阵。

在这里我们把 xx 替换成 zz, 把 AA 替换成 2f(x)\nabla^2 f(x^*),就得到

zT((2f(x))z>0,zRnz^T((\nabla^2 f(x^*))z>0, \forall z \in \mathbb{R}^n

但是明显我们不能对于所有的 zz 进行尝试,好在我们有等价的满足条件来替换:

具体如何判断请看这里!

如果我们能够找到所有满足以上两个条件的 XX, 这里指的是向量,那么我们相当于找到了一个函数的局部最小值,但是局部最小值不等于全局最小值。

那么如何找到全局最小值呢?

  1. 找到所有的局部最小值
  2. 取最小的局部最小值

另一种方法是判定函数是不是凸函数,如果是的话,那么局部最小值就是全局最小值!如果有兴趣请看这里(强烈建议

对偶问题的引入:拉格朗日乘子

那么终于来到了我们的主角:对偶问题

在数学优化理论中,对偶性意味着可以从原始问题或对偶问题(对偶性原理)这两个角度来看优化问题。对偶问题的解决方案为原始(最小化)问题的解决方案提供了下限。(维基百科

什么是下限?

给个例子吧,加入我们有

S={2,4,8,12}S = \{2,4,8,12\}

而且,因为2比任何其他下限大,所以我们可以给它起一个特殊的名字,我们称它为最大下限

为什么要关心对偶呢?

是因为有时候解决对偶问题比解决原问题更加简单,如果你有一个最小化的问题,那么你也可以把他看做一个最大化问题。也就是当你在找这个问题的最小值时,其实这就是一个最小化问题的解的下界

那么对偶的重要性体现在哪?

左边图中,我们可以看到在原问题中,我们要去对顶上的函数来最小化,它的最小值在 PP 处取到。如果我们来寻找一个对偶函数,我们就会分析下面这个图,其最大值在 DD 点取到,所以我们可以明确 DD 是一个下界,那么 PDP-D 就是对偶间隙(duality gap),在这里,PD>0P-D>0 也就是说存在弱对偶,而右边的图展示的是强对偶,也就是 PD=0P-D=0 的情况。

之前介绍了无限制最优化问题的解决方法,下面说一下有限制条件的最优化问题解决方法。

一个最优化问题可以简单写成:

minimizexf(x)subject  togi(x)=0,i=1,,phi(x)0,i=1,,m\begin{aligned}&{\underset {x}{\operatorname {minimize} }}&&f(x)\\&\operatorname {subject\;to} &&g_{i}(x)=0,\quad i=1,\dots ,p\\&&&h_{i}(x)\leq 0,\quad i=1,\dots ,m\end{aligned}

这里,ff 称作目标函数,也叫损失函数,通过改变 xx 我们希望找到一个值 xx^* 使得 ff 在此达到最小值。

这里有 pp 个方程 gig_i,其定义了等式约束,并且有 mm 个方程 hih_i 定义了不等式约束。

所以如何解决这种问题呢?

我们引入了拉格朗日乘子(Lagrange Multipliers),下面是维基百科中的英文解释。

In mathematical optimization, the method of Lagrange multipliers is a strategy for finding the local maxima and minima of a function subject to equality constraints. (Wikipedia)

拉格朗日告诉我们如果要去寻找一个约束方程的最小值,那么我们需要去寻找使得 f(x,y)=λg(x,y)\nabla f(x,y) = \lambda \nabla g(x,y)

那么 λ\lambda 就是我们所说的拉格朗日乘子。注意到这个公式不要求梯度是有相同的方向的,因为 λ\lambda 可以为负数,我们只需要保证他们是平行的,是因为这个方法不仅仅可以用来寻找最小值,也可以寻找最大值。

我们定义:

L(x,λ,η)=f(x)+i=1mλigi(x)+i=1pηihi(x)L(x,\lambda, \eta) = f(x)+\sum_{i=1}^{m}\lambda_i g_i(x) + \sum_{i=1}^{p} \eta_ih_i(x)

那么原问题等价于无约束形式:

minxmaxλ,ηL(x,λ,η)s.t.λi0\min_{x}\max_{\lambda,\eta}L(x,\lambda,\eta)\quad s.t. \quad \lambda_i \geq 0

这是因为当满足原问题的不等式约束时, λi=0\lambda_i = 0 才能取得最大值,直接等价于原问题,如果不满足原问题的不等式约束,那么最大值就为正无穷,由于需要取到最小值,所以这种情况不存在。

这个问题的对偶形式:

maxλ,ηminxL(x,λ,η)s.t.λi0\max_{\lambda,\eta}\min_{x}L(x,\lambda,\eta)\quad s.t. \quad \lambda_i \geq 0

所以对偶问题是关于 λ,η\lambda, \eta 的最大化问题。

由于:

maxλi,ηjminxL(x,λi,ηj)minxmaxλi,ηjL(x,λi,ηj)\max_{\lambda_i,\eta_j}\min_{x}L(x,\lambda_i,\eta_j) \leq \min_{x}\max_{\lambda_i,\eta_j}L(x,\lambda_i,\eta_j)

证:显然有
minxLLmaxλ,η\min_{x}L \leq L \leq \max_{\lambda,\eta}
于是显然有
maxλ,ηminxLL\max_{\lambda, \eta} \min_{x}L \leq L

minxmaxλ,ηLL\min_{x} \max_{\lambda, \eta} L \geq L

Wolfe dual Lagrangian function

下面我们对原问题进行对偶转化,看看是否能在原有的拉格朗日方程的基础上减少一些变量。

还记得朗格朗日方程是:

L(w,b,α)=12w2i=1mαi[yi(wxi+b)1]L(w,b,\alpha) = \frac{1}{2}||w||^2-\sum_{i=1}^{m}\alpha_i[y_i(w \cdot x_i + b) -1]

拉格朗日原问题是:

minw,bmaxαL(w,b,α)\min_{w,b} \max_{\alpha} L(w,b,\alpha)
subject toai0, i=1,,msubject \ to \quad a_i \geq 0, \ i = 1, \cdots, m

对于求解最小值问题,我们对 LL 关于 wwbb

wL=wi=1mαiyixi=0Lb=i=1mαiyi=0\begin{aligned} \nabla_wL &= w - \sum_{i=1}^{m}\alpha_iy_ix_i=0 \\ \frac{\partial L}{\partial b} &= -\sum_{i=1}^{m}\alpha_iy_i = 0 \end{aligned}

通过第一个等式,我们有

w=i=1mαiyixiw = \sum_{i=1}^{m}\alpha_iy_ix_i

我们把上式带入 LL 中化简得到:

W(α,b)=i=1mαi12i=1mj=1mαiαjyiyjxixjbi=1mαiyiW(\alpha,b) = \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j - b\sum_{i=1}^{m}\alpha_iy_i

到此,我们已经把 ww 去除了,根据 Lb=0\frac{\partial L}{\partial b}=0,我们有:

W(α)=i=1mαi12i=1mj=1mαiαjyiyjxixjW(\alpha) = \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j

上式也称为 Wolfe dual Lagrangian function

问题也被转化为了 wolfe 对偶问题:

maxα i=1mαi12i=1mj=1mαiαjyiyjxixj\max_\alpha \ \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j

subject toαi0, for any i=1,,msubject \ to \quad \alpha_i \geq 0, \ for \ any \ i = 1, \cdots , m

i=1mαiyi=0\sum_{i=1}^{m}\alpha_iy_i=0

我们可以看到,这样一来我们的目标方程 WW 就仅仅取决于朗格朗日乘子了!

KKT条件

因为我们解决的问题包含不等式约束条件,那么这里有个额外的条件我们不得不满足:解必须满足 Karsuh-Kuhn-Tucker (KKT) 条件

简单说,如果一个解满足KKT条件,那么可以保证它就是一个最优解。

KKT条件是:

所以接下来一旦我们有了拉格朗日乘子,就可以计算 w=i=1mαiyixiw = \sum_{i=1}^{m}\alpha_iy_ix_ib=yiwxib = y_i - w \cdot x_i。此外,我们可以使用更稳定的方法来求 bb 而不直接去任意的支持向量 xix_i

b=1Si=1S(yiwxi)b = \frac{1}{S}\sum_{i=1}^{S}(y_i-w \cdot x_i)

其中 SS 是支持向量的总个数。

软间隔条件下的对偶问题

之前说过了硬软间隔最大化的目的以及他们的区别,简而言之,硬间隔最大化面对异常值特别敏感,很容易造成过拟合,而软间隔基于硬间隔加入了松弛变量,从而容许分类器有错误分类的情况,从而对全局的分类效果更佳。

既然说到了松弛变量 ζ\zeta,那么我们之前的限制条件:

yi(wxi+b)1y_i(w \cdot x_i + b) \geq 1

变成了:

yi(wxi+b)1ζiy_i(w \cdot x_i + b) \geq 1-\zeta_i

但如果 ζi\zeta_i 取值太大的话,那么限制条件就不起作用了,所以我们要修改损失函数来惩罚值较大的 ζi\zeta_i

minw,b,ζ12w2+i=1mζi\min_{w,b,\zeta} \frac{1}{2}||w||^2+\sum_{i=1}^{m}\zeta_i

subject toyi(wxi+b)1ζifor any i=1,,msubject \ to \quad y_i(w \cdot x_i + b) \geq 1 - \zeta_i \quad for \ any \ i = 1, \cdots , m

这里,我们把所有的 ζi\zeta_i 加起来放到了损失函数里面,相当于一个惩罚项。总而言之,这样得到的解就是可以满足间隔最大化同时有最小的误差的超平面。

还有个问题就是,我们要保证 ζi0\zeta_i \geq 0,此外我们要加上一个控制变量 CC 来对松弛变量做调整,因为有可能我们还需要硬间隔法的存在,CC 的大小会决定 ζ\zeta 有多重要!

最终,对于软间隔情况,我们有:

minw,b,ζ12w2+Ci=1mζi\min_{w,b,\zeta} \frac{1}{2}||w||^2+C\sum_{i=1}^{m}\zeta_i

subject toyi(wxi+b)1ζiζ0for any i=1,,msubject \ to \quad y_i(w \cdot x_i + b) \geq 1 - \zeta_i \quad \zeta \geq 0 \quad for \ any \ i = 1, \cdots , m

同理,我们对于软间隔情况有类似的对偶转换:

maxα i=1mαi12i=1mj=1mαiαjyiyjxixj\max_\alpha \ \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j

subject to0αiC, for any i=1,,msubject \ to \quad 0 \leq \alpha_i \leq C, \ for \ any \ i = 1, \cdots , m

i=1mαiyi=0\sum_{i=1}^{m}\alpha_iy_i=0

由于损失函数加入了 Ci=1mζiC\sum_{i=1}^{m}\zeta_i,如果 αi\alpha_i 大于 CC,在经过拉格朗日方程的变换后,正则项就为负数了,所以要小于等于 CC

重点!!!

那么如何选择 CC 呢?我们可以使用 grid searchcross validation

延伸

2-Norm soft margin

minw,b,ζ12w2+Ci=1mζi2\min_{w,b,\zeta} \frac{1}{2}||w||^2+C\sum_{i=1}^{m}\zeta_i^2

subject toyi(wxi+b)1ζiζ0for any i=1,,msubject \ to \quad y_i(w \cdot x_i + b) \geq 1 - \zeta_i \quad \zeta \geq 0 \quad for \ any \ i = 1, \cdots , m

nu-SVM

由于 CC 的范围被特征空间所影响,这个方法用了参数 vv,其值在 0 到 1 之间变动。

maxα 12i=1mj=1mαiαjyiyjxixj\max_\alpha \ -\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j

subject to0αi1m,subject \ to \quad 0 \leq \alpha_i \leq \frac{1}{m},

i=1mαiyi=0\sum_{i=1}^{m}\alpha_iy_i=0

i=1mαiv for any i=1,,m\sum_{i=1}^{m}\alpha_i \geq v \quad \ for \ any \ i = 1, \cdots , m

第四部分:合页损失函数(Hinge Loss)

那么我们继续说说 CC 的作用,它控制着支持向量机如何控制误差,

我们把支持向量机和逻辑回归的损失函数做一下对比:

注意到这里 mm 被去掉了,在第一部分我们提到了为什么,这里不再赘述,现在我们要研究的是 cost1cost_1cost2cost_2 分别是什么。

如上图所示,当 θTx(i)1\theta^Tx^{(i)} \geq 1,损失函数为 00,并且 y(i)=1y^{(i)} = 1;当 θTx(i)1\theta^Tx^{(i)} \leq -1,损失函数为 00,并且 y(i)=0y^{(i)} = 0

所以问题被转换成:

minθ12j=1nθj2\min_\theta \frac{1}{2}\sum_{j=1}^{n}\theta_j^2

s.t.{θTx(i)1if y(i)=1θTx(i)1if y(i)=0 s.t. \quad\left\{ \begin{aligned} \theta^Tx^{(i)} &\geq 1 \quad if \ y^{(i)}=1\\ \theta^Tx^{(i)} &\leq -1 \quad if \ y^{(i)}=0 \end{aligned} \right.

第五部分:核函数(kernel)

特征转换

思考一下,我们可以对非线性可分的数据进行分类么?也就是我们如果不能用一条直线或者一个平面对数据进行分类,我们要做的就是特征转换(feature transformation)。

举个例子,我们对于二维的向量 (x1,x2)(x_1,x_2),要把它转换为一个三维的向量,类似于我们通过方程 ϕ:R2R3\phi: \mathbb R^2 \rarr \mathbb R^3 实现多项式的转换。

ϕ(x1,x2)=(x12,2x1x2,x22)\phi(x_1,x_2) = (x_1^2, \sqrt{2}x_1x_2, x_2^2)

但是我们怎么确定要去选哪种转换方法呢?

这极大程度上取决于我们的数据集。选对正确的转换方法是成功之匙,但是并没有一个很明确的规定可以帮助我们确定选哪种转换方法,建议阅读一下scikit-learn的资料来加深对数据预处理的理解。

什么是核函数?

刚才我们提到了如何处理非线性可分的数据集,但是一大缺点就是我们必须对数据集中所有的点都进行转换,如果数据量太大的话,这个过程将会十分复杂,核函数应运而生!

在前一部分讨论支持向量机的对偶问题时,我们在 Wolfe 对偶拉格朗日方程中得到了满足 KKT 条件的拉格朗日乘子,其中我们是不需要计算每个训练样本的具体值的,我们实际只需要计算一对训练样本的点积 xixjx_i \cdot x_j

W(α)=i=1mαi12i=1mj=1mαiαjyiyjxixjW(\alpha) = \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \cdot x_j

那么是否有一种办法在不对向量进行转化就能求出这个值呢?

核函数就是来干这个的!实际上,核函数就是可以返回另一个更高维的空间里的点积的函数。

Kernel Trick

那么我们可以定义一个核函数为 K(xi,xj)=xixjK(x_i,x_j) = x_i \cdot x_j,所以我们可以重新写出软间隔对偶问题如下:

maxα i=1mαi12i=1mj=1mαiαjyiyjxiK(xi,xj)\max_\alpha \ \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i K(x_i,x_j)

subject to0αiC, for any i=1,,msubject \ to \quad 0 \leq \alpha_i \leq C, \ for \ any \ i = 1, \cdots , m

i=1mαiyi=0\sum_{i=1}^{m}\alpha_iy_i=0

核函数的种类

那么我们应该选用什么核函数最好呢?很抱歉这个也是没有固定方法的,一般来说,我们会先尝试高斯核函数(RBF),核函数作为一种表示两个向量间相似程度大小的方法,我们也可以自定义核函数来实现。

延伸:SMO算法

我们已经知道如何解决SVM最优化问题了,然而实际当中我们会用一个更好的方法来更快地解决这个问题:SMO算法。大多数机器学习的包都会用到SMO算法或其变式。

SMO算法解决下面的问题

minα 12i=1mj=1mαiαjyiyjxiK(xi,xj)i=1mαi\min_\alpha \ \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_jy_iy_jx_i K(x_i,x_j) - \sum_{i=1}^{m}\alpha_i

subject to0αiC, for any i=1,,msubject \ to \quad 0 \leq \alpha_i \leq C, \ for \ any \ i = 1, \cdots , m

i=1mαiyi=0\sum_{i=1}^{m}\alpha_iy_i=0

注意我们把之前的最大化改成最小化,并加了一个负号。这个就是之前我们的核函数化后的软间隔公式。下面是用 Python 实现的代码

def kernel(x1, x2): 
	return np.dot(x1, x2.T) 
def objective_function_to_minimize(X, y, a, kernel): 
	m, n = np.shape(X) 
	return 1 / 2 * np.sum([a[i] * a[j] * y[i] * y[j]* kernel(X[i, :], X[j, :]) 
	for j in range(m) 
	for i in range(m)])\ 
	- np.sum([a[i] for i in range(m)])

在我们处理非常大的数据集时,在利用凸优化包时常常会包含大量的矩阵运算,从而随着矩阵规模变大花费太多时间甚至超出存储范围。

SMO算法的核心思想

当我们求解SVM对偶问题时,我们可以随便改变拉格朗日乘子 α\alpha 的值只要我们满足限制条件。但是每次都更新 α=(α1,α2,,αm)\alpha = (\alpha_1, \alpha_2, \cdots, \alpha_m) 里的每一个又太慢了。

那么SMO算法的核心就是:给定一个 α=(α1,α2,,αm)\alpha = (\alpha_1, \alpha_2, \cdots, \alpha_m),我们只允许改变其中的两个 α\alpha,一直调试直到损失函数返回其最小值,然后我们再挑其他两个 α\alpha 并重复此步骤。最终,我们就会求得原问题的损失函数的最小值。

SMO的一大优势在于求解两个拉格朗日乘子是可以求其分析解的。因此,尽管SMO 执行了更多的子优化问题,每一个子问题都会更快的被解决。

补充内容:

强烈建议阅读前三个!

实际应用和代码展示

SVM相关面经和其他资料

小结

我们在本节中深度探讨了其原理、核心思想、数学推导、延伸算法以及代码实现。支持向量机(SVM)作为一个在特征空间里寻找最大间隔的线性分类器,由于分类结果仅跟支持向量有关,无需依赖全部数据,并在特征维度大于样本数时依然有很好的效果,通过使用核函数来灵活解决各种非线性的分类回归问题。