博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支持向量机
阅读量:5347 次
发布时间:2019-06-15

本文共 15870 字,大约阅读时间需要 52 分钟。

概要

支持向量机很是重要,网上也有很好的学习材料。本篇主要参考支持向量机通俗导论,自己重新理一遍,希望能有所收获。

 


基本原理

支持向量机就是寻找一个超平面把特征点隔开。

  • 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;

  • 当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;

  • 当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

假设我们的样本数据线性可分,我们就是要找一个超平面

\begin{align}
f(x) = w^Tx+b
\end{align}
使得
\begin{align}
y = \begin{cases} 1, \quad f(x)\geqslant 0 \\ -1,\quad f(x)<0 \end{cases}
\end{align}
其中 1 和 -1 代表不同的类别。现在问题是如何确定参数 \(w\)\(b\) 能使不同类别的数据最大限度地分开。答案就是寻找两条边界端或极端划分直线中间的最大间隔,从而确定最终的最大间隔分类超平面和分类函数。

1255644-20180317192058520-2100951793.png

为此,我们首先定义一个距离度量:函数间隔

\begin{align}
\hat{\gamma}_i = y_i( w^Tx_i+b) = y_if(x_i)
\end{align}
为样本点 \(x_i\) 距超平面 \(y=wx+b\) 的距离。加入 \(y_i\) 的目的是因为 \(f(x)\)\(y\) 同号,使得距离度量不会小于 \(0\).

我们定义超平面 \((w, b)\) 关于训练数据集 \(T\) 的函数间隔为超平面 \((w,b)\) 关于 \(T\) 中所有样本点 \((x_i, y_i)\) 的函数间隔最小值:

\begin{align}
\hat{\gamma} = \min \hat{\gamma}_i,\quad i=1,2,\cdots,n
\end{align}
为了解决参数 \(w,b\) 成倍变化造成距离不一的问题,再引入几何间隔
\begin{align}
\tilde{\gamma} =\frac{\hat{\gamma}}{\lVert w \rVert}
\end{align}

这样以来,我们最大间隔分类器的目标可以定义为

\begin{align}
& \max \tilde{\gamma} \\
s.t. \quad & y_i(w^Tx_i + b) = \hat{\gamma}_i \geqslant \hat{\gamma}, \quad i=1,2,\cdots,n
\end{align}

其中 \(\hat{\gamma} = \tilde{\gamma}\lVert w \rVert\). 为了方便推导和优化的目的,我们令 \(\hat{\gamma} = 1\),此时,上述目标转化为

\begin{align}
&\max \frac{1}{\lVert w \rVert} \\
& s.t. \quad y_i(w^Tx_i + b) \geqslant 1, \quad i = 1,2,\cdots,n
\end{align}
通过求解这个问题,我们就可以找到一个间隔最大的分类器,如下图,中间的红色线条是最优超平面,另外两条线(该两条线上的点便是支持向量)到红线的距离都是等于 \(\tilde{\gamma}\) 的。

1255644-20180317194256695-1253123246.png

由于支持向量刚好在边界上,所以它们满足 \(y(w^Tx+b)=1=\hat{\gamma}\).

 

最优化求解

我们求解的问题等价于

\begin{align}
&\min \frac{1}{2} \lVert w \rVert^2 \\
& s.t. \quad y_i(w^Tx_i + b) \geqslant 1, \quad i = 1,2,\cdots,n
\end{align}
它是一个二次优化问题,目标函数是二次的,约束条件是线性的。

我们引入 Langrange 乘子,现在用一个函数便能清楚地表达出我们的问题

\begin{align} \label{e1}
L(w,b,\alpha) = \frac{1}{2} \lVert w \rVert^2 - \sum_{i=1}^n \alpha_i(y_i(w^Tx_i+b)-1)
\end{align}
然后我们令
\begin{align}
\theta(w) = \max_{\substack{\alpha_i\geqslant 0}} L(w,b,\alpha)
\end{align}
容易验证,当某个约束条件不满足时,例如 \(y_i(w^Tx_i+b)<1\),那么显然有 \(\theta(w) = +\infty\). 而当所有约束条件都满足时,则有 \(\theta(w) = \frac{1}{2}\lVert w \rVert ^2\),亦即我们最初要最小化的量。因此,在要求约束条件得到满足的情况下最小化 \(\frac{1}{2} \lVert w \rVert ^2\),实际上等价于直接最小化 \(\theta(w)\). 现在的目标函数变成了
\begin{align}
\min_{\substack{w,b}}\theta(w) = \min_{\substack{w,b}}\max_{\substack{\alpha_i\geqslant 0}} L(w,b,\alpha) = p^{*}
\end{align}
这个用 \(p^*\) 表示这个问题的最优值。

为什么要将求解SVM的原始问题转换为其对偶问题?

  • 是对偶问题往往更易求解(注意用拉格朗日对偶并没有改变最优解,而是改变了算法复杂度:原问题求解算法的复杂度与样本维度( 等于权值\(w\) 的维度)有关。如果原始数据维度太高就会严重提升运算时间,而在对偶问题下,求解算法的复杂度与样本数量有关,即把 SVM 从依赖 \(d\) 个维度转变到依赖 \(N\) 个数据点,考虑到最后计算时只有支持向量才有意义,所以这个计算量实际上比 \(N\) 小得多。)

其对偶形式是

\begin{align}
\max_{\substack{\alpha_i\geqslant 0}} \min_{\substack{w,b}} L(w,b,\alpha) = d^{*}
\end{align}
新问题的最优值用 \(d^*\) 表示,显然 \(d^* \leqslant p^*\). 总之,第二个问题的最优值 \(d^*\) 在这里提供了一个第一个问题的最优值 \(p^*\) 的一个下界,在满足 KKT 条件时,这两者相等,这个时候我们就可以通过求第二个问题来间接地求解第一个问题。

KKT 条件

  • 对于含有不等式约束的优化问题,常用的方法就是 KKT 条件。把所有的不等式约束、等式约束和目标函数全部写成形式:\(L(x, \alpha, \beta)=f(x)+\alpha g(x) +\beta h(x)\),KKT 条件是说最优值必须满足以下三个条件:(a) \(L(x, \alpha, \beta)\)\(x\) 求导为零。(b) \(h(x)=0\)(等式约束)。(3) \(\alpha g(x)=0\)(不等式约束)。求取这三个等式之后就能得到候选最优值。 深入理解.

要求解这个问题,分为三步:

  • 首先固定 \(\alpha\),要让 \(L\) 关于 \(w, b\) 最小化,我们分别对 \(w\)\(b\) 求偏导数,即令 \(\frac{\partial L}{\partial w}\)\(\frac{\partial L}{\partial b}\) 等于 0.
    \begin{align}
    \frac{\partial L}{\partial w} &= 0 \Rightarrow w = \sum_{i=1}^n \alpha_iy_ix_i \\
    \frac{\partial L}{\partial b} &=0 \Rightarrow \sum_{i=1}^n \alpha_i y_i =0
    \end{align}

代入式子 \ref{e1} 有

\begin{align}

L(w, b, \alpha) &= \frac{1}{2} \lVert w \rVert ^2 - \sum_{i=1}^n \alpha_i [y_i(w^Tx_i+b)-1] \notag \\
&= \frac{1}{2} w^T w -w^T \sum_{i=1}^n\alpha_iy_ix_i - b \sum_{i=1}^n\alpha_iy_i + \sum_{i=1}^n\alpha_i \notag \\
&= \frac{1}{2} w^T \sum_{i=1}^n\alpha_iy_ix_i - w^T \sum_{i=1}^n\alpha_iy_ix_i -b \cdot 0 + \sum_{i=1}^n\alpha_i \notag \\
&=\sum_{i=1}^n\alpha_i - \frac{1}{2} \left( \sum_{i=1}^n\alpha_iy_ix_i \right) ^T \sum_{i=1}^n\alpha_iy_ix_i \notag \\
&=\sum_{i=1}^n\alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_iy_j x_i^T x_j
\end{align}

从上面的式子就可以看出,此时的 Langrange 函数只包含了一个就是 \(\alpha_i\).

  • 求对 \(\alpha\) 的极大,即是关于对偶变量 \(\alpha\) 的优化问题。现在问题梳理如下:
    \begin{align}
    &\max_{\substack{\alpha}} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_iy_j x_i^T x_j \\
    & s.t. \quad \alpha_i \geqslant 0, \quad i = 1,2,\cdots,n ,\quad \sum_{i=1}^n \alpha_i y_i =0
    \end{align}

这个问题有个高效的解法,即 SMO (序列最小优化)算法。如果我们求得了 \(\alpha\),由第一步根据 \(w = \sum_{i=1}^n \alpha_iy_ix_i\) 即可求出 \(w\),然后通过 \(b=\frac{1}{2}(\max_{\substack{i : y_i=-1}} w^Tx_i + \min_{\substack{i:y_i=1}}w^Tx_i)\),即可求出 \(b\).

 

引入核函数和松驰变量

为什么引入核函数

  • 原始空间线性不可分,可以使用一个非线性映射将原始数据 \(x\) 变换到另一个高维特征空间,在这个空间中,样本变得线性可分。常用的核函数有线性核(\(k(x,y)=x^Ty+c\))、多项式核(\(k(x,y)=(\alpha x^Ty+c)^d\))、高斯核(\(k(x,y)=\mathrm{exp}(-\frac{\lVert x-y \rVert_2^2}{2\sigma^2})\))、拉普拉斯核(\(k(x,y)=\mathrm{exp}(-\frac{\lVert x-y \rVert_1}{\sigma})\))等。后两者属于径向基函数(Radial Basis Function,RBF),RBF 是指取值仅仅依赖于特定点距离的实值函数,它能把样本空间映射到无穷维。

以下.

对于 RBF 类的函数,如果参数 \(\sigma\) 过小,会造成只会作用于支持向量样本附近,对未知样本分类效果很差,容易过拟合。而如果参数 \(\sigma\) 过大,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率,“须知 RBF 实际是记忆了若干样例,在支持向量中各维权重重要性等同,线性核学出的权重是 feature weighting 作用或特征选择” 。

关于 RBF 核应该可以得到与线性核相近的效果(按照理论,RBF 核可以模拟线性核),可能好于线性核,也可能差于,但是,不应该相差太多。当然,很多问题中,比如维度过高,或者样本海量的情况下,大家更倾向于用线性核,因为效果相当,但是在速度和模型大小方面,线性核会有更好的表现

关于如何选取核函数.

前面类似可以写出

\begin{align}
&\min \frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n \alpha_i \alpha_jy_i y_j k(x_i, x_j) - \sum_{i=1}^n \alpha_i \\
s.t.\quad & \alpha_i \geqslant 0, \quad i = 1,2,\cdots,n \\
& \sum_{i=1}^n \alpha_iy_i=0
\end{align}

加入核函数之后依然用式 \ref{a1} 来预测样本,只不过把内积改为核函数。进一步参考.

 
为什么引入松驰变量

  • 一些离群点或者噪声点影响分界面

为了解决离群点的问题,我们引入松驰变量,即允许某些样本不满足约束:

\begin{align}
w^Tx_i+b & \geqslant 1-\xi_i,\quad y_i = 1 \notag \\
w^Tx_i+b & \leqslant -1+\xi_i,\quad y_i = -1 \notag
\end{align}
这样新模型就变成
\begin{align}
&\min \frac{1}{2} \lVert w \rVert^2 + C\sum_{i=1}^n \xi_i\\
s.t. \quad & y_i(w^Tx_i - b) \geqslant 1-\xi_i, \quad i = 1,2,\cdots,n \\
& \xi_i \geqslant 0,\quad i = 1,2,\cdots,n
\end{align}
其中 \(C\) 是一个参数,可以理解成惩罚系数,用于控制目标函数中两项寻找间隔最大的超平面保证数据点偏差量最小之间的权重。\(C\) 越大,表明越不能容忍出现误差,这时候容易过拟合,相反,\(C\) 太小容易欠拟合。注意 \(\xi\) 是需要优化的变量之一,而 \(C\) 是一个事先确定好的常量。

和前面类似,采用 Lagrange 乘数法进行求解,可以写出

\begin{align} \label{ee1}
L(w,b,\alpha,\xi, \beta) = \frac{1}{2} \lVert w \rVert^2 + C \sum_{i=1}^n \xi_i - \sum_{i=1}^n \alpha_i(y_i(w^Tx_i+b)-1+\xi_i)-\sum_{i=1}^n \beta_i \xi_i
\end{align}

求偏导之后令导数为 \(0\) 可以分别得到

\begin{align}
\frac{\partial L}{\partial w} &= 0 \Rightarrow w = \sum_{i=1}^n \alpha_iy_ix_i \\
\frac{\partial L}{\partial b} &=0 \Rightarrow \sum_{i=1}^n \alpha_i y_i =0 \\
\frac{\partial L}{\partial \xi_i} &=0 \Rightarrow C - \alpha_i - \beta_i =0,\quad i=1,2,\cdots,n
\end{align}

\(w\) 代回式 \ref{ee1} 中 \(L\) 并化简,即得到原来一样的目标函数:

\begin{align}

\max_{\substack{\alpha}} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_iy_j \langle x_i, x_j\rangle
\end{align}

不过,由于我们得到 \(C - \alpha_i - \beta_i =0\) 而又有 \(\beta_i \geqslant 0\),因此有 \(\alpha_i \leqslant C\). 所以最终的优化目标为

\begin{align}

&\max_{\substack{\alpha}} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_iy_j \langle x_i, x_j\rangle \\
s.t. \quad & 0 \leqslant \alpha_i \leqslant C, \quad i = 1,2,\cdots,n \\
&\sum_{i=1}^n \alpha_i y_i =0
\end{align}

核化的非线性形式也是一样的,只要把 \(\langle x_i, x_j\rangle\) 换成 \(\kappa( x_i, x_j )\) 即可。这样一来,可以处理线性和非线性并能容忍噪音和离群点的支持向量机的求解模型如下:

\begin{align}

&\min \frac{1}{2} \sum_{i=1}^n\sum_{j=1}^n \alpha_i \alpha_jy_i y_j \kappa( x_i, x_j )-\sum_{i=1}^n \alpha_i \label{e500} \\
s.t. \quad & 0 \leqslant \alpha_i \leqslant C, \quad i = 1,2,\cdots,n \\
& \sum_{i=1}^n \alpha_iy_i=0
\end{align}

 

关于系数 \(\alpha\) 的进一步理解

对于一个数据点 \(x\) 进行分类,实际上是通过把 \(x\) 代入到 \(f(x)=w^Tx+b\) 算出结果然后根据其正负号来进行类别划分的。我们把得到的 \(w = \sum_{i=1}^n \alpha_iy_ix_i\) 代入到分类函数 \(f(x)\)

\begin{align} \label{a1}
f(x) = \left( \sum_{i=1}^n \alpha_iy_ix_i \right)^Tx+b = \sum_{i=1}^n \alpha_iy_i \langle x_i, x \rangle +b
\end{align}
因此对于新点 \(x\) 的预测,只需要计算它与训练数据点的内积即可。此外,所谓“支持向量”也在这里显示出来,事实上,所有非支持向量对应的系数 \(\alpha\) 都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。为什么非支持向量对应的 \(\alpha\) 等于零呢?直观上来理解的话,就是这些“后方的点”对超平面没有影响,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。严谨一点的解释,之前通过 Lagrange 乘数法得到的优化目标:
\begin{align}
\max_{\substack{\alpha_i \geqslant 0}} L(w, b, \alpha) = \frac{1}{2}\lVert w \rVert^2 - \sum_{i=1}^n \alpha_i \color{red}{(y_i(w^Tx_i+b)-1)}
\end{align}
注意到如果 \(x_i\) 是支持向量的话,红色部分是等于零的(因为支持向量的函数间隔等于 \(1\)),而对于非支持向量来说,函数间隔会大于 \(1\),因此红色部分是大于 \(0\) 的,而 \(\alpha_i\) 又是非负的,为了满足最大化,\(\alpha_i\) 必须等于 \(0\),这也就是非支持向量的局限性。

 

逻辑回归和支持向量机区别

 

SMO 算法的计算

 

\(\alpha\) 的求解

 

\(u_i=w^Tx_i-b\),根据 KKT 条件可以得出其中 \(\alpha_i\) 取值的意义为:
\begin{align} \label{e515}
\alpha_i=0 & \Leftrightarrow y_iu_i > 1 \\ \label{e516}
0<\alpha_i<C & \Leftrightarrow y_iu_i = 1 \\ \label{e517}
\alpha_i=C & \Leftrightarrow y_iu_i < 1
\end{align}

  1. \ref{e515} 式表明是正常分类。
  2. \ref{e516} 式表明了是支持向量,在边界上。
  3. \ref{e517} 式表明了是在两条边界之间。

而最优解需要满足 KKT 条件,即上述 3 个条件都得满足,以下几种情况出现将会出现不满足:

  1. \(y_iu_i < 1\) 但是 \(\alpha_i < C\),则是不满足的,而应该 \(\alpha_i = C\)
  2. \(y_iu_i > 1\) 但是 \(\alpha_i > 0\),则是不满足的,而应该 \(\alpha_i = 0\)
  3. \(y_iu_i = 1\) 但是 \(\alpha_i = 0\) 或者 \(\alpha_i=C\),则是不满足的,而应该 \(0 < \alpha_i < C\)

所以要找出不满足 KKT 条件的这些 \(\alpha_i\) 并更新,但这些 \(\alpha_i\) 又受到另一个条件的约束:

\begin{align}
\sum_{i=1}^n \alpha_i y_i = 0
\end{align}
因此,我们通过另一个方法,即同时更新 \(\alpha_i\)\(\alpha_j\) ,要求满足 \ref{e519} 式,就能保证和为 \(0\) 的约束
\begin{align} \label{e519}
\alpha_i^{new}y_i + \alpha_j^{new}y_j = \alpha_i^{old}y_i + \alpha_j^{old}y_j = \text{常数}
\end{align}
为了方便,我们将该常数记成 \(\zeta\),即 \(\alpha_i y_i + \alpha_jy_j = \zeta\). 当 \(y_i\)\(y_j\) 异号时,即一个为 \(-1\),一个为 \(1\),这时它们可以表示成一条直线,斜率为 \(1\)。如图

1255644-20180320195250735-947600018.png

\(\alpha_i\) 当成 \(\alpha_1\)\(\alpha_j\) 当成 \(\alpha_2\)()。由于 \(\alpha_i\)\(\alpha_j\) 既要在矩形方框内,又要在直线上,所以 \(\alpha_j\) 的取值上下界为

\begin{align}
L&=\max(0,\alpha_j-\alpha_i) \\
H&=\min(C, C+\alpha_j-\alpha_i)
\end{align}
\(L \leqslant \alpha_j \leqslant H\). 同理当 \(y_i\)\(y_j\) 同号时,有
\begin{align}
L&=\max(0,\alpha_j+\alpha_i-C) \\
H&=\min(C, \alpha_j+\alpha_i)
\end{align}

我们把式 \ref{e500} 中和 \(\alpha_i\)\(\alpha_j\) 有关的项抽取出来,即:

\begin{align}
&\frac{1}{2} \sum_{i=1}^n\sum_{j=1}^n \alpha_i \alpha_jy_i y_j \kappa( x_i, x_j )-\sum_{i=1}^n \alpha_i \notag \\ \label{e630}
=&\frac{1}{2}\alpha_i^2 K_{ii} + \frac{1}{2}\alpha_j^2 K_{jj} + \alpha_i\alpha_jy_iy_jK_{ij} + \alpha_iy_iV_i+\alpha_jy_jV_j-\alpha_i-\alpha_j+ \psi_{constant}
\end{align}
其中
\begin{align}
K_{ij} &= \kappa(x_i, x_j) \notag \\
V_i &= \sum_{k \neq i,j} \alpha_k y_k K_{ik} = u_i+b-y_i\alpha_i^{old}K_{ii}-y_j\alpha_j^{old}K_{ij} \\
V_j &= \sum_{k \neq i,j} \alpha_k y_k K_{jk} = u_j+b-y_i\alpha_i^{old}K_{ij}-y_j\alpha_j^{old}K_{jj}
\end{align}

由于 \(\alpha_i\)\(\alpha_j\) 满足

\begin{align}
\alpha_i^{old}y_i + \alpha_j^{old}y_j = -\sum_{k\neq i,j} y_k \alpha_k^{old} = \alpha_iy_i+\alpha_jy_j
\end{align}

然后我们用 \(\alpha_j\) 表示 \(\alpha_i\)(由于 \(y_i=\pm 1\),乘或除以等价):

\begin{align}
\alpha_i = (\zeta - \alpha_j y_j) y_i
\end{align}
然后反代入 \ref{e630} 中得
\begin{align}
& \psi = \frac{1}{2}\alpha_i^2 K_{ii} + \frac{1}{2}\alpha_j^2 K_{jj} + \alpha_i\alpha_jy_iy_jK_{ij} + \alpha_iy_iV_i+\alpha_jy_jV_j-\alpha_i-\alpha_j+ \psi_{constant} \notag \\ \label{ee12}
&= \frac{1}{2}(\zeta - \alpha_j y_j)^2 K_{ii} + \frac{1}{2}\alpha_j^2 K_{jj} + (\zeta - \alpha_j y_j)\alpha_jy_jK_{ij} + (\zeta - \alpha_j y_j)V_i+\alpha_jy_jV_j-(\zeta - \alpha_j y_j)y_i-\alpha_j+ \psi_{constant}
\end{align}
这时候只有 \(\alpha_j\) 是变量了。求导
\begin{align} \label{ee1222}
\frac{d\, \psi}{d\,\alpha_j} = \alpha_jK_{ii} - \zeta y_jK_{ii}+\alpha_jK_{ii} +\zeta y_jK_{ij} - 2\alpha_jK_{ij} -y_jV_i+y_jV_j+y_iy_j-1
\end{align}
令该导数等于 \(0\),那么上式化简为
\begin{align}
\alpha_j(K_{ii}+K_{jj}-2K_{ij}) = \zeta y_j(K_{ii}-K_{ij})+y_j(V_i-V_j)-y_iy_j +1
\end{align}

\(\zeta = \alpha_i^{old}y_i+\alpha_j^{old}y_j\)\(V_i,V_j\) 代入上式得

\begin{align}
\alpha_j(K_{ii}&+K_{jj}-2K_{ij}) = \zeta y_j(K_{ii}-K_{ij})+y_j(V_i-V_j)-y_iy_j +1 \notag \\
&= (\alpha_i^{old}y_iy_j+\alpha_j^{old})(K_{ii}-K_{ij}) -(\alpha_i^{old}y_iy_j)(K_{ii}-K_{ij})- \alpha_j^{old}(K_{ij}-K_{jj})+y_i(u_i-u_j)-y_iy_j+1 \notag \\ \label{e666}
&= \alpha_j^{old}(K_{ii}-2K_{ij}+K_{jj}) + y_j(u_i-u_j-y_i+y_j)
\end{align}
我们令
\begin{align}
\eta = K_{ii}+K_{jj}-2K_{ij}
\end{align}
那么式 \ref{e666} 两边同除以 \(\eta\) 可得
\begin{align}
\alpha_j &= \alpha_j^{old} + \frac{y_j(E_i-E_j)}{\eta} \\
\text{其中} \quad E_i &= u_i-y_i,\quad E_j=u_j-y_j \notag
\end{align}

最后要保证 \(L \leqslant \alpha_j \leqslant H\),所以

\begin{align}
\alpha_j ^{new,clipped}= \begin{cases} H,\quad \alpha_j^{new} \geqslant H \\ \alpha_j^{new} ,\quad L < \alpha_j^{new} < H \\ L, \quad \alpha_j^{new} \leqslant L \end{cases}
\end{align}

这样得到 \(\alpha_j^{new}\) 后,通过下式得到 \(\alpha_i^{new}\).

\begin{align}\label{ee11}
\alpha_i^{new} = \alpha_i^{old}+y_iy_j(\alpha_j^{old}-\alpha_j ^{new,clipped})
\end{align}

每次更新完 \(\alpha_i\)\(\alpha_j\) 后,都需要再重新计算 \(b\),以及对应的 \(E_i\)\(E_j\).

 
  Mercer 定理:任何半正定的函数都可以作为核函数。所谓半正定的函数 \(f(x_i,x_j)\),是指拥有训练数据集合 \((x_1,x_2,\cdots,x_n)\),我们定义一个矩阵的元素 \(a_{ij} = f(x_i,x_j)\),这个矩阵式 \(n*n\) 的,如果这个矩阵是半正定的,那么 \(f(x_i,x_j)\) 就称为半正定的函数。这个 Mercer 定理不是核函数必要条件,只是一个充分条件,即还有不满足 Mercer 定理的函数也可以是核函数。
 

在特殊情况下,\(\eta\) 可能不为正。如果核函数 \(\kappa\) 不满足 Mercer 定理,那么目标函数可能变得非正定,则 \(\eta\) 可能出现负值,即使满足 Mercer 定理,如果训练样本中出现相同的特征 \(x\),那么 \(\eta\) 仍有可能为 \(0\). 不过 SMO 算法在 \(\eta\) 不为正值时仍然有效。从式 \ref{ee1222} 中我们知道 \(\eta\) 就是 \(\psi\)\(\alpha_j\) 的二阶导数,如果 \(\eta <0\)\(\psi\) 没有极小值,最小值在边缘处取得,如果 \(\eta = 0\),则 \(\psi\) 是单调函数,最小值仍在边缘处取得,所以 \(\alpha_j\) 的取值要么 \(L\) 要么 \(H\). 这样将 \(\alpha_j=L\)\(\alpha_j=H\) (由式 \ref{ee11} 得到 \(\alpha_i^{new}\))分别代入 \(\psi\),使得 \(\psi\) 较小的即为 \(\alpha_j\) 的应取值。

 

参数 \(b\) 的求解

 

下面求解参数 \(b\). 参数 \(b\) 每一步都要更新,因为前面的 KKT 条件式 \ref{e515} \(\sim\) \ref{e517} 指出了 \(\alpha_i\)\(y_iu_i\) 的关系,而 \(u_i\)\(b\) 有关,在每一步计算出 \(\alpha_i\) 后,根据 KKT 条件来调整 \(b\).

\(\alpha_i^{new}\) 不在边界,即 \(0< \alpha_i^{new} < C\) 时,由 KKT 条件知:\(y_iu_i=1\),而 \(u_i = w^Tx_i+b\),则

\begin{align} \label{e3528}
b_i^{new} = y_i- \sum_{k\neq i,j}^n\alpha_ky_k\kappa(x_k, x_i) - \alpha_i^{new}y_i\kappa(x_i,x_i) - \alpha_j^{new}y_j\kappa(x_i,x_j)
\end{align}
\(E_i = u_i - y_i\) 展开知:
\begin{align}
E_i = \alpha_i^{old}y_i\kappa(x_i,x_i) + \alpha_j^{old}y_j\kappa(x_i,x_j)+ \sum_{k\neq i,j}^n\alpha_ky_k\kappa(x_k, x_i) + b_i^{old}-y_i
\end{align}
将式 \ref{e3528} 中的求和项抵消掉就得到
\begin{align}
b_i^{new} = b_i^{old} -E_i-y_i(\alpha_i^{new} - \alpha_i^{old})\kappa(x_i,x_i)-y_j(\alpha_j^{new} - \alpha_j^{old})\kappa(x_i,x_j)
\end{align}
同理,当 \(0< \alpha_j^{new} < C\) 时有
\begin{align}
b_j^{new} = b_j^{old} -E_j-y_i(\alpha_i^{new} - \alpha_i^{old})\kappa(x_i,x_j)-y_j(\alpha_j^{new} - \alpha_j^{old})\kappa(x_j,x_j)
\end{align}

如果 \(\alpha_i^{new}\)\(\alpha_j^{new}\) 都在界上,说明 \(b_i^{new}\)\(b_j^{new}\) 之间所有值都满足 KKT 条件,一般取其中间值。所以 \(b\) 的更新有几种情况:

\begin{align}
b^{new} = \begin{cases} b_i^{new} \qquad 0 < \alpha_i^{new} < C \notag \\ b_j^{new} \qquad 0 < \alpha_j^{new} < C \\ \frac{1}{2}(b_i^{new}+b_j^{new}),\quad \text{其它} \notag \end{cases}
\end{align}
再次强调:每次更新完 \(\alpha_i\)\(\alpha_j\) 后,都需要再重新计算 \(b\),以及对应的 \(E_i\)\(E_j\).
 

SMO中拉格朗日乘子的启发式选择方法

 

所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,主要包括以下两个步骤

  1. 先“扫描”所有乘子,把第一个违反 KKT 条件的作为更新对象,令为 \(\alpha_j\).
  2. 在所有不违反 KKT 条件的乘子中,选择使 \(\lvert E_i-E_j\rvert\) 最大的 \(\alpha_i\).

第 2 个步骤主要基于一个原则:更新就能最大限度地增大目标函数值。

 

优缺点

 

优点:泛化错误率低,计算开销不大,结果易解释

缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。

 

一些问题

为什么 SVM 对缺失数据敏感?

 

这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM 没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对 SVM 的性能很重要。缺失特征数据将影响训练结果的好坏。
 

SVM 如何处理多分类问题?

 

一般有两种做法:一种是直接法,直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面。看似简单但是计算量却非常的大。

另外一种做法是间接法:对训练器进行组合。其中比较典型的有一对一,和一对多。

一对多,就是对每个类都训练出一个分类器,由 SVM 是二分类,所以将此而分类器的两类设定为目标类为一类,其余类为另外一类。这样针对 \(k\) 个类可以训练出 \(k\) 个分类器,当有一个新的样本来的时候,用这 \(k\) 个分类器来测试,那个分类器的概率高,那么这个样本就属于哪一类。这种方法效果不太好,bias 比较高。

SVM 一对一法(one-vs-one),针对任意两个类训练出一个分类器,如果有 \(k\) 类,一共训练出 \(C(2,k)\) 个分类器,这样当有一个新的样本要来的时候,用这 \(C(2,k)\) 个分类器来测试,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类。

转载于:https://www.cnblogs.com/zhoukui/p/8618711.html

你可能感兴趣的文章
较快的maven的settings.xml文件
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
malloc() & free()
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
关于这次软件以及pda终端的培训
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
新手村之循环!循环!循环!
查看>>
线程安全问题
查看>>
linux的子进程调用exec( )系列函数
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>