吴恩达学习笔记——十二、支持向量机 (Support Vector Machines)

十二、支持向量机 (Support Vector Machines)

12.1 优化目标

逻辑回归神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。
也属于监督学习算法

为了描述支持向量机,事实上,我们从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。

如前所述,逻辑回归假设如下: h ( z ) = 1 1 + e − θ T x h( z )=\frac{1}{1+{ {e}^{-\theta^Tx}}} h(z)=1+eθTx1

图像img

为了解释数学,我们使用上面定义的 $z = \theta^{T}x $

我们希望逻辑回归做什么?

  • 我们有一个y = 1的例子
  • 我们希望当 h θ ( x ) { {h}_{\theta }}\left( x \right) hθ(x) 趋近 1
    • 因为我们想要正确地将此样本分类,这就意味着当 h θ ( x ) { {h}_{\theta }}\left( x \right) hθ(x)趋近于1时,$z = \theta^{T}x $ 应当远大于0
  • h θ ( x ) { {h}_{\theta }}\left( x \right) hθ(x) 趋近 0
    • 对应于 θ T x \theta^Tx θTx,或者就是 z z z 会远小于0

让我们换一种思维

h θ ( x ) = g ( θ T X ) h_\theta \left( x \right)=g\left(\theta^{T}X \right) hθ(x)=g(θTX)

g ( z ) = 1 1 + e − z g\left( z \right)=\frac{1}{1+{ {e}^{-z}}} g(z)=1+ez1

J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}\log \left( {h_\theta}\left( { {x}^{(i)}} \right) \right)+\left( 1-{ {y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( { {x}^{(i)}} \right) \right)]} J(θ)=m1i=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]

类似于上面的例子,每一组数据都会为cost function增加一项,对与总的cost function,我们会将所有的训练集提供的项求和,并乘以 1 m \frac{1}{m} m1

现在先忽略 1 m \frac{1}{m} m1这一项,一起来考虑两种情况:

  • y = 1 y=1 y=1

    • cost function中只有第一项( y ( i ) log ⁡ ( h θ ( x ( i ) ) { {y}^{(i)}}\log ( {h_\theta}( { {x}^{(i)}}) y(i)log(hθ(x(i)))起作用

    • 因此,当在 y = 1 y=1 y=1 时,得到下面这张图
      在这里插入图片描述

    • 该图显示了在给定 z z z 的情况下 y = 1时示例的成本贡献

      • 因此,如果z大,则cost低——这很好!
      • 如果z为0或负数,则cost贡献较高
      • This is why, when logistic regression sees a positive example, it tries to set θ T x \theta^T x θTx to be a very large term
  • y = 0 y=0 y=0

    • cost function中只有第二项 ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) \left( 1-{ {y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( { {x}^{(i)}} \right) \right) (1y(i))log(1hθ(x(i)))起作用
    • 同上得到下图:
      在这里插入图片描述
    • 如果z小则cost低
    • 但是如果z大,那么cost就很大

Logistic回归成本函数的SVM成本函数

要构建SVM,我们必须重新定义成本函数,我们以上面的两张图为基础:

  • y = 1 y=1 y=1

    • y = 1 y=1 y=1的函数并创建一个新的cost function
    • 代替旧的cost function曲线,创建两条直线(洋红色),它们近似于逻辑回归y = 1函数
      在这里插入图片描述
    • 在z轴上取点(1)
      • 从这个点斜率 = 0
    • 这意味着新的曲线是由两条直线组合而成
    • 所以这是新的y = 1 cost function
      • 使SVM具有计算优势和更轻松的优化问题
      • 我们称此cost function为: c o s t 1 ( z ) cost_1(z) cost1(z)
  • y = 0 y=0 y=0

    • 用y = 0函数图做等效项
      在这里插入图片描述
    • 我们称此cost function为: c o s t 2 ( z ) cost_2(z) cost2(z)

完整的 SVM cost function

m i n 1 m ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T x ( i ) ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ) ] + λ 2 m ∑ i = 1 n θ j 2 min\frac{1}{m}\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}cost_1 \left(\theta^Tx^{(i)}) \right)+\left( 1-{ {y}^{(i)}} \right)cost_0\left(\theta^Tx^{(i)}) \right]}+\frac{\lambda}{2m}\sum\limits_{i=1}^{n}\theta^2_j minm1i=1m[y(i)cost1(θTx(i)))+(1y(i))cost0(θTx(i))]+2mλi=1nθj2

表示方法不同处

  • 除去 1 / m 1/m 1/m这一项

    • 去除这一项并不会导致得出的参数出现变化
  • 对于逻辑回归的两个条件

    • 训练数据集项( [ y ( i ) c o s t 1 ( θ T x ( i ) ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ) ] [{ {y}^{(i)}}cost_1 \left(\theta^Tx^{(i)}) \right)+\left( 1-{ {y}^{(i)}} \right)cost_0\left(\theta^Tx^{(i)}) \right] [y(i)cost1(θTx(i)))+(1y(i))cost0(θTx(i))])= A
    • 正则化项( 1 2 ∑ i = 1 n θ j 2 \frac{1}{2}\sum\limits_{i=1}^{n}\theta^2_j 21i=1nθj2)= B
      • 因此我们可以将其描述为A + λB
      • 需要某种方式来处理正则化项和训练样本的代价之间的平衡
      • 为λ设置不同的值 以参数化找到这个最好的拟合
    • 参数化为 A + λB 替换
      • 对于SVM,约定是使用另一个称为C的参数
      • CA + B也是如此
      • 如果C等于1 / λ,那么两个函数(CA + B和A + λB) 将给出相同的值
  • 我们最后得到的等式是: m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T x ( i ) ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ) ] + 1 2 ∑ i = 1 n θ j 2 minC\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}cost_1 \left(\theta^Tx^{(i)}) \right)+\left( 1-{ {y}^{(i)}} \right)cost_0\left(\theta^Tx^{(i)}) \right]}+\frac{1}{2}\sum\limits_{i=1}^{n}\theta^2_j minCi=1m[y(i)cost1(θTx(i)))+(1y(i))cost0(θTx(i))]+21i=1nθj2

  • 对于假设函数 h θ ( x ) = 1    i f   θ T x ≥ 0 h_\theta(x) = 1 \ \ if\ \theta^Tx\ge0 hθ(x)=1  if θTx0

    h θ ( x ) = 0    o t h e r s h_\theta(x) = 0 \ \ others hθ(x)=0  others

12.2 大边界的直观理解(Large margin intuition)

人们有时将支持向量机称为大间距分类器
在这里插入图片描述
上图中我们画出了 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z) cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z)

现在让我们考虑一下,最小化这些代价函数的必要条件是什么

  • If y =1

    • cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z) = 0 only when z >= 1
  • If y = 0

    • cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z) = 0 only when z <= -1
  • 这里面有一个有趣的地方

    • 如果你有一个正样本 y = 1 y=1 y=1,则其实我们仅仅要求 z z z 大于等于0,就能将该样本恰当的分类
    • 类似地,如果你有一个负样本,则仅需要总 z z z <=0就会将负例正确分类
    • 但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 z z z >0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1
    • 也就是说需要在支持向量机中嵌入了一个额外的安全因子

我们想知道,在SVM中,这个因子会导致什么结果
m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T x ( i ) ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ) ] + 1 2 ∑ i = 1 n θ j 2 minC\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}cost_1 \left(\theta^Tx^{(i)}) \right)+\left( 1-{ {y}^{(i)}} \right)cost_0\left(\theta^Tx^{(i)}) \right]}+\frac{1}{2}\sum\limits_{i=1}^{n}\theta^2_j minCi=1m[y(i)cost1(θTx(i)))+(1y(i))cost0(θTx(i))]+21i=1nθj2

我们接下来会考虑一个特例:将这个常数C设置成一个非常大的值

如果 C C C非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项(中括号内)为0的最优解。

我们已经看到输入一个训练样本标签为 y = 1 y=1 y=1,你想令 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z)为0,你需要做的是找到一个 θ { {\theta }} θ,使得 θ T x > = 1 \theta^Tx>=1 θTx>=1;类似地,对于一个训练样本,标签为 y = 0 y=0 y=0,为了使 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z) 函数的值为0,我们需要 θ T x < = − 1 \theta^Tx<=-1 θTx<=1

我们要在同时满足上面的 y = 1 y=1 y=1 y = 0 y=0 y=0的情况下找到能使第一项A为0的参数 θ \theta θ

现在考虑我们的优化问题

由于第一项(A)等于0,所以我们可以将这一项删去,我们所需要最小化的部分也发生了变化

m i n 1 2 ∑ i = 1 n θ j 2 min\frac{1}{2}\sum\limits_{i=1}^{n}\theta^2_j min21i=1nθj2
遵从: θ T x ( i ) > = 1 \theta^Tx^{(i)}>=1 θTx(i)>=1,如果 y ( i ) = 1 y^{(i)}=1 y(i)=1

θ T x ( i ) < = − 1 \theta^Tx^{(i)}<=-1 θTx(i)<=1,如果 y ( i ) = 0 y^{(i)}=0 y(i)=0

现在我们来求解这个优化问题的时候,会得到一个十分有趣的决策边界
在这里插入图片描述

  • 绿线和品红色线是可以通过逻辑回归选择的功能决策边界,
    • 但是他们可能没有很好地分类数据
  • 黑线是SVM选择的
    • SVM是更强大的分类器
  • 数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。

事实上,支持向量机现在要比这个大间距分类器所体现得更成熟更复杂,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。

比如我们加入一个额外的正样本
在这里插入图片描述
加入异常点前我们拟合得到的使黑色的线,而加入异常点之后我们得到的使品红色的线,这样的结果显然很糟糕

但如果你将C设置的不要太大,则你最终会得到这条黑线

也就是说 C C C不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界,而只有当你的数据中没有异常点并且可以轻松的线性分离数据时,才适合用SVM作为大间距分类器

回顾 C = 1 / λ C=1/\lambda C=1/λ,因此:

C C C 较大时,相当于 λ \lambda λ 较小,可能会导致过拟合,高方差。

C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差。

稍后会介绍支持向量机的偏差和方差,希望在那时候关于如何处理参数的这种平衡会变得更加清晰

12.4 核函数1:使SVM适应非线性分类器

回顾我们之前讨论过可以使用高次项的多项式模型来解决无法用直线进行分隔的分类问题:
在这里插入图片描述
为了获得上图所示的判定边界,我们的模型可能是 θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 1 x 2 + θ 4 x 1 2 + θ 5 x 2 2 + ⋯ { {\theta }_{0}}+{ {\theta }_{1}}{ {x}_{1}}+{ {\theta }_{2}}{ {x}_{2}}+{ {\theta }_{3}}{ {x}_{1}}{ {x}_{2}}+{ {\theta }_{4}}x_{1}^{2}+{ {\theta }_{5}}x_{2}^{2}+\cdots θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+的形式。

我们可以用一系列的新的特征 f f f来替换模型中的每一项。例如令:
f 1 = x 1 , f 2 = x 2 , f 3 = x 1 x 2 , f 4 = x 1 2 , f 5 = x 2 2 { {f}_{1}}={ {x}_{1}},{ {f}_{2}}={ {x}_{2}},{ {f}_{3}}={ {x}_{1}}{ {x}_{2}},{ {f}_{4}}=x_{1}^{2},{ {f}_{5}}=x_{2}^{2} f1=x1,f2=x2,f3=x1x2,f4=x12,f5=x22…得到 h θ ( x ) = θ 1 f 1 + θ 2 f 2 + . . . + θ n f n h_θ(x)={ {\theta }_{1}}f_1+{ {\theta }_{2}}f_2+...+{ {\theta }_{n}}f_n hθ(x)=θ1f1+θ2f2+...+θnfn。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3 ?(这样的构造方式在x过多时计算量太大)

我们可以利用核函数来计算出新的特征。

给定一个训练样本 x x x,我们利用 x x x的各个特征与我们预先选定的标记(landmarks) l ( 1 ) , l ( 2 ) , l ( 3 ) l^{(1)},l^{(2)},l^{(3)} l(1),l(2),l(3)的近似程度来选取新的特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3

img

例如: f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e ( − ∥ x − l ( 1 ) ∥ 2 2 σ 2 ) { {f}_{1}}=similarity(x,{ {l}^{(1)}})=e(-\frac{ { {\left\| x-{ {l}^{(1)}} \right\|}^{2}}}{2{ {\sigma }^{2}}}) f1=similarity(x,l(1))=e(2σ2xl(1)2)

${
   
   {f}_{2}}=similarity(x,{
   
   {l}^{(2)}})=e(-\frac{
   
   {
   
   {\left\| x-{
   
   {l}^{(2)}} \right\|}^{2}}}{2{
   
   {\sigma }^{2}}})$ 

​ ……

其中: ∥ x − l ( 1 ) ∥ 2 = ∑ j = 1 n ( x j − l j ( 1 ) ) 2 { {\left\| x-{ {l}^{(1)}} \right\|}^{2}}=\sum\limits_{j=1}^{n}{ {({ {x}_{j}}-l_{j}^{(1)})}^{2}} xl(1)2=j=1n(xjlj(1))2,为实例 x x x中所有特征与地标 l ( 1 ) l^{(1)} l(1)之间的距离的和。

上例中的 s i m i l a r i t y ( x , l ( 1 ) ) similarity(x,{ {l}^{(1)}}) similarity(x,l(1))就是核函数(一种相似度的度量标准)

具体而言,这是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。

这些标记的作用是什么?

如果一个训练样本 x x x与地标 l l l之间的距离近似于0,则新特征 f f f 近似于 e − 0 = 1 e^{-0}=1 e0=1,如果训练样本 x x x与地标 l l l之间距离较远,则 f f f近似于 e − ( 一 个 较 大 的 数 ) = 0 e^{-(一个较大的数)}=0 e()=0

假设我们的训练样本含有两个特征[ x 1 x_{1} x1 x 2 x{_2} x2],给定标记 l ( 1 ) l^{(1)} l(1)与不同的 σ \sigma σ 值,见下图:

  • σ \sigma σ标准差
  • σ 2 \sigma^2 σ2 通常被称为 方差,这个数值越小,标记(landmarks)周围上升的陡度越大
    在这里插入图片描述
    图中水平面的坐标为 x 1 x_{1} x1 x 2 x_{2} x2,而垂直坐标轴代表 f f f。可以看出,只有当 x x x l ( 1 ) l^{(1)} l(1)重合时 f f f才具有最大值。随着 x x x的改变 f f f值改变的速率受到 σ 2 \sigma^2 σ2的控制。

在下图中,假设我们已经运行了算法并获得了 θ \theta θ

当样本处于品红色的点位置处,因为其离 l ( 1 ) l^{(1)} l(1)更近,但是离 l ( 2 ) l^{(2)} l(2) l ( 3 ) l^{(3)} l(3)较远,因此 f 1 f_1 f1接近1,而 f 2 f_2 f2, f 3 f_3 f3接近0。因此 h θ ( x ) = θ 0 + θ 1 f 1 + θ 2 f 2 + θ 1 f 3 > 0 h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测 y = 1 y=1 y=1

对于蓝绿色的点,因为其离三个标记都较远,预测 y = 0 y=0 y=0
img

这样,下图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的标记所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sAYmo7Vx-1581855254959)(http://www.holehouse.org/mlclass/12_Support_Vector_Machines_files/Image%20[50].png)]

  • 在内部我们预测y = 1

  • 外面我们预测y = 0

  • 因此,这说明了我们如何在支持向量机中创建具有界标和核函数的非线性边界

但是现在这个模型仍然存在没有解决的问题

  • 我们如何获得/选择 地标
  • 我们还可以使用其他哪些内核(高斯内核除外)

12.5 核函数2

如何选择标记(landmarks)

我们通常是根据训练集的数量选择标记的数量,即如果训练集中有 m m m个样本,则我们选取 m m m个标记,并且令: l ( 1 ) = x ( 1 ) , l ( 2 ) = x ( 2 ) , . . . . . , l ( m ) = x ( m ) l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)} l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)

这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:eca2571849cc36748c26c68708a7a5bd

下面我们将核函数运用到**支持向量机(SVM)**中,修改我们的支持向量机假设为:

给定 x x x,计算新特征 f f f,当 θ T f > = 0 θ^Tf>=0 θTf>=0 时,预测 y = 1 y=1 y=1,否则反之。

相应地修改代价函数为: ∑ j = 1 n = m θ j 2 = θ T θ \sum\limits_{j=1}^{n=m}\theta _{j}^{2}={ {\theta}^{T}}\theta j=1n=mθj2=θTθ

m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T f ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T f ( i ) ) ] + 1 2 ∑ j = 1 n = m θ j 2 min C\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}cos { {t}_{1}}}( { {\theta }^{T}}{ {f}^{(i)}})+(1-{ {y}^{(i)}})cos { {t}_{0}}( { {\theta }^{T}}{ {f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}} minCi=1m[y(i)cost1(θTf(i))+(1y(i))cost0(θTf(i))]+21j=1n=mθj2
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算 ∑ j = 1 n = m θ j 2 = θ T θ \sum\limits_{j=1}^{n=m}\theta _{j}^{2}={ {\theta}^{T}}\theta j=1n=mθj2=θTθ时,我们用 θ T M θ θ^TMθ θTMθ代替 θ T θ θ^Tθ θTθ,其中 M M M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算

理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M M M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。

在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如liblinear,libsvm等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。

另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。

下面是支持向量机的两个参数 C C C σ \sigma σ的影响:

C = 1 / λ C=1/\lambda C=1/λ

C C C 较大时,相当于 λ \lambda λ较小,可能会导致过拟合,高方差;

C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差;

σ \sigma σ 较大时,可能会导致低方差,高偏差,f 特征更加平稳

σ \sigma σ 较小时,可能会导致低偏差,高方差,f 特征变化较大

如果你看了本周的编程作业,你就能亲自实现这些想法,并亲眼看到这些效果。这就是利用核函数的支持向量机算法,希望这些关于偏差和方差的讨论,能给你一些对于算法结果预期的直观印象。

12.6 使用支持向量机

需要的东西

  • 使用SVM软件包(例如liblinear,libsvm)求解参数 θ \theta θ
  • 需要指定一些参数
    • 参数C
    • 内核
      • 高斯核函数(Gaussian Kernel)
      • 线性核函数
      • 多项式核函数(Polynomial Kernel)
      • 字符串核函数(String kernel
      • 卡方核函数( chi-square kernel
      • 直方图交集核函数(histogram intersection kernel
      • 等等…

下面是一些普遍使用的准则:

n n n为特征数, m m m为训练样本数。

(1)如果相较于 m m m而言, n n n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。

(2)如果 n n n较小,而且 m m m大小中等,例如 n n n在 1-1000 之间,而 m m m在10-10000之间,使用高斯核函数的支持向量机。

(3)如果 n n n较小,而 m m m较大,例如 n n n在1-1000之间,而 m m m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。

猜你喜欢

转载自blog.csdn.net/qq_44082148/article/details/104347952