Coursera机器学习 Week7 笔记

xiaoxiao2021-02-28  8

编程作业放到了github上:coursera_machine_learning

Support Vector Machine

支持向量机的目的,是将线性可分的数据集用一个超平面分开,而且让两个类的数据集都距离这个超平面尽可能的远。

将线性可分的数据集分开的超平面可以有无数个,这个用Perceptron就可以做到,但是让所有的点距离这个超平面尽可能的远,这样的解就是唯一的,使用SVM来求解。

接下来将分别从cost function、intuition和kernel来介绍SVM。

1. Optimization Objective

本节将从Logistic Regression来类比SVM。

先看Logistic Regression的“分类决策函数 h(x) ”以及“损失函数 J(θ) ”:

h(x)=11+eθTx

J(θ)=ylogh(x)(1y)log(1h(x))

损失函数随着 z=θTx 的变化如下图。

y=1 时, J(θ)=logh(x)=log11+eθTx

y=0 时, J(θ)=log(1h(x))=log(111+eθTx)

现在对上面的 J(θ) 做一些改变。

y=1 时, J(θ) 为下图中的紫色线:

y=0 时, J(θ) 为下图中的紫色线:

从上面的图中,可以知道,这个损失函数是希望,所有的负样例( y=0 )的 θTx<1 的,所有的正样例( y=1 )的 θTx>1 的。

θTx 的含义其实是样例点到超平面的距离矢量。也就是说,损失函数希望所有的样例到超平面的距离都大于1,正负号代表方向(在超平面之上或者之下)。至于为什么是“1”,下面会详细讲到。

在SVM中,分类决策函数 h(x) 定义如下:

h(x)={1if θTx>00 otherwise

h(x) 的目的很简单,就是用一个超平面把正负样例分开。

损失函数 J(θ) 定义如下:

J(θ)=Ci=1m[y(i)×cost1(θTx(i))+(1y(i))×cost0(θTx(i))]+12j=1nθ2j

cost1(θTx)={0if              y=1, θTx>1some value   y=1, otherwise

cost0(θTx)={0if                y=0, θTx<1some value   y=0, otherwise

J(θ) 的目的是让正负样例尽可能地分开,距离超平面有一定的距离。希望: y=1 时, θTx>1 y=0 时, θTx<1

2. Large Margin Intuition 1

SVM有如下optimization objective:

minθCi=1m[y(i)×cost1(θTx(i))+(1y(i))×cost0(θTx(i))]+12j=1nθ2j

其中 C 是一个类似于λ的权衡因子,可以理解为 C=1λ

现在来看数据集线性可分的情况下,SVM选择超平面的策略,来看看SVM的intuition。

数据集线性可分的时候,SVM挑选的超平面必须能够满足:

对所有的正样例有 θTx>1 ,所有的负样例有 θTx<1

也就是说,所有的样例距离超平面都有一定的距离,就像下图中的蓝线所示:

如此一来,所有的 cost1=0 ,所有的 cost0=0 ,则优化目标变成如下形式:

minθ12j=1nθ2j

s.t. θTx>1  if y=1

  θTx<1if y=0

接下来看看SVM会选择怎样的超平面, θ 是超平面的法向量。

样例点 x 到超平面的距离p

p=θTxθ

θTx=pθ

优化目标改写成:

minθ12j=1nθ2j

s.t. pθ>1  if y=1

   pθ<1if y=0

第一种,margin非常小的时候:

0<p(1)1 的时候,为了使 p(1)θ>1 ,则 θ 需要很大;

1p(2)<0 的时候,为了使 p(2)θ<1 ,则 θ 需要很大;

这样一来,就违背了 minθ12nj=1θ2j ,所以,SVM不会选择这样的超平面。

第二种,margin比较大的时候:

p(1)>1 的时候, θ 不用很大,也能使 p(2)θ>1

p(2)<1 的时候, θ 不用很大,也能使 p(2)θ<1

这种情况符合 minθ12nj=1θ2j ,所以,SVM会选择这样的超平面。

3. Large Margin Intuition 2

上面Ng将的intuition没有解释为什么 θTx>1 ,这里的1究竟是怎么选择出来的。接下来结合李航的讲解来说明一下。

首先,定义几个术语。

定义1 (关于样例点的几何间隔):样例点到超平面的距离矢量 p(i) ,即:

p(i)=y(i)θTx(i)θ

定义2 (关于训练集的几何间隔):训练集中所有样例点的几何间隔的最小值,即:

p=minip(i)

SVM的目的就是找到使 p 最大的超平面。所以其optimization objective又可以写成如下形式:

maxθp

s.t. y(i)θTx(i)θp

明显地, p 取值的变化,并不会影响到不等式的成立,只要θ随之等比例变动即可,而 θ 的等比例变动也不会改变超平面。

所以不如就令 p=1θ ,如此一来,optimization objective被改写成如下形式:

maxθ1θ

s.t. y(i)(θTx(i))1

又因为 maxθ1θ 等价与 minθ12θ2 ,所以最终优化目为:

minθ12θ2

s.t. y(i)(θTx(i))1

与上面Ng的optimization objective吻合。

需要注意的是:正如intuition1中所言,这个优化目标的使用是有约束条件的,其约束条件就是任意的  y(i)(θTx(i))1 都要成立,也就是说,一定能够有一个超平面完美地分开数据集,即这个数据集是线性可分的

总结一下,对于线性可分的数据集:

其分类决策函数 h(x) 定义如下:

h(x)={1if θTx>00 otherwise

其优化目标/损失函数为:

minθ12θ2

s.t.y(i)(θTx(i))1

4. Outlier - 存在特异值的数据集

上面讨论的都是数据集是线性可分的情况,实际上这种数据集太少了,实际操作中的数据集多多少少都有特异值(outlier)的干扰,除去这些outlier,剩下大部分样例点组成的数据是线性可分的。

那么对于这种存在少数的样例点不满足 y(i)(θTx(i))1 的情况,SVM应该如何处理呢?

解决方法就是给每个样例点 x(i) 加上一个松弛变量 ε(i) ,使得约束条件变成:

y(i)(θTx(i))1ε(i)

对于每一个松弛变量,都要支付一个代价,于是优化目标变成:

minθ12θ2+Ci=1mε(i)

再回过来看Ng在最开始给出的损失函数 J(θ) :

J(θ)=Ci=1m[y(i)×cost1(θTx(i))+(1y(i))×cost0(θTx(i))]+12j=1nθ2j

可以认为:

ε(i)=y(i)×cost1(θTx(i))+(1y(i))×cost0(θTx(i))

但实际求解中,不需要这样代换,因为 cost1 cost0 y(i)(θTx(i))<1 情况下的值是未知的,所以还不如直接将这个整体看成一个未知数,然后用其他的求最优解的算法来求得最优解即可。

总结一下,对于有outlier的数据集:

其分类决策函数 h(x) 定义如下:

h(x)={1if θTx>00 otherwise

其优化目标/损失函数为:

minθ12θ2+Ci=1mε(i)

s.t.y(i)(θTx(i))1ε(i)

5. Kernel - 核函数

上面的数据集都是基本上线性可分的,但是有些数据集,就是线性不可分的,比如像这样的:

之前讲Linear Regression的时候也出现过这种例子,那时候的处理方法也可以用在这里。

假设分类决策函数 h(x) 如下:

h(x)=θ0+θ1x1+θ2x2+θ3x1x2+θ4x21+θ5x22+...

f1=x1 f2=x2 f3=x1x2 f4=x21 f5=x22 ,则:

h(x)=θ0+θ1f1+θ2f2+θ3f3+θ4f4+θ5f5+...

这就又转化成了线性的。

把这些个 f1,f2,f3,f4,f5.... 称为新生成的特征,也就是说,需要生成一系列新的特征,把非线性的问题拉回到线性问题上来。

那么怎么生成这些新的特征?

在SVM中,使用核函数(kernel)来基于“现有特征”生成“新的特征”。

令:

l(1)=x(1)

l(2)=x(2)

...

l(m)=x(m)

然后对于第i个数据,其新的特征计算如下:

f1=kernel(x,l(1))

f2=kernel(x,l(2))

...

fm=kernel(x,l(m))

这里的 kernel() 是一个核函数,常用的核函数有“Guassian Kernel”,定义如下:

kernel(x,l)=exp(xl22σ2)

这样就将数据集由原来的 n 维特征空间映射到了新的m维特征空间中。如果,训练集大小 m 比较大的话,就相当于引入了更多的新特征。

接下来的步骤就和上面处理线性可分数据集一样咯,只不过,现在SVM的输入不是x,而是 f 了。

这里还有一个不确定的参数σ σ 越大, fi 的变化就越平缓,反之。

6. 最优化问题求解

一般使用SMO算法来快速求解SVM。

详细过程涉及到数学相关的知识点,如“拉格朗日算子”、“对偶问题”。目前还没有弄得特别清楚,迷迷糊糊的。

实际操作中,这一步不需要自己去实现,套用现有的框架就可以实现了。

转载请注明原文地址: https://www.6miu.com/read-850276.html

最新回复(0)