最近重新翻开支持向量机看又获得了一些新的东西和思想决定再丰富一下:
- 支持向量机用到的数学知识
- 支持向量机要解决的问题
- 距离与数据的定义
- 构造求解目标函数
- 支持向量的作用
- 精度改进
- 核变换
支持向量机用到的数学知识
- 点到平面的距离公式
- 拉格朗日乘数法
点到平面的距离公式
中学阶段学习过相关的知识,现在的应用只不过是把原来的二维推广到多维,计算的方法是一个样的。下面先来看一下二维空间里面的计算方法:
注:公式计算第二行有个错误,|n|/|n|中分子应该是n。我们现在推广到多维中:
Y = W^T + b (W^T 代表w的转置,同样也是平面的法向量)。根据上面的推断,我们可以直接写出点到面的距离:
拉格朗日乘数法
拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。
举例来看
求函数在满足下的条件极值,可以转化为函数的无条件极值问题。我们可以画图来辅助思考。
绿线标出的是约束
g(x,y)=c
g
(
x
,
y
)
=
c
的点的轨迹。蓝线是
f(x,y)
f
(
x
,
y
)
的等高线。箭头表示斜率,和等高线的法线平行。
从图上可以直观地看到在最优解处,
f(x,y)
f
(
x
,
y
)
和
g(x,y)
g
(
x
,
y
)
的斜率平行。
一旦求出 λ λ 的值,将其套入下式,易求在无约束极值和极值所对应的点。
新方程 F(x,y) F ( x , y ) 在达到极值时与 f(x,y) f ( x , y ) 相等,因为 F(x,y) F ( x , y ) 达到极值 g(x,y)−c g ( x , y ) − c ,上述式子取得极小值时其导数为0,即 ▽f(x)+▽∑λigi(x)=0 ▽ f ( x ) + ▽ ∑ λ i g i ( x ) = 0 ,也就是说 f(x f ( x )和 g(x) g ( x ) 的梯度共线.
改进
初始的拉格朗日乘子法均为等式约束优化问题,但等式约束并不足以描述人们面临的问题,不等式约束比等式约束更为常见,大部分实际问题的约束都是不超过多少时间,不超过多少人力,不超过多少成本等等。所以有几个科学家拓展了拉格朗日乘数法,增加了KKT条件之后便可以用拉格朗日乘数法来求解不等式约束的优化问题了。
KKT
初始条件:
minimize m i n i m i z e f(x) f ( x )
s.t. s . t . ai(x)=0(fori=1,2,3...) a i ( x ) = 0 ( f o r i = 1 , 2 , 3... )
cj(x)>=0(fori=1,2,3...) c j ( x ) >= 0 ( f o r i = 1 , 2 , 3... )
限制条件:
如果x*是限制优化问题的局部最小解
- ai(x∗)=0(fori=1,2,3...) a i ( x ∗ ) = 0 ( f o r i = 1 , 2 , 3... )
cj(x∗)>=0(fori=1,2,3...) c j ( x ∗ ) >= 0 ( f o r i = 1 , 2 , 3... )
存在 Lagerangemultiplierslamda(i)∗和u(j)∗ L a g e r a n g e m u l t i p l i e r s l a m d a ( i ) ∗ 和 u ( j ) ∗ 使得
- u(j)∗cj(x∗)=0 u ( j ) ∗ c j ( x ∗ ) = 0
u(j)∗>=0 u ( j ) ∗ >= 0
新理解:
在凸优化的优化问题中可以将优化问题的等式约束和不等式约束通过拉格朗日乘子合并到一个函数中——拉格朗日函数,通过求解这个多变量函数的极值点求解最优化问题。但是求解极值点的时候有多种不便。这个时候想到了一个叫做对偶的东西。
并不是只有拉格朗日乘数法才存在对偶,而是所有的函数都有对偶形式。对偶形式就是求解原目标函数每一个变量函数值得下确界。求解对偶函数的下确界,就叫拉格朗日对偶。怎么求?对拉格朗日函数的除拉格朗日乘子之外的变量求偏导并置为零,求解出的这些变量代回原方程得到拉格朗日对偶表达式。这里一定要注意,对偶函数都是凹函数。因为求解的是原函数的下确界,所以对偶函数的解要小于或等于原函数的解。对偶函数的最小值与原函数的最小值间的差值叫做对偶间隙。对对偶间隙的讨论得出了强对偶和弱对偶的。并产生了kkt条件。
所以上文所述的KKT讨论的满足强对偶时的解一定会满足这个些条件,于是就可以将直接求解原来的表达式变为求解KKT条件。具体公式推导自己去看笔记。
支持向量机分析
新:1.线性可分的支持向量机。A:无异常点的样本,使用硬间隔的支持向量机。B:有异常的样本,使用软间隔的支持向量机。2.线性不可分的样本,使用核方法的支持向量机。
支持向量机最后生成一个决策平面,两侧的虚线表示判断边界。最终得到一个最大的决策区域。
数据标签定义
数据集: (X1,Y1)(X2,Y2)…(Xn,Yn) ( X 1 , Y 1 ) ( X 2 , Y 2 ) … ( X n , Y n )
Y为样本的类别: 当X为正例时候 Y=+1 Y = + 1 当X为负例时候 Y=−1 Y = − 1
决策方程(新的变换函数我们后文讨论):
yi∗y(xi)>0 y i ∗ y ( x i ) > 0
我们通过形变可以简化点到决策平面的距离:
对于上文中提到的决策边界是恒大于零的,我们一定可以通过放缩W让决策平面函数恒大于1。 新理解:李航的《统计学习方法》中通过将几何距离转化为函数距离,然后经过放缩后发现结果相同,然后将其中的距离参数设置为1。理解后发现这个地方设置成2也没人敢说啥,所以为啥各个书上说的一定要这么高大上呢?
优化目标
注: 我们首先看一下内部的最小化过程,这里我们寻找的是距离决策平面最小的点。我们想寻找到一个合适的决策平面让这个平面距离我们找到的最近的样本点的距离有个最大值。这样我们会得到一个最宽的决策区域。(也就是虚线的宽度)
而上文中我们知道决策平面函数恒大于1,而对于决策平面我们想要的是最小值这个时候,我们直接取到1就可以啦。我们现在可以将优化目标函数简化为
这个时候我们就有了新的目标函数:
对于有约束条件的最值问题,我们很显然要是用拉格朗日乘数法来解决。对照前文提到的KTT条件我们对目标函数和约束条件进行修改。修改之后的目标函数为:
对于新目标函数的第一项,我们修改这样的目的是为了去掉绝对值和约去求导的时候的2项。注:这里刚开始的理解是有问题的,当前的问题是极小极大问题。但是我们求解的时候是从内层想外层依次求解,本式对alpha求解比较困难,才使用了对偶的办法
注:但是我们第一步最大化alpha的时候,无法用拉格朗日最小化的思想解决。所以根据对偶原则(这个地方还没有整清楚,什么情况下对偶。后面随着学习在深化)
我们就有新的优化目标函数的方法:
我们根据拉格朗日乘子法运算规则分别对w和b求偏导,并等于0.得到两个w和b的结果公式。
并将结果带入原始的新目标函数 得到了对偶形式。最终计算结果为:
我们继续对alpha求极大值,我们转换为求极小值:
通过求解KKT条件得到
α
α
的值。将所求解的结果带入公式得到w和b。求解成功。 这里先这样表述计算结果,后文再使用更加符合实际的用法。
支持向量分析
根据上文分析我们在确定这个决策边界的宽度时,是通过不断优化alpha值来解决的。根据运算规则我们发现,当alpha=0是w和b都为零。也就是说对于alpha=0的点对我们决策边界的选取是不起作用的。那么我们的支持向量也就是alpha不为零的点,这些点支撑起了我们的决策边界。而除了这些点其他点对决策的边界的选取是没有作用的。
支持向量机优化(线性可分但样本有异常)
我们上文提到的求解决策平面的方法比较强硬,在实际的项目中我们的样本数据一定有很多的异常点。如果我们使用这种比较强硬的方式,一定会让我们的决策边界为了迎合这个异常点而产生不好的分类结果。 所以加入松弛因子的作用就是调节那些异常点与正常点的距离。相当于把异常点拉回正常的一侧,这样使得模型抵抗异常点的能力增强。如下图所示:
为了解决这个问题,我们对原来的函数进行一下修改:
加入一个松弛因子,让决策平面不再大于1。稍微松弛一下。
这里的C就是我们使用支持向量机时要指定的参数。加入C的目的是为了让松弛因子不至于过大。
我们仍然使用拉格朗日乘子法进行函数优化。这里给出的约束条件是通过求偏导得到的。跟上文的相同
在写SVR时发现一直忽略了一个问题,这里的目标函数为啥这样写呢?首先先来看一个损失函数——折页损失(hinge)函数:
这里详细分析一下求解KKT条件:
更详细来看:由KKT条件三式得到
A:C−α∗=μ∗
A
:
C
−
α
∗
=
μ
∗
,联立8,9两式得到
B:0<α∗<C
B
:
0
<
α
∗
<
C
,A式代入式4得到:
C:(C−α∗)ξ∗i=0
C
:
(
C
−
α
∗
)
ξ
i
∗
=
0
==>通过这个BC两个式子可以分析得到:当
:0<α∗<C
:
0
<
α
∗
<
C
时,
ξ∗i=0
ξ
i
∗
=
0
此时也就是松弛变量未起作用这个时候数据点刚好在间隔边界上也就是支持向量;当
α=0
α
=
0
时,通过C式得到
ξ
ξ
=0,由6式得到代入KKT条件中4式(对偶互补条件),得到
yi(w∗⋅xi+b)>1
y
i
(
w
∗
⋅
x
i
+
b
)
>
1
;当
α=C
α
=
C
时,
ξ
ξ
大小不好确定,可以得到
yi(w∗⋅xi+b)=1−ξ
y
i
(
w
∗
⋅
x
i
+
b
)
=
1
−
ξ
所以
yi(w∗⋅xi+b)<1
y
i
(
w
∗
⋅
x
i
+
b
)
<
1
上述就是李航老师书中在SMO算法求解的过程中所使用的KKT条件的来源.注意:在讲解核方法之前我们的思想还是在求解w和b构造决策面方程然后求解呢!
核变换(解决线性不可分的问题)
1.疑点1,为啥要定义一个内积形式的才是核函数啊?这个问题有点自己折磨自己的意思了。疑点2,核函数究竟是怎么映射到高纬上去的呢?怎么判断映射到几维合适呢?。。。这些问题都是第一次写这篇博客的时候不懂的地方。继续补充!
提到核函数就不得不提一下内积空间,内积空间自然是由一系列的内积组成的一个数据空间。在内积空间的基础上我们又创造了希尔伯特空间——>
H
H
,这个空间扩展了内积空间即,将极限解也包含到了该空间中对各种运算封闭。那好现在该上主菜了:再生核希尔伯特空间。首先看一下官方定义:
H
H
是由
函数f:x↦R
函
数
f
:
x
↦
R
构成的希尔伯特空间,若函数
k:x⋅x↦R
k
:
x
⋅
x
↦
R
满足:对于任意
x∈X有K(⋅,Z)∈H
x
∈
X
有
K
(
⋅
,
Z
)
∈
H
有:
介绍完两个空间后发现核的概念本身就是由内积这里来定义的。考虑一种情形,数据点在低维上是不可分的,于是自然想要映射高维度空间来划分,然后在高维空间中在进行运算。但是很显然随着维度的提升计算起来越来越困难。但是核函数有个很好的性质,在高维空间求内积就等于直接在低维空间使用核函数进行计算。于是大佬们就设计了很多的核函数,这些核函数满足上述的一些特性。并且不同的核函数有不同的特性,比如高斯核函数通过泰勒展开发现可以展开到无限维。也就是可以映射到无限维空间中。
所以通俗来说,核函数就像是高维内积计算的一种替代用这种方式来简化运算。其实各种内积结果在RKHS中都有了,通过一个核函数选出来去模拟实际情况。所以使用核函数的时候也是在不断的尝试。看看哪个好用。!只要含有内积的算法都可以使用核方法来解决!
这是支持向量机的最后一部分内容。
我们遇到一些样本的时候是线性不可分的,我们就想着能不能把数据给映射到高纬上就可以分了呢。答案是肯定的(而我们前文提到的fai-x函数就是一个核变换函数),那么怎么进行映射呢?这就是函数的核变换。
我们进行核变换的选取的函数有多种,这里不一一细分。关于核变换的机器学习方面还没有深入研究等到深入研究了再专门来详细的说明一下。
上文推导的时候给出了支持向量机的对偶形式
文章的最后其实还需要介绍一下SMO算法但是发现一篇十分适合自己的博客就不再自己花时间啦https://www.cnblogs.com/pinard/p/6111471.html。
1.对偶形式增加了开销为啥还要使用对偶呢?使用对偶形式后,出现了内积可以使用核函数。可以有效的提高svm在高维空间的分类效果。
2.支持向量机的过拟合问题?核函数过于强、C参数设置过大,过于考虑间隔问题相当于硬间隔了。
3.使用时指定核函数、和C参数
支持向量机的python实现请参考:https://github.com/atomyh/Material_ML