5

SVM

支持向量机(Support Vector Machine),是另一个种监督学习算法,有时他更高效和强大。

回顾在逻辑回归中,我们使用如下规则:

如果y=1,那么$ h_\theta(x) \approx 1 $,进而$ Θ^Tx \gg 0 $
如果y=0,那么$ h_\theta(x) \approx 0 $,进而$ Θ^Tx \ll 0 $

逻辑回归的代价函数如下:

$$ \begin{align*}J(\theta) & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log(h_\theta(x^{(i)})) - (1 - y^{(i)})\log(1 - h_\theta(x^{(i)}))\\ & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log\Big(\dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big) - (1 - y^{(i)})\log\Big(1 - \dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big)\end{align*} $$

在SVM中,我么试图简化log函数,成为如下紫红色的函数线,而这个函数的结果接近log函数:

clipboard.png

clipboard.png

记$ cost_1(z) $是y=1时的代价函数,$ cost_0(z) $是y=0时的代价函数。注意到在$ cost_1(z) $中当z > 1时,$ cost_1(z) = 0 $;在$ cost_0(z) $中当z < -1时,$ cost_0(z) = 0 $。于是SVM的代价函数表示如下:

$$ J(\theta) = \frac{1}{m} \sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) $$

加入正则项后:

$$ J(\theta) = \frac{1}{m} \sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) + \dfrac{\lambda}{2m}\sum_{j=1}^n \Theta^2_j $$

由于常数系数m,并不会影响最小化代价函数,可以去掉;再记$ C = \frac{1}{λ} $,于是简化如下:

$$ J(\theta) = C\sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) + \dfrac{1}{2}\sum_{j=1}^n \Theta^2_j $$

如果想要增大正则项的比重(即降低拟合),我们可以减小C;反之,通过增大C可以防止欠拟合。

大间距分类器

注意到,在SVM中:

如果y=1,那么$ Θ^Tx \ge 1 $,而不是$ \ge 0 $
如果y=0,那么$ Θ^Tx \le -1 $,而不是$ \le 0 $

现在如果我们设置C为非常大的一个数,那么在最小化代价函数的过程中,$ \Theta $会趋向于满足如下条件:

$$ \sum_{i=1}^m y^{(i)}\text{cost}_1(\Theta^Tx) + (1 - y^{(i)})\text{cost}_0(\Theta^Tx) = 0 $$

于是代价函数简化为:

$$ \begin{align*} J(\theta) = \frac{1}{2}\sum_{j=1}^n \Theta^2_j \end{align*} $$

同时受限于条件$ Θ^Tx \ge 1 $和$ Θ^Tx \le -1 $,将使得我们的决策边界呈现出如下黑色实线:

clipboard.png

上图的绿色实线看起来也是可以分割样本的,但是明显不如黑色实线好,那是因为,黑色实线距离样本的间距(margin)更大。因此,直观的看SVM是倾向于大间隔的分类器。

至于为什么SVM会倾向于选择更大间距的决策边界,这跟向量投影理论有关,这里略过。

核函数

核函数帮助我们基于SVM创建更复杂的非线性的分类器。

给定一个样本x,把该样本跟几个参考点$ l^{(1)} $ $ l^{(2)} $ $ l^{(3)} $的相似度作为新的特征使用。这里的相似度使用如下函数:

$$ f_i = similarity(x, l^{(i)}) = \exp(-\dfrac{||x - l^{(i)}||^2}{2\sigma^2}) $$

这个函数称为高斯核函数(Gaussian Kernal),这是核函数的一种。当x和某个l的距离很近的时候,函数结果趋向于1;反之,当x和某个l的距离很大时,趋近于0。

假设原始的x具有两个特征$ (x_1, x_2) $二维平面的点,这个点距离某个参考点的高斯核函数具有如下类似图像:

clipboard.png

这个凸面上的点的高度就是函数的值,当$ (x_1, x_2) $接近参考点时,函数值越接近1,反正越趋向于0。

高斯核函数有个参数σ,当σ越大,凸面更平缓,意味着我们对两个点距离的相近度越宽容;当σ越小,凸面更尖锐,意味着我们对两个点距离的相近度越严苛

clipboard.png

一种选取参考点的方法是,将每一个样本都作为参考点。当样本数为m时,参考点的数量也是m。于是对于参考点$ l^{(1)} $,需计算样本中的每一个点与其相似度:

$$ f_1 = similarity(x,l^{(1)}) = \exp(-\dfrac{\sum^n_{j=1}(x_j-l^{(1)})^2}{2\sigma^2}) $$

这样我们可以计算出一组新的样本$ f $,样本数量为m,然后使用$ f $代替$ x $使用SVM,最小化如下代价函数:

$$ \min_{\Theta} C \sum_{i=1}^m y^{(i)}\text{cost}_1(\Theta^Tf^{(i)}) + (1 - y^{(i)})\text{cost}_0(\theta^Tf^{(i)}) + \dfrac{1}{2}\sum_{j=1}^n \Theta^2_j $$

这种通过核函数来转变样本并作用在SVM算法中的方法,也可以用于逻辑回归。不过SVM与核函数组合使用是经过优化的,因此,计算效率比其他算法要高。

应用SVM

如果使用高斯核函数,那么在SVM中,我们需要调整的参数有两个:

  • C: 相当于$ \dfrac{1}{\lambda} $,C越大越趋向于过拟合;C越小越趋向于欠拟合。
  • $ σ^2 $: 通过上面高斯核函数的图,$ σ^2 $越大,距离敏感度越低,越容易产生误判,于是越容易欠拟合;$ σ^2 $越小,距离敏感度越高,越不容易产生误判,但越容易过拟合。

在设计SVM的模型时,不建议自己编写SVM的实现,因为成熟的库通常效率更好。在应用SVM时,你需要作如下决策:

  • 参数C
  • 使用何种核函数,或者不使用核函数
  • 对于高斯核函数,需要调整参数$ σ^2 $
  • 在使用高斯核函数前,需进行参数缩放,即归一化
  • 如果样本的特征大于样本的数量(n > m),建议使用逻辑回归,或者无核函数的SVM;如果样本的特征小于样本的数量(n < m),可考虑高斯核函数+SVM;如果样本特征远小于样本数量,考虑手工添加特征,并使用逻辑回归或无核函数的SVM。

P_Chou水冗
5.1k 声望256 粉丝

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发