大部分资料都在讲SVM的kernel等看似高大上的东西,却忽略了SVM的模型表达式这一关键,造成大家看SVM资料觉得云里雾里的感觉。
本文舍末求本,从SVM的模型理解开始,带大家理解SVM的基本思想,理解各个参数对SVM的性能影响。

直观理解SVM

以二维平面上的分类为例,下面给出了不同的分类可能,哪个才是最优的分类呢?

这里写图片描述

可以看出第一种分类方法是最好的,为什么呢?因为它的分类平面到两类边界的距离(Margin)最大。

所以SVM也叫Large Margin分类器。

SVM的模型表达式

首先,线性模型的表达式为

hθ(x)=θ0+θ1x1+θ2x2+...+θnxn
<script type="math/tex; mode=display" id="MathJax-Element-1">h_{ \theta } (x)= \theta_{0}+ \theta_{1}x_{1} + \theta_{2}x_{2} + . . . + \theta_{n}x_{n}</script>[1]

其中

  • x1 <script type="math/tex" id="MathJax-Element-2">x_{1}</script>~ xn <script type="math/tex" id="MathJax-Element-3">x_{n}</script>就是n个特征,作为模型的输入
  • θ0 <script type="math/tex" id="MathJax-Element-4">\theta_{0}</script>~ θn <script type="math/tex" id="MathJax-Element-5">\theta_{n}</script>,就是线性模型的n+1个参数

把线性模型表达式中的 xi <script type="math/tex" id="MathJax-Element-6">x_{i}</script>替换成 fi <script type="math/tex" id="MathJax-Element-7">f_{i}</script>,就得到了SVM模型的表达式

hθ(x)=θ0+θ1f1+θ2f2+...+θnfn
<script type="math/tex; mode=display" id="MathJax-Element-8">h_{ \theta } (x)= \theta_{0}+ \theta_{1}f_{1} + \theta_{2}f_{2} + . . . + \theta_{n}f_{n}</script>[2]

其中
* fi <script type="math/tex" id="MathJax-Element-9">f_{i}</script>是 xi <script type="math/tex" id="MathJax-Element-10">x_{i}</script>的核函数,也就是 xi <script type="math/tex" id="MathJax-Element-11">x_{i}</script>的非线性多项式项。例如 f1=x1x2 <script type="math/tex" id="MathJax-Element-12">f_{1}=x1*x2</script>

可见
* SVM和线性回归是非常类似的
* 由于有了非线性多项式项,SVM对非线性的拟合能力很强,但已被噪声影响(拟合能力过强)

理解了SVM的模型,也就不觉得它有多复杂了。

SVM与线性回归的代价函数有很大的不同。

SVM的Cost Function(代价函数)

下面对比SVM与Logistic回归(把线性回归的结果作为Logistic函数的输入)的代价函数区别。(代价函数的物理含义就是预测值与真实值之间的误差)

Logistic回归的代价函数

J(θ)=(ylog(h(x))+(1y)log(1h(x)))
<script type="math/tex; mode=display" id="MathJax-Element-13">J(\theta) = - (ylog(h(x))+(1-y)log(1-h(x)))</script>

h(x) <script type="math/tex" id="MathJax-Element-14">h(x)</script>替换为Logistic函数,就得到其代价函数为:

J(θ)=(ylog(11+eθTx)+(1y)log(111+eθTx))
<script type="math/tex; mode=display" id="MathJax-Element-15">J(\theta) = - (ylog(\frac{1}{1+{e}^{-{\theta}^{T}x}})+(1-y)log(1-\frac{1}{1+{e}^{-{\theta}^{T}x}}))</script>

SVM的代价函数

SVM的代价函数与Logistic回归的代价函数比较接近。下图中的蓝色曲线是Logistic归回代价函数中的两个表达式。

这里写图片描述
红色曲线是逼近蓝色函数的函数。

用cost1(z)和cost0(z)代替h(x),可得SVM的代价函数

J(θ)=C1m(y(i)cost1(θTx(i))+(1y(i))cost0(θTx(i)))+121n(θj2)
<script type="math/tex; mode=display" id="MathJax-Element-16">J(\theta) = C\sum_{1}^{m}({y}^{(i)}cost1({\theta }^{T}{x}^{(i)})+(1-{y}^{(i)})cost0({\theta }^{T}{x}^{(i)}))+\frac{1}{2}\sum_{1}^{n}({{\theta }_{j}}^{2})</script>

其中

  • C类似于正则化中 1λ <script type="math/tex" id="MathJax-Element-17">\frac{1}{\lambda }</script>的作用。C越大,拟合非线性的能力越强。

可见,SVM的代价函数与Logistic回归的代价函数也是很类似的。

核函数(Kernel)

SVM模型表达式中的 fi <script type="math/tex" id="MathJax-Element-18">f_{i}</script>是 xi <script type="math/tex" id="MathJax-Element-19">x_{i}</script>的核函数。核函数能提高模型的Feature维度(低维到高维),从而使SVM具有较好的非线性拟合能力。

核函数效果的直观理解

假设一个SVM模型的表达式如下$$

h(x)=θ0+θ1f1+θ2f2+θ3f3
<script type="math/tex; mode=display" id="MathJax-Element-39">h(x)={\theta }_{0}+{\theta }_{1}{f }_{1}+{\theta }_{2}{f }_{2}+{\theta }_{3}{f }_{3}</script>

模型的输入x是二维的(用x1和x2表示),先手工标记三个点

这里写图片描述
对每一个模型的输入x,另核函数为x与三个点的相似度:

f1=similarity(x,l(1))=exp(xl(1)22σ2)
<script type="math/tex; mode=display" id="MathJax-Element-21">{f }_{1}=similarity(x, {l}^{(1)})=exp(-\frac{ {\parallel x-{l}^{(1)} \parallel}^{2} }{2{\sigma }^{2}})</script>
f2=similarity(x,l(2))=exp(xl(2)22σ2)
<script type="math/tex; mode=display" id="MathJax-Element-22">{f }_{2}=similarity(x, {l}^{(2)})=exp(-\frac{ {\parallel x-{l}^{(2)} \parallel}^{2} }{2{\sigma }^{2}})</script>
f3=similarity(x,l(3))=exp(xl(3)22σ2)
<script type="math/tex; mode=display" id="MathJax-Element-23">{f }_{3}=similarity(x, {l}^{(3)})=exp(-\frac{ {\parallel x-{l}^{(3)} \parallel}^{2} }{2{\sigma }^{2}})</script>

l(1)=[3;5] <script type="math/tex" id="MathJax-Element-24">{l}^{(1)}=[3;5]</script>, σ=1 <script type="math/tex" id="MathJax-Element-25">\sigma=1</script>,则 f1=exp((x13)2(x25)2) <script type="math/tex" id="MathJax-Element-26">{f }_{1}=exp(-{(x1-3)}^{2}-{(x2-5)}^{2})</script>。这是一个三维曲面。

核函数将二维的x提高到了三维空间。

高斯核

上面的相似度函数,就是高斯核,其定义为

fi=similarity(x,l(i))=exp(xl(i)22σ2)
<script type="math/tex; mode=display" id="MathJax-Element-27">{f }_{i}=similarity(x, {l}^{(i)})=exp(-\frac{ {\parallel x-{l}^{(i)} \parallel}^{2} }{2{\sigma }^{2}})</script>

由其定义可知,如果x与手工选取的点 l(i) <script type="math/tex" id="MathJax-Element-28">{l}^{(i)}</script>很接近,则 fi=1 <script type="math/tex" id="MathJax-Element-29">{f }_{i}=1</script>。否则 fi=0 <script type="math/tex" id="MathJax-Element-30">{f }_{i}=0</script>

且高斯核函数的最大值为1,最小值为0。

SVM的参数

综上,SVM最重要的参数有2个:C与核函数中的 σ <script type="math/tex" id="MathJax-Element-52">\sigma</script>

  • C类似于正则化中 1λ <script type="math/tex" id="MathJax-Element-53">\frac{1}{\lambda }</script>的作用。C越大,拟合非线性的能力越强。
    • large C: High Variance
    • small C: High Bias

σ <script type="math/tex" id="MathJax-Element-54">\sigma</script>的大小对核函数形状的影响关系见下图

这里写图片描述

  • σ <script type="math/tex" id="MathJax-Element-55">\sigma</script>越大,f越平滑,非线性效能越小,对噪声越不敏感
    • large σ <script type="math/tex" id="MathJax-Element-56">\sigma</script>: High Bias
    • small σ <script type="math/tex" id="MathJax-Element-57">\sigma</script>: High Variance

注意

使用SVM时,有两个点要注意:

  • 若使用核函数,一定要对Feature做Feature Scaling(Normalization)
  • 若训练集m太小,但Feature数量n很大,则训练数据不足以拟合复杂的非线性模型,这种情况下只能用linear-kernel(就是 fi=xi <script type="math/tex" id="MathJax-Element-58">{f }_{i}={x }_{i}</script>)不能用高斯核

参考

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐