Andrew Ng 机器学习笔记 11 :支持向量机(Support Vector Machine)

构建支持向量机

1.替换逻辑回归函数

在逻辑回归中使用的代价函数J(θ):

对于支持向量机而言,实际上,我们要将

  • 上面式子中的这一项: ( l o g h θ ( x ( i ) ) ) 替换为: c o s t 1 ( z ) ,即: c o s t 1 ( θ T x ( i ) )
  • 同样,这一项: ( ( l o g ( 1 h θ ( x ( i ) ) ) ) ) 替换为: c o s t 0 ( z ) ,即: c o s t 0 ( θ T x ( i ) )

所以对于支持向量机的最小化代价函数问题,代价函数的形式如下:

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 j = 1 n θ j 2

2.去除多余的常数项 1/m

现在按照支持向量机的惯例,我们去除 1 m 这一项,因为这一项是个常数项,即使去掉我们也可以得出相同的θ最优值:

m i n θ 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 j = 1 n θ j 2

3.正则化项系数的处理

在逻辑回归的目标函数中,正则化项优化形式:

A + λ B

在支持向量机的目标函数中,正则化项优化形式:

C A + B

因此,在逻辑回归中,如果给λ一个很大的值,那么就意味着给与B了一个很大的权重,而在支持向量机中,就相当于对C设定了一个非常小的值,这样一来就相当于对B给了比A更大的权重。

在支持向量机中的我们的整个优化目标函数:

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 j = 1 n θ j 2

最后有别于逻辑回归的一点,对于支持向量机假设函数的形式如下:

h θ ( x ) = 1       i f   θ T x 0

h θ ( x ) = 0       i f   θ T x < 0

而不是逻辑回归中的S型曲线:

h θ ( x ) = 1 1 + e x

大间距分类器

如果你有一个正样本,即 y = 1 时,那么代价函数 c o s t 1 ( z ) 的图像如下:

可以看出,只有在 z 1 (即 θ T x 1 )时(不仅仅是≥0),代价函数 c o s t 1 ( z ) 的值才等于0。

反之,如果你有一个负样本,即 y = 0 时,那么代价函数 c o s t 0 ( z ) 的图像如下:

可以看出,只有在 z 1 (即 θ T x 1 )时(不仅仅是<0),代价函数 c o s t 0 ( z ) 的值才等于0。

这就相当于在支持向量机中嵌入了一个额外的安全因子(或者说是安全距离因子)。

SVM决策边界

下面这个既有正样本又有负样本的数据集,可以看出有很多直线都可以把正负样本区分开,支持向量机会选择黑色的这一条直线,因为它看起来更加稳健。在数学上来讲就是这条直线拥有相对于训练数据更大的最短距离,这个所谓的距离就是指间距(margin):

这就是支持向量机拥有鲁棒性的原因。因为它一直努力用一个最大间距来分离样本。因此支持向量机分类器有时又被称为大间距分类器。

大间距分类器中的异常值

  • 当有一个异常值产生时,我们的算法会受到异常值的影响。
  • 如果我们将支持向量机中的正则化因子C设置的非常大,则会得到一条粉色的决策边界。
  • 如果我们适当的减小C的值,最终还是会得到那条黑色的决策边界的。如果数据是线性不可分的话,支持向量机也可以恰当的将它们分开。

值得提醒的是C的作用其实等同于 1 λ ,λ就是我们之前用到的正则化参数。在支持向量机中,C不是很大的时候,可以对包含异常数据、以及线性不可分的数据有比较好的处理效果。

SVM的数学原理

向量内积

假设我们有两个二维向量:

u = [ u 1 u 2 ]   v = [ v 1 v 2 ]

我们把

u T v

的计算结果称作向量u和v之间的内积。

其中我们用 | | u | | 来表示u的范数(即u的长度),因此 | | u | | 的计算公式如下:

| | u | | = u 1 2 + u 2 2

将向量v投影到向量u上,如下图我们对向量v做一个相对于向量u的直角投影:

投影之后的长度就是图中红线p的长度:

p = v u

同时也有另外一种计算内积的方式:

u T v = p · | | u | |

通过这种方式计算出来的内积,答案和之前也是一样的。事实上,如果你想要使用将u投影到v上来用这种方式来计算内积,得到的答案也是相同的。

在向量的内积问题中,如果两个向量的夹角小于90°,那么p的符号就是为正;如果两个向量的夹角大于90°,那么p的符号就为负。

决策边界

考虑下面这里的训练样本:

  • 其中假设截距为0,即θ0=0,也就意味着决策边界是过原点的。假设有这样一条绿色的决策边界
  • 由于决策边界和参数向量是正交的(斜率相乘结果为-1),我们可以绘制出对应的参数向量θ
  • 对于训练样本 x ( 1 ) ,可以画出这个样本向量到θ的投影 p ( 1 )
  • 类似的,我们也可以画出第二个样本 x ( 2 ) 向量到θ的投影 p ( 2 )
  • 我们会发现,这些 p ( i ) 将会是一些非常小的数。

因此当我们考察优化目标函数的时候:

  • 对于正样本( y ( i ) = 1 ,即图中的”x”样本)而言,我们需要 p ( i ) · | | θ | | 1 ,由于 p ( i ) 非常小,也就意味着 | | θ | | 需要非常大。
  • 对于负样本( y ( i ) = 1 ,即图中的”o”样本)而言,我们需要 p ( i ) · | | θ | | 1 ,由于 p ( i ) 非常小,也就意味着||θ||需要非常大。
  • 但我们的实际目标是希望找到一个参数 θ ,使得它的范数 | | θ | | 是尽可能小的,因此这并不是一个好的决策边界,因为我们的 | | θ | | 比较大。

对于下面这个决策边界来说,情况就会有很大的不同:

因为投影p的长度变大了,随之 θ 的范数 | | θ | | 也相应的变小了。这就意味着通过选择第二种远离样本的决策边界,支持向量机可以使参数 θ 的范数 | | θ | | 变小很多。

这就是为什么支持向量机可以产生大间距分类的原因。

怎么寻找最大间隔

点到超平面的距离

  • 点到超平面的函数间距:

    y ( x ) = w T x + b

  • 分类的结果:

    f ( x ) = s i g n ( w T x + b )
    (其中:sign表示>0为1,<0为-1,=0为0)

  • 点到超平面的几何间距:

    d ( x ) = ( w T x + b ) | | w | |

    (||w||表示w矩阵的二范数=> w T w , 点到超平面的距离也是类似的)

  • 现在我们可以通过几何间隔来描述最优直线的条件,设 g 是数据集中离直线最近的点到直线的几何间隔, g i 表示某个数据点到直线的几何间隔,则问题描述为:

    max g , s . t . , g i g

    即最大化数据集中最小的几何间隔。

拉格朗日乘子法

  • 类别标签用-1、1是为了后期方便 l a b e l ( w T x + b ) 的标识和距离计算;如果
    l a b e l ( w T x + b ) > 0
    表示预测正确,否则预测错误。
  • 现在目标很明确,就是要找到w和b,因此我们必须要找到最小间隔的数据点,也就是前面所说的支持向量

    • 目标函数:

      a r g : m a x w , b ( m i n [ l a b e l ( w T x + b ) ] 1 | | w | | )

    • l a b e l ( w T x + b ) >= 1
      因为0~1之间,得到的点是存在误判的可能性,所以要保障 m i n [ l a b e l ( w T x + b ) ] = 1 ,才能更好降低噪音数据影响。

    • 所以本质上是求
      a r g : m a x w , b 1 | | w | |
      也就说,我们约束(前提)条件是: l a b e l ( w T x + b ) = 1
  • 新的目标函数求解: a r g : m a x w , b 1 | | w | |

    • 进一步分析,该式又等价于:
      a r g : m i n w , b ( 1 2 | | w | | 2 )
      本质上就是求线性不等式的二次优化问题(求分隔超平面,等价于求解相应的凸二次规划问题)
  • 通过拉格朗日乘子法,求二次优化问题

    • 假设需要求极值的目标函数 (objective function) 为 f(x,y),限制条件为

      φ ( x , y ) = M
      其中 M = 1

    • g ( x , y ) = M φ ( x , y )
      临时 φ ( x , y ) 表示下文中 l a b e l ( w T x + b )

    • 定义一个新函数:

      F ( x , y , λ ) = f ( x , y ) + λ g ( x , y )

    • α λ α >= 0 ,代表要引入的拉格朗日乘子(Lagrange multiplier)

    • 那么:

      L ( w , b , α ) = 1 2 | | w | | 2 + i = 1 n α i [ 1 l a b e l ( w T x + b ) ]

    • 因为:

      l a b e l ( w T x + b ) >= 1 , α >= 0

      所以
      α [ 1 l a b e l ( w T x + b ) ] <= 0

    i = 1 n α i [ 1 l a b e l ( w T x + b ) ] <= 0

    • l a b e l ( w T x + b ) > 1
      α = 0 ,表示该点为非支持向量

    • 相当于求解:

      m a x α L ( w , b , α ) = 1 2 | | w | | 2

    • 如果求:

      m i n w , b 1 2 | | w | | 2
      也就是要求:

    m i n w , b ( m a x α L ( w , b , α ) )

  • 现在转化到对偶问题的求解

  • 现在分2步

  • 先求:

    m i n w , b L ( w , b , α ) = 1 2 | | w | | 2 + i = 1 n α i [ 1 l a b e l ( w T x + b ) ]

    就是求L(w,b,a)关于[w, b]的偏导数, 得到w和b的值,并化简为:L和a的方程。

  • 终于得到公式:

    m a x α ( i = 1 m α i 1 2 i , j = 1 m l a b e l i · l a b e l j · α i · α j · < x i , x j > )

    约束条件: α >= 0 并且 i = 1 m α i · l a b e l i = 0

kernels(核函数)

如果你有一个像这个样的训练集:

首先我们定义三个新的特征变量(但是对于实际问题而言,我们可以定义非常多的特征变量):

将这三个点标记为 l ( 1 ) l ( 2 ) l ( 3 )

f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e x p ( | | x l ( 1 ) | | 2 2 σ 2 )

这里 s i m i l a r i t e ( x , l ( 1 ) ) 是一种相似度的度量,度量样本x与第一个标记 l ( 1 ) 的相似度。

因此,我们可以依次写出特征 f 1 f 2 f 3 :

f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e x p ( | | x l ( 1 ) | | 2 2 σ 2 )

f 2 = s i m i l a r i t y ( x , l ( 2 ) ) = e x p ( | | x l ( 2 ) | | 2 2 σ 2 )

f 3 = s i m i l a r i t y ( x , l ( 3 ) ) = e x p ( | | x l ( 3 ) | | 2 2 σ 2 )

  • 这里的 s i m i l a r i t e ( x , l ) 函数,就被称为核函数(Kernels)。在这里,我们的例子中所说的核函数,实际上是高斯核函数,在后面我们还会见到不同的核函数。

  • 核函数我们通常不写作 s i m i l a r i t y ( x , l ( i ) ) ,而是写作:

    k ( x , l ( i ) )

首先让我们来看看第一个标记:

f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e x p ( | | x l ( 1 ) | | 2 2 σ 2 ) = e x p ( j = 1 n ( x j l j ( 1 ) ) 2 2 σ 2 )

  • 假设, x l ( 1 ) ,即x与其中一个标记点非常接近,那么这个欧氏距离 | | x l ( 1 ) | | 就会接近0,则:

    f 1 e x p ( 0 2 2 σ 2 ) 1

  • 相反的,如果x离 l ( 1 ) 很远,那么会有:

    f 1 e x p ( ( l a r g e   n u m b e r ) 2 2 σ 2 ) 0

  • 也就是说,给出一个训练样本x,我们就能基于我们之前给出的标记点 l ( 1 ) l ( 2 ) l ( 3 ) 来计算出三个新的特征变量 f 1 f 2 f 3

核函数的图形

假设我们有两个特征x1和x2,假设我们第一个标记点是 l ( 1 )

l ( 1 ) = [ 3 5 ]

假设:

σ 2 = 1

则:

f 1 = k ( x , l ( 1 ) ) = e x p ( | | x l ( 1 ) | | 2 2 σ 2 )

的图像为:

σ 2 f 的值的影响:

σ 2 =1 σ 2 =0.5 σ 2 =3

获取预测函数

  • 给定一个训练样本x,我们要计算出三个特征变量 f 1 f 2 f 3
  • 如果 θ 0 + θ 1 f 1 + θ 2 f 2 + θ 3 f 3 0 ,则预测函数的预测值为1,即 y = 1
  • 这就是一个我们如何通过标记点,以及核函数,来训练出非常复杂的非线性判别边界的方法。

选取标记点(landmark)

对于数据集的正样本和负样本,我们直接将训练样本作为标记点,最终能得到m个标记点:

l ( 1 ) l ( 2 ) l ( m )

这说明,特征函数基本上是在描述每一个样本距离样本集中其他样本的距离。

最终我们能得到一个特征向量,我们将特征向量记为f,按照惯例,如果我们需要的话,可以添加额外的特征 f 0 f 0 的值始终为1:

f = [ f 0 f 1 f 2 f m ]

当给定核函数和相似度函数后,我们按照这个方法来使用支持向量机。

使用SVM

支持向量机是一个特定的优化问题,我们只需要调用库函数来实现这些功能即可,常用的库有:liblinear和libsvm。
尽管你不需要自己去实现SVM,但你也需要做以下几件事:

  • 选择参数C
  • 选择核函数(相似度函数)

核函数的选择

线性核函数(无核函数):

  • 不用任何核函数(不用任何核函数也叫作线性核函数):
  • 即对于预测结果y=1,满足 θ T x 0
  • 它只是一个标准的线性分类器。
  • 当特征数量n很大,但数据量m很小时,由于数据量不足,在这种情况下如果使用其他核函数,你可能会过拟合,因此,此时线性核函数是一个合理的选择。

高斯核函数:

f i = e x p ( | | x l ( i ) | | 2 2 σ 2 ) ,

  • 如果 σ 2 很大,可能得到一个较高偏差、较低方差的分类器。
  • 如果 σ 2 很小,可能得到一个较低偏差、较高方差的分类器。
  • 如果原来的特征变量x是n维的,而且n很小,样本数量m很大时,高斯核函数会是一个不错的选择。

逻辑回归 vs SVM vs 神经网络

假设n是特征变量的个数,m是训练样本数:

  • n>>m:使用逻辑回归,或者使用无核函数的SVM(线性核函数)。

    比如你有一个文本分类的问题,特征数量n=10000,而且如果你的训练集大小为m=10,在这个问题中,你有10000个特征变量,对应10000个词,但是你只有10个训练样本。这种情况下就比较适合使用逻辑回归或者线性核函数的SVM了。

  • n较小,m中等大小:(例如n为1到1k之间的值,m为10到10k之间的值)那么使用高斯核函数的SVM效果好一些。

  • n很小,m很大:(例如n=1k,m=100k+),那么高斯核函数的SVM运行起来会很慢,这种情况下,需要尝试手动地创建更多的特征变量,然后使用逻辑回归或者无核函数的SVM(线性核函数)。

    逻辑回归和不带核函数的SVM它们都是非常相似的算法,他们会做相似的事情,并且表现也相似,但是根据你实现的具体情况,其中一个可能会比另一个更加有效。

对于上面所有的情况,一个设计得很好的神经网络也很可能会非常有效,而不使用神经网络的原因是:神经网络训练起来可能会很慢。但是如果你有一个非常好的SVM实现包,它会运行得比较快,比神经网络快很多。

SVM的优化问题,实际上是一个凸优化问题。因此好的SVM优化软件包总是会找到全局最小值,或者接近它的值。

对于SVM,你不需要担心局部最优。在实际应用中,局部最优对神经网络来说不是非常大的问题,但是也不小。所以使用SVM,你不用考虑这部分问题。

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/79948380