Python机器学习SVM支持向量机

一、线性分类器

(1)线性函数

线性分类器(一定意义上,也可以叫做感知机) 是最简单也很有效的分类器形式.在一个线性分类器中,可以看到SVM形成的思路,并接触很多SVM的核心概念。用一个二维空间里仅有两类样本的分类问题来举个小例子。如图所示:
在这里插入图片描述
C1和C2是要区分的两个类别,在二维平面中它们的样本如上图所示。中间的直线就是一个分类函数,它可以将两类样本完全分开。一般的,如果一个线性函数能够将样本完全正确的分开,就称这些数据是线性可分的,否则称为非线性可分的。

什么叫线性函数呢?在一维空间里就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,可以如此想象下去,如果不关注空间的维数,这种线性函数还有一个统一的名称——超平面(Hyper Plane)!

实际上,一个线性函数是一个实值函数(即函数的值是连续的实数),而我们的分类问题(例如这里的二元分类问题——回答一个样本属于还是不属于一个类别的问题)需要离散的输出值,例如用1表示某个样本属于类别C1,而用0表示不属于(不属于C1也就意味着属于C2),这时候只需要简单的在实值函数的基础上附加一个阈值即可,通过分类函数执行时得到的值大于还是小于这个阈值来确定类别归属。 例如我们有一个线性函数:

g(x)=wx+b

我们可以取阈值为0,这样当有一个样本xi需要判别的时候,我们就看g(xi)的值。若g(xi)>0,就判别为类别C1,若g(xi)<0,则判别为类别C2(等于的时候我们就拒绝判断,呵呵)。此时也等价于给函数g(x)附加一个符号函数sgn(),即f(x)=sgn [g(x)]是我们真正的判别函数。

实际上很容易看出来,中间那条分界线并不是唯一的,我们把它稍微旋转一下,只要不把两类数据分错,仍然可以达到上面说的效果,稍微平移一下,也可以。此时就牵涉到一个问题,对同一个问题存在多个分类函数的时候,哪一个函数更好呢?显然必须要先找一个指标来量化“好”的程度,通常使用的都是叫做“分类间隔”的指标。

(2)分类间隔

在进行文本分类的时候,我们可以让计算机这样来看待我们提供给它的训练样本,每一个样本由一个向量(就是那些文本特征所组成的向量)和一个标记(标示出这个样本属于哪个类别)组成。如下:

Di=(xi,yi)

xi就是文本向量(维数很高),yi就是分类标记。

在二元的线性分类中,这个表示分类的标记只有两个值,1和-1(用来表示属于还是不属于这个类)。有了这种表示法,我们就可以定义一个样本点到某个超平面的间隔

δi=yi(wxi+b)=|g(x)|

首先注意到如果某个样本属于该类别的话,那么wxi+b>0(记得么?这是因为我们所选的g(x)=wx+b就通过大于0还是小于0来判断分类),而yi也大于0;若不属于该类别的话,那么wxi+b<0,而yi也小于0,这意味着yi(wxi+b)总是大于0的,而且它的值就等于|wxi+b|!(也就是|g(xi)|)

现在把w和b进行一下归一化,即用w/||w||和b/||w||分别代替原来的w和b,那么间隔就可以写成
在这里插入图片描述
这个公式是不是看上去有点眼熟?没错,这不就是解析几何中点xi到直线g(x)=0的距离公式嘛!(推广一下,是到超平面g(x)=0的距离, g(x)=0就是上节中提到的分类超平面)

当用归一化的w和b代替原值之后的间隔有一个专门的名称,叫做几何间隔,几何间隔所表示的正是点到超平面的欧氏距离,我们下面就简称几何间隔为“距离”。以上是单个点到某个超平面的距离(就是间隔,后面不再区别这两个词)定义,同样可以定义一个点的集合(就是一组样本)到某个超平面的距离为此集合中离超平面最近的点的距离。下面这张图更加直观的展示出了几何间隔的现实含义:
在这里插入图片描述
H是分类面,而H1和H2是平行于H,且过离H最近的两类样本的直线,H1与H,H2与H之间的距离就是几何间隔。

之所以如此关心几何间隔这个东西,是因为几何间隔与样本的误分次数间存在关系:
在这里插入图片描述
其中的δ是样本集合到分类面的间隔,R=max ||xi|| i=1,…,n,即R是所有样本中(xi是以向量表示的第i个样本)向量长度最长的值(也就是说代表样本的分布有多么广)。先不必追究误分次数的具体定义和推导过程,只要记得这个误分次数一定程度上代表分类器的误差。而从上式可以看出,误分次数的上界由几何间隔决定!

至此我们就明白为何要选择几何间隔来作为评价一个解优劣的指标了,原来几何间隔越大的解,它的误差上界越小。因此最大化几何间隔成了我们训练阶段的目标。

(5)最大化几何间隔

我们对间隔和几何间隔的定义:

间隔:δ=y(wx+b)=|g(x)|
几何间隔: 在这里插入图片描述
可以看出δ=||w||δ几何。注意到几何间隔与||w||是成反比的,因此最大化几何间隔与最小化||w||完全是一回事。而我们常用的方法并不是固定||w||的大小而寻求最大几何间隔,而是固定间隔(例如固定为1),寻找最小的||w||。即
在这里插入图片描述
但实际上对于这个目标,我们常常使用另一个完全等价的目标函数来代替,那就是:
在这里插入图片描述
不难看出当||w||2达到最小时,||w||也达到最小,反之亦然(前提当然是||w||描述的是向量的长度,因而是非负的)。之所以采用这种形式,是因为后面的求解过程会对目标函数作一系列变换,而上式的形式会使变换后的形式更为简洁。

但求目标函数的最小值并不是我们的问题所在,我们是要找出最好的分类面。

有了目标函数,我们还需要它相应的约束条件。约束条件就是在求解过程中必须满足的条件,体现在我们的问题中就是样本点必须在H1或H2的某一侧(或者至少在H1和H2上),而不能跑到两者中间。我们前文提到过把间隔固定为1,这是指把所有样本点中间隔最小的那一点的间隔定为1(这也是集合的间隔的定义,有点绕嘴),也就意味着集合中的其他点间隔都不会小于1,按照间隔的定义,满足这些条件就相当于让下面的式子总是成立:

  yi[(w·xi)+b]≥1 (i=1,2,…,l) (l是总的样本数)

但我们常常习惯让式子的值和0比较,因而经常用变换过的形式:

yi[(w·xi)+b]-1≥0 (i=1,2,…,l) (l是总的样本数)

因此我们的两类分类问题也被我们转化成了它的数学形式,一个带约束的最小值的问题:
在这里插入图片描述

(6)约束极值问题

一个求最小值的问题就是一个优化问题(也叫寻优问题,更文绉绉的叫法是规划——Programming),它同样由两部分组成,目标函数和约束条件,可以用下面的式子表示:
在这里插入图片描述
约束条件用函数c来表示,就是constrain的意思啦。你可以看出一共有p+q个约束条件,其中p个是不等式约束,q个等式约束。(运筹学中极值约束问题)

关于这个式子可以这样来理解:式中的x是自变量,但不限定它的维数必须为1(视乎你解决的问题空间维数,对我们的文本分类来说,那可是成千上万啊)。要求f(x)在哪一点上取得最小值(反倒不太关心这个最小值到底是多少,关键是哪一点),但不是在整个空间里找,而是在约束条件所划定的一个有限的空间里找,这个有限的空间就是优化理论里所说的可行域。注意可行域中的每一个点都要求满足所有p+q个条件,而不是满足其中一条或几条就可以(切记,要满足每个约束),同时可行域边界上的点有一个额外好的特性,它们可以使不等式约束取得等号!而边界内的点不行。

回头再来看我们线性分类器问题的描述:
在这里插入图片描述
在这个问题中,自变量就是w,而目标函数是w的二次函数,所有的约束条件都是w的线性函数(哎,千万不要把xi当成变量,它代表样本,是已知的),这种规划问题有个很有名气的称呼——二次规划(Quadratic Programming,QP),而且可以更进一步的说,由于它的可行域是一个凸集,因此它是一个凸二次规划

可以发现,我们的线性分类器问题只有不等式约束

采用拉格朗日乘子法对其对偶问题求解求解,拉格朗日函数:
在这里插入图片描述
αi 是拉格朗日乘子, αi ≥ 0 i = 1, 2, 3, …, n 。

对w,b求导可得:
在这里插入图片描述
令其分别为0,可得:
在这里插入图片描述
将其带入拉格朗日函数中,可得:
在这里插入图片描述
解出 α 之后,求得 w , 进而求得 b。

引入KTT条件(KTT条件是上面拉格朗日函数求最优解的必要条件):
在这里插入图片描述
从KTT条件中可以看出,当yi(wxi + b) - 1 > 0 时,αi* = 0;当 αi* > 0 时,yi(wxi + b) - 1 = 0;

我们分析一下,对于任意的训练样本 (xi,yi),

  • 若 αi=0,则其不会在公式中的求和项中出现,也就是说,它不影响模型的训练;
  • 若 αi>0,则yif(xi)−1=0,也就是 yif(xi)=1,即该样本一定在边界上,是一个支持向量。

这里显示出了支持向量机的重要特征:当训练完成后,大部分样本都不需要保留,最终模型只与支持向量有关。

(7)软间隔最大化

通常情况下的训练集中都会存在一些异常点,而这些异常点会导致训练集线性不可分,但除去这些异常点之后,剩下的样本就是线性可分的,而上面讲到的硬间隔最大化是无法处理线性不可分的问题,线性不可分意味着有些样本点的函数间隔是不能满足大于等于 1 的约束条件。因此我们对每个样本(xi, yi)引入一个松弛变量 ξi, 则我们的约束条件变为:
在这里插入图片描述
目标函数中加入对松弛变量的惩罚项,惩罚参数C > 0,目标优化函数变为:
在这里插入图片描述
因为整个求解的原始问题可以描述为:
在这里插入图片描述
采用和之前同样的求解方法,利用拉格朗日将约束问题转化为无约束的问题,将原始问题转化为求极大极小问题的对偶问题,可以得到我们的最终结果:
在这里插入图片描述
和第二部分中的结果唯一不同的是αi 的取值范围多了一个上限C 值,对于软间隔最大化时,其支持向量描述要复杂一些,因为其支持向量可以在间隔边界上(如下图中的虚线),也可以在间隔边界和超平面之间,或者在分离超平面误分的一侧。
在这里插入图片描述

二,线性不可分

上面讲到的软间隔最大化只能解决由于异常点而导致的线性不可分问题,而对于本身的数据集就是非线性的问题就无能为力,根据相关理论对于在低维空间线性不可分的问题,一般将其映射到高维空间后都是线性可分的,我们可以将这一理论运用到支持向量机中,可以引入一个函数 ϕ(x),将样本集从当前维度映射到更高的维度,回过头来看我们之前的优化函数:
在这里插入图片描述
我们只需要将优化函数中的內积 xi · xj 转化成 ϕ(xi) · ϕ(xj) 即可解决我们的非线性问题,但与此同时也引入了新的问题我们的数据维度增大后,內积的计算量也增大了,当映射后的维度很高,甚至是达到无穷维之后,求解模型时的计算量也会显著增大,

那么如何来处理这个问题呢?这就需要引入我们的核函数
我们知道即使在映射到高维后,內积 ϕ(xi) · ϕ(xj) 的值也依然是一个常数,那么是否存在这样一个函数:
K( xi · xj ) = ϕ(xi) · ϕ(xj) ,有理论证明当这样的函数是存在的(Mercer定理已证明),我们将其称为核函数。
在不需要将样本映射到高维空间,而利用核函数解决非线性分类问题 。

通过借助核函数就解决了我们的问题,当然不是什么函数都能作为核函数的,已经被证明的核函数并不多,而常用的核函数也就那么几个,接下来我们介绍下常见的几种核函数

  • 线性核函数

线性核函数很好理解,只能用来处理线性问题,其表达式如下:
在这里插入图片描述
因此我们可以将线性SVM和非线性SVM放在一起,只需要通过设定核函数和处理它们

  • 多项式核函数
    在这里插入图片描述
    其中的 a,c,d 的值都是需要我们去通过调参设置的。

  • 径向基核函数(高斯核函数)
    在这里插入图片描述
    参数较少,只需要自己去设置参数 σ

  • Sigmoid 核函数
    K(x, y) = tanh (ax · z + r
    需要设置调试的参数 a,r, 其中 tanh 函数双曲正切函数,也被常用来作神经网络中的激活函数。

发布了23 篇原创文章 · 获赞 0 · 访问量 627

猜你喜欢

转载自blog.csdn.net/qq_43824915/article/details/103328639