Preface
本文将正式开始对SVM(Support Vector Machine,支持向量机)的推导与介绍,以及最为重要的“核”的概念。
主要内容:
Optimal Margin Classifier(最优间隔分类器)
Kernels(核函数 )
Optimal Margin Classifier
在上一篇文章中我们我们要求解的最大(最优)间隔分类器为:
根据上一篇文章中的KKT条件中的 gi(w) g i ( w ) 可以推导出:
当 α∗i>0 α i ∗ > 0 时,由KKT互补条件 α∗igi(w∗)=0 α i ∗ g i ( w ∗ ) = 0 所以必有:
gi(w,b)=0(3) (3) g i ( w , b ) = 0
所以有:
这就意味着训练样本
(xi,yi)
(
x
i
,
y
i
)
的函数间隔
γ^(i)=y(i)(wTx(i)+b)=1
γ
^
(
i
)
=
y
(
i
)
(
w
T
x
(
i
)
+
b
)
=
1
。
我们通过下图直观的观察上述情况的表征:
在上图中,我们将整个样本集中少数几个函数间隔为1(函数间隔为1,通常情况下是
α∗i≠0,gi(w,b)=0
α
i
∗
≠
0
,
g
i
(
w
,
b
)
=
0
)的样本点称为支持向量(Support Vectors)。
由于在这里只有
gi
g
i
约束条件,没有
hi
h
i
约束条件,所以拉格朗日算子中的拉格朗日乘数只有
α
α
。即,拉格朗日算子为:
它的对偶问题为:
它的对偶问题是一个求最小值的问题,然后利用拉格朗日乘数法的方式进行计算,首先分别对
w,b
w
,
b
求偏导,并令其为零:
再求得的
w
w
带入拉格朗日函数 中:
简化为我们成为
w(α)
w
(
α
)
的式子:
所以对偶问题转换为:
其中,
<x(i),x(j)>
<
x
(
i
)
,
x
(
j
)
>
<script type="math/tex" id="MathJax-Element-20">
</script> 表示
x(i),x(j)
x
(
i
)
,
x
(
j
)
的内积,即
<x(i),x(j)>=(x(i))Tx(j)
<
x
(
i
)
,
x
(
j
)
>=
(
x
(
i
)
)
T
x
(
j
)
<script type="math/tex" id="MathJax-Element-22">
=(x^{(i)})^Tx^{(j)}</script> 。
在这里,我们需要对新出现的约束
∑i=1myiαi=0
∑
i
=
1
m
y
i
α
i
=
0
进行说明:
(1)假设
∑i=1myiαi≠0
∑
i
=
1
m
y
i
α
i
≠
0
,会导致
θD(α)=−∞
θ
D
(
α
)
=
−
∞
。
(2)假设
∑i=1myiαi≠0
∑
i
=
1
m
y
i
α
i
≠
0
,会导致
θD(α)=W(α)
θ
D
(
α
)
=
W
(
α
)
。
通过上述对偶问题(有约束的二次优化问题),我们就求得
α∗
α
∗
。然后带入公式:
可以求得
w
w
。
最后在把参数 带入原始优化问题就可以得到b了。
对于上述公式我们可以直观的理解为最坏正样本与最坏负样本的中值。
当我们知道
w
w
时,就知道了超平面的方向。选择参数 就是选择哪个超平面的问题了。
当我们得到参数
w,b
w
,
b
,就可以确定一个超平面了,这个超平面将训练集分成两类。
所以:
这里我们可以看到这个算法对于 x x 的依赖只限于 的内积。
最后这个 最优间隔分类器就是 支持向量机(Support Vector Machines)。
Kernels
Kernel (核)是隐式地将两个向量转换到其他形式然后求内积, 相比显式的转换可以极大的减少计算复杂度, 甚至可以将有限维的 x x 转换到无限维. 与其先求出 再计算 ϕ(x)Tϕ(z) ϕ ( x ) T ϕ ( z ) , 不如直接算 K(X,Z) K ( X , Z ) , 这就是 kernel相对于手动(显式)转化的优势。
特征转化
考虑我们最初在线性回归中提出的问题,用特征房子的面积
x
x
(这里的 x 是实数), 来预测房子的价格 。假设我们从样本点的分布中看到
x
x
和 符合 3 次曲线,那么我们希望 使用
x
x
的三次多项式来逼近这些样本点。那么首先需要将特征 扩展到三维
(x,x2,x3)
(
x
,
x
2
,
x
3
)
,然后 寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。
特征映射:将原始特征转化为更高维度的特征。
核函数(Kernel Function)
现在考虑核在SVM中的使用过程:
- Step1:由于原始特征 x∈R x ∈ R 存在往往会存在一些特殊的样本(极少数的特殊情况,如果将其考虑进入线性划分往往会导致不好的结果)。
- Step2:使用映射后的特征向量 ϕ(x)∈Rn ϕ ( x ) ∈ R n 而不是原始特征 x x 来参与计算,为了更好地拟合之外,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后就解决了这个问题。
- Step3:但是将原始特征映射为更高维度的特征 后,会导致我们在使用SVM算法中的公式(8) hw,b(x)=g(∑i=1nαiy(i)<x(i),x>+b) h w , b ( x ) = g ( ∑ i = 1 n α i y ( i ) < x ( i ) , x > + b ) 无法计算原始特征内积 <x,z> < x , z > <script type="math/tex" id="MathJax-Element-6121"> </script> 映射之后的更高维度的特征的内积的情况 <ϕ(x),ϕ(z)> < ϕ ( x ) , ϕ ( z ) > <script type="math/tex" id="MathJax-Element-6122"><\phi(x),\phi(z)></script>(原始特征映射为更高维度的特征 ϕ(x) ϕ ( x ) 时,由于 ϕ(x) ϕ ( x ) 的就是代价太大或者是无限维度无法计算)。然而为了解决这个问题我们就需要使用到 核函数(Kernel Function)—— K(x,z)=<ϕ(x),ϕ(z)>=ϕ(x)Tϕ(z) K ( x , z ) =< ϕ ( x ) , ϕ ( z ) >= ϕ ( x ) T ϕ ( z ) 。
这样一来我们就得到了核在SVM中的使用核函数。现在的问题是如何快速计算核函数 K(x,z)=<ϕ(x),ϕ(z)>=ϕ(x)Tϕ(z) K ( x , z ) =< ϕ ( x ) , ϕ ( z ) >= ϕ ( x ) T ϕ ( z ) 。
特殊例子
现在我们先看两个特殊的例子:
First:
假设
x,z∈Rn
x
,
z
∈
R
n
,同时,
K(x,z)=(xTz)2(9) (9) K ( x , z ) = ( x T z ) 2
展开核函数
K(x,z)
K
(
x
,
z
)
得:
这个时候发现我们可以只计算原始特征 x 和 z 内积的平方(时间复杂度是
O(n)
O
(
n
)
,就等 价与计算映射后特征的内积。也就是说我们不需要花
O(n2)
O
(
n
2
)
时间了。
现在假设
x,z
x
,
z
的维度为3,所以有:
Second:
假设
x,z∈Rn
x
,
z
∈
R
n
,同时,
K(x,z)=(xTz+c)2(10) (10) K ( x , z ) = ( x T z + c ) 2
展开核函数
K(x,z)
K
(
x
,
z
)
得:
现在假设
x,z
x
,
z
的维度为3,所以有:
总结上述两个例子,我们可以得到更一般的结论:
如果核函数为
K(x,z)=(xTz+c)d
K
(
x
,
z
)
=
(
x
T
z
+
c
)
d
:
所以:映射后的特征维度为
(n+dd)
(
n
+
d
d
)
。
由于 K(x,z)=<ϕ(x),ϕ(z)> K ( x , z ) =< ϕ ( x ) , ϕ ( z ) > 表征的是向量 ϕ(x),ϕ(z) ϕ ( x ) , ϕ ( z ) 的内积,所以当向量 ϕ(x),ϕ(z) ϕ ( x ) , ϕ ( z ) 相似时,向量 ϕ(x),ϕ(z) ϕ ( x ) , ϕ ( z ) 会指向同一方向, K(x,z)=<ϕ(x),ϕ(z)> K ( x , z ) =< ϕ ( x ) , ϕ ( z ) > 会较大;相反的,当向量 ϕ(x),ϕ(z) ϕ ( x ) , ϕ ( z ) 不相似时,向量 ϕ(x),ϕ(z) ϕ ( x ) , ϕ ( z ) 会指向不同方向, K(x,z)=<ϕ(x),ϕ(z)> K ( x , z ) =< ϕ ( x ) , ϕ ( z ) > 会较小;
对于分类问题我们一般使用高斯核函数来进行:
在高斯核函数中,如果
x,z
x
,
z
相似,那么
∥x−z∥2
‖
x
−
z
‖
2
接近于0,所以
K(x,z)
K
(
x
,
z
)
接近于1;如果
x,z
x
,
z
不相似,那么
∥x−z∥2
‖
x
−
z
‖
2
接近于无穷大,所以
K(x,z)
K
(
x
,
z
)
接近于0。
既然高斯核函数能够比较 x 和 z 的相似度,并映射到 0 到 1,回想 logistic 回归,sigmoid 函数可以,因此还有 sigmoid 核函数等等。
核函数有效性判定
问题: ∃ϕ,s.t. K(x,z)=<ϕ(x),ϕ(z)>? ∃ ϕ , s.t. K ( x , z ) =< ϕ ( x ) , ϕ ( z ) > ?
假设一:K是一个核,即
∃ϕ,s.t. K(x,z)=<ϕ(x),ϕ(z)>
∃
ϕ
,
s.t.
K
(
x
,
z
)
=<
ϕ
(
x
)
,
ϕ
(
z
)
>
。
假设二:对于给定的
{x(1),...,x(m)}
{
x
(
1
)
,
.
.
.
,
x
(
m
)
}
,定义矩阵
K∈Rm∗m
K
∈
R
m
∗
m
,
Kij=K(x(i),x(j))
K
i
j
=
K
(
x
(
i
)
,
x
(
j
)
)
。
假设三:
z∈Rm
z
∈
R
m
$ 。
所以有:
结论:K是一个核,则有
zTKz≥0→K≥0
z
T
K
z
≥
0
→
K
≥
0
,即K为半正定矩阵。同时它的逆命题也成立。
Mercer 定理: 如果函数 K 是 Rn∗Rn→R R n ∗ R n → R 上的映射(也就是从两个 n 维向量映射到实数域)。那么如果 K 是一个有效核函数(也称为 Mercer 核函数),那么当且仅当对于训练样例 {x(1),...,x(m)} { x ( 1 ) , . . . , x ( m ) } , 其相应的核函数矩阵是对称半正定的。
Mercer 定理表明为了证明 K 是有效的核函数,那么我们不用去寻找 ϕ ϕ ,而只需要在训练 集上求出各个 kij k i j ,然后判断矩阵 K 是否是半正定(使用左上角主子式大于等于零等方法) 即可。
核与核函数的推广
我们最后我们需要说明我们通过核的概念将原始特征映射为高维特征以解决拟合问题和无法线性分类的问题,然后通过核函数——
K(x,z)=<ϕ(x),ϕ(z)>
K
(
x
,
z
)
=<
ϕ
(
x
)
,
ϕ
(
z
)
>
计算当前算法中的高维特征的内积以达到解决问题的目的。
但是原始特征映射为高维特征与核函数的思想不仅仅只限于SVM中,在我们前面所学习的线性回归,逻辑回归,感知器算法中都可以将计算内积的问题交给核函数来解决。
更进一步的说,只要我们在算法公式中要计算特征向量的内积时都可以使用原始特征映射为高维特征与核函数的思想来解决。