(七)了解支持向量机-2
图片出处
导论
在上一篇文章中,我们讨论的是线性可分的例子,即显而易见存在一条直线可以轻松地将两类样本区分开来(如下图1所示)。然而,在很多实际问题中,原始样本空间内也许并不存在一条直线能完美区分出两类数据点。
继续前文中的摆放玩具的游戏,现在这个问题的难度上升了。当我任意地摆放这些圈圈和叉叉(如下图2所示),显然在二维平面上,已经无法用一条直线将它们区分开,这种情况就是线性不可分的。但我们的目的还是要把它们区分开,那么该如何操作呢?
📢在此篇中,我们将介绍解决线性不可分问题的方法——核技巧。
线性不可分与核技巧
映射函数
对于线性不可分的问题,最直观的想法就是,能不能基于原有特征 x x x,先人为构建一些高阶的、交叉项的特征,丰富特征的维度,在新的特征维度下,能否更好区分两类数据点?
对于上图2中的例子,原有特征只有两个维度( F e a t u r e 0 Feature_0 Feature0, F e a t u r e 1 Feature_1 Feature1),显然样本在原始特征空间内是非线性可分的。当我们对输入特征进行扩展,比如添加 F e a t u r e 2 = ∣ 16 − F e a t u r e 1 2 − 3 F e a t u r e 2 2 ∣ Feature2=|16-Feature_1^2-3Feature_2^2| Feature2=∣16−Feature12−3Feature22∣作为一个新的特征,现在每个样本变成了三维空间中的一点,在新的特征空间中,两类样本可以通过一个超平面正确划分,如下图3所示。这个过程中使用的即是映射函数 ( Φ ) (Φ) (Φ),它的主要作用是将样本从原始低维空间映射到一个更高维的特征空间,使得样本在这个高维特征空间内线性可分1。
核技巧
那么这种思想如何和支持向量机(SVM)结合呢?这就要提到核技巧了。
在机器学习初探:(六)了解支持向量机-1中,我们已经得到了最优超平面的表达式:
y
=
∑
i
=
1
m
α
i
y
(
i
)
x
(
i
)
T
x
+
b
y=\sum_{i=1}^{m}{α_i y^{(i)}{ x^{(i)}}^Tx+b}
y=i=1∑mαiy(i)x(i)Tx+b
如果存在一种映射关系
Φ
(
x
)
Φ(x)
Φ(x),将
x
x
x 映射到另一个空间中,那么新空间中:
y
=
∑
i
=
1
m
α
i
y
(
i
)
(
Φ
(
x
(
i
)
)
)
T
Φ
(
x
)
+
b
y=\sum_{i=1}^{m}{α_i y^{(i)}{ (\Phi(x^{(i)}))}^T \Phi(x)+b}
y=i=1∑mαiy(i)(Φ(x(i)))TΦ(x)+b
整个过程非常的顺溜,我们可以先用
Φ
(
x
)
Φ(x)
Φ(x) 将数据从低维空间映射到高维空间,然后再在新构建的高维空间中,使用线性SVM进行分类。
然而,事实并非如此,上式的求解过程涉及计算 ( Φ ( x ( i ) ) ) T Φ ( x ( j ) ) (\Phi(x^{(i)}))^T \Phi(x^{(j)}) (Φ(x(i)))TΦ(x(j)),这是样本 x ( i ) x^{(i)} x(i)与 x ( j ) x^{(j)} x(j)映射到特征空间之后的内积。由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算 ( Φ ( x ( i ) ) ) T Φ ( x ( j ) ) (\Phi(x^{(i)}))^T \Phi(x^{(j)}) (Φ(x(i)))TΦ(x(j))通常是困难的,那么怎么来简化这个操作呢?
有意思的是,矢量内积衡量的是向量之间的相似度,也即无论在几维空间内,矢量内积都是一个常数。我们能不能绕开由低维空间向高维空间的转化过程,从原始数据中(低维空间)抽象出高维空间所需的特征,直接在低维空间完成矢量内积的计算呢?现在核函数(Kernel Function)要登场了。
k
(
x
(
i
)
,
x
(
j
)
)
=
<
Φ
(
x
(
i
)
)
,
Φ
(
x
(
j
)
)
>
=
(
Φ
(
x
(
i
)
)
)
T
Φ
(
x
(
j
)
)
k(x^{(i)},x^{(j)})= <\Phi(x^{(i)}),\Phi(x^{(j)})>=(\Phi(x^{(i)}))^T \Phi(x^{(j)})
k(x(i),x(j))=<Φ(x(i)),Φ(x(j))>=(Φ(x(i)))TΦ(x(j))
即
x
(
i
)
x^{(i)}
x(i)与
x
(
j
)
x^{(j)}
x(j)在特征空间的内积
(
Φ
(
x
(
i
)
)
)
T
Φ
(
x
(
j
)
)
(\Phi(x^{(i)}))^T \Phi(x^{(j)})
(Φ(x(i)))TΦ(x(j)),等于它们在原始样本空间中通过函数
k
(
⋅
,
⋅
)
k(·,·)
k(⋅,⋅)计算的结果,有了这样的函数,就不必直接去计算高维甚至无穷维特征空间中的内积了。厉害了我的核!
还是举个例子来说明一下吧2:
比如原始数据有三维特征,即
x
(
i
)
=
[
x
1
(
i
)
,
x
2
(
i
)
,
x
3
(
i
)
]
T
x^{(i)}=[x_1^{(i)},x_2^{(i)},x_3^{(i)}]^T
x(i)=[x1(i),x2(i),x3(i)]T,我们定义映射函数
Φ
(
x
)
\Phi(x)
Φ(x) 将原始数据从三维空间映射到九维空间中,即:
Φ
(
x
)
=
[
x
1
x
1
,
x
1
x
2
,
x
1
x
3
,
x
2
x
1
,
x
2
x
2
,
x
2
x
3
,
x
3
x
1
,
x
3
x
2
,
x
3
x
3
]
\Phi(x) =\left[ x_1 x_1, x_1 x_2,x_1 x_3 ,x_2 x_1, x_2 x_2, x_2 x_3, x_3 x_1, x_3 x_2, x_3 x_3\right]
Φ(x)=[x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3]
在新的特征空间中,为了求得最优划分超平面,需要计算
(
Φ
(
x
(
i
)
)
)
T
Φ
(
x
(
j
)
)
(\Phi(x^{(i)}))^T \Phi(x^{(j)})
(Φ(x(i)))TΦ(x(j))。以其中两个数据点为例进行说明,
x
(
1
)
=
[
1
,
2
,
3
]
T
x^{(1)}=[1,2,3]^T
x(1)=[1,2,3]T,
x
(
2
)
=
[
4
,
5
,
6
]
T
x^{(2)}=[4,5,6]^T
x(2)=[4,5,6]T,让我们来计算
Φ
(
1
,
2
,
3
)
⋅
Φ
(
4
,
5
,
6
)
\Phi(1,2,3) \cdot \Phi(4,5,6)
Φ(1,2,3)⋅Φ(4,5,6):
Φ
(
1
,
2
,
3
)
=
[
1
,
2
,
3
,
2
,
4
,
6
,
3
,
6
,
9
]
T
\Phi(1,2,3)=[1,2,3,2,4,6,3,6,9]^T
Φ(1,2,3)=[1,2,3,2,4,6,3,6,9]T
Φ
(
4
,
5
,
6
)
=
[
16
,
20
,
24
,
20
,
25
,
30
,
24
,
30
,
36
]
T
\Phi(4,5,6)=[16,20,24,20,25,30,24,30,36]^T
Φ(4,5,6)=[16,20,24,20,25,30,24,30,36]T
Φ
(
1
,
2
,
3
)
⋅
Φ
(
4
,
5
,
6
)
=
1
×
16
+
2
×
20
+
3
×
24
+
2
×
20
+
4
×
25
+
6
×
30
+
3
×
24
+
6
×
30
+
9
×
36
=
1024
\Phi(1,2,3) \cdot \Phi(4,5,6)=1 \times 16+2 \times 20+3\times24+2\times20+4\times25+6\times30+3\times24+6\times30+9\times36=1024
Φ(1,2,3)⋅Φ(4,5,6)=1×16+2×20+3×24+2×20+4×25+6×30+3×24+6×30+9×36=1024
可以看出计算相当繁琐,而且繁琐程度将随着映射之后特征的维度增加快速增大。我们来尝试推导一下对应的核函数:
(
Φ
(
x
(
1
)
)
)
T
Φ
(
x
(
2
)
)
=
[
x
1
(
1
)
x
1
(
1
)
,
x
1
(
1
)
x
2
(
1
)
,
x
1
(
1
)
x
3
(
1
)
,
x
2
(
1
)
x
1
(
1
)
,
x
2
(
1
)
x
2
(
1
)
,
x
2
(
1
)
x
3
(
1
)
,
x
3
(
1
)
x
1
(
1
)
,
x
3
(
1
)
x
2
(
1
)
,
x
3
(
1
)
x
3
(
1
)
]
⋅
[
x
1
(
2
)
x
1
(
2
)
,
x
1
(
2
)
x
2
(
2
)
,
x
1
(
2
)
x
3
(
2
)
,
x
2
(
2
)
x
1
(
2
)
,
x
2
(
2
)
x
2
(
2
)
,
x
2
(
2
)
x
3
(
2
)
,
x
3
(
2
)
x
1
(
2
)
,
x
3
(
2
)
x
2
(
2
)
,
x
3
(
2
)
x
3
(
2
)
]
T
=
x
1
(
1
)
x
1
(
1
)
x
1
(
2
)
x
1
(
2
)
+
x
1
(
1
)
x
2
(
1
)
x
1
(
2
)
x
2
(
2
)
+
x
1
(
1
)
x
3
(
1
)
x
1
(
2
)
x
3
(
2
)
+
x
2
(
1
)
x
1
(
1
)
x
2
(
2
)
x
1
(
2
)
+
x
2
(
1
)
x
2
(
1
)
x
2
(
2
)
x
2
(
2
)
+
x
2
(
1
)
x
3
(
1
)
x
2
(
2
)
x
3
(
2
)
+
x
3
(
1
)
x
1
(
1
)
x
3
(
2
)
x
1
(
2
)
+
x
3
(
1
)
x
2
(
1
)
x
3
(
2
)
x
2
(
2
)
+
x
3
(
1
)
x
3
(
1
)
x
3
(
2
)
x
3
(
2
)
=
(
x
1
(
1
)
x
1
(
2
)
)
2
+
(
x
2
(
1
)
x
2
(
2
)
)
2
+
2
(
x
3
(
1
)
x
3
(
2
)
)
2
+
2
x
1
(
1
)
x
1
(
2
)
x
2
(
1
)
x
2
(
2
)
+
2
x
1
(
1
)
x
1
(
2
)
x
3
(
1
)
x
3
(
2
)
+
2
x
2
(
1
)
x
2
(
2
)
x
3
(
1
)
x
3
(
2
)
=
(
x
1
(
1
)
x
1
(
2
)
+
x
2
(
1
)
x
2
(
2
)
+
x
3
(
1
)
x
3
(
2
)
)
2
=
(
(
x
(
1
)
)
T
x
(
2
)
)
2
\begin{aligned} (\Phi(x^{(1)}))^T \Phi(x^{(2)})\\ & = [x_1^{(1)}x_1^{(1)},x_1^{(1)}x_2^{(1)},x_1^{(1)} x_3^{(1)},x_2^{(1)} x_1^{(1)},x_2^{(1)} x_2^{(1)},x_2^{(1)} x_3^{(1)},x_3^{(1)} x_1^{(1)},x_3^{(1)} x_2^{(1)},x_3^{(1)} x_3^{(1)} ] \\& \cdot [x_1^{(2)} x_1^{(2)},x_1^{(2)} x_2^{(2)},x_1^{(2)} x_3^{(2)},x_2^{(2)} x_1^{(2)},x_2^{(2)} x_2^{(2)},x_2^{(2)} x_3^{(2)},x_3^{(2)} x_1^{(2)},x_3^{(2)} x_2^{(2)},x_3^{(2)} x_3^{(2)} ]^T \\&= x_1^{(1)} x_1^{(1)} x_1^{(2)} x_1^{(2)}+x_1^{(1)} x_2^{(1)} x_1^{(2)} x_2^{(2)}+x_1^{(1)} x_3^{(1)}x_1^{(2)} x_3^{(2)}+x_2^{(1)} x_1^{(1)} x_2^{(2)} x_1^{(2)}+x_2^{(1)} x_2^{(1)} x_2^{(2)} x_2^{(2)}\\ &+x_2^{(1)} x_3^{(1)} x_2^{(2)} x_3^{(2)}+x_3^{(1)} x_1^{(1)} x_3^{(2)} x_1^{(2)}+x_3^{(1)} x_2^{(1)} x_3^{(2)} x_2^{(2)}+x_3^{(1)} x_3^{(1)} x_3^{(2)} x_3^{(2)} \\&=(x_1^{(1)} x_1^{(2)} )^2+(x_2^{(1)} x_2^{(2)} )^2+2(x_3^{(1)} x_3^{(2)})^2+2x_1^{(1)} x_1^{(2)} x_2^{(1)} x_2^{(2)}+2x_1^{(1)} x_1^{(2)} x_3^{(1)}x_3^{(2)}+2x_2^{(1)} x_2^{(2)} x_3^{(1)} x_3^{(2)} \\&=(x_1^{(1)} x_1^{(2)}+x_2^{(1)}x_2^{(2)}+x_3^{(1)} x_3^{(2)} )^2 \\&=((x^{(1)})^T x^{(2)})^2 \end{aligned}
(Φ(x(1)))TΦ(x(2))=[x1(1)x1(1),x1(1)x2(1),x1(1)x3(1),x2(1)x1(1),x2(1)x2(1),x2(1)x3(1),x3(1)x1(1),x3(1)x2(1),x3(1)x3(1)]⋅[x1(2)x1(2),x1(2)x2(2),x1(2)x3(2),x2(2)x1(2),x2(2)x2(2),x2(2)x3(2),x3(2)x1(2),x3(2)x2(2),x3(2)x3(2)]T=x1(1)x1(1)x1(2)x1(2)+x1(1)x2(1)x1(2)x2(2)+x1(1)x3(1)x1(2)x3(2)+x2(1)x1(1)x2(2)x1(2)+x2(1)x2(1)x2(2)x2(2)+x2(1)x3(1)x2(2)x3(2)+x3(1)x1(1)x3(2)x1(2)+x3(1)x2(1)x3(2)x2(2)+x3(1)x3(1)x3(2)x3(2)=(x1(1)x1(2))2+(x2(1)x2(2))2+2(x3(1)x3(2))2+2x1(1)x1(2)x2(1)x2(2)+2x1(1)x1(2)x3(1)x3(2)+2x2(1)x2(2)x3(1)x3(2)=(x1(1)x1(2)+x2(1)x2(2)+x3(1)x3(2))2=((x(1))Tx(2))2
即核函数 k ( x ( i ) , x ( j ) ) = ( ( x ( i ) ) T x ( j ) ) 2 k(x^{(i)},x^{(j)} )=((x^{(i)})^T x^{(j)})^2 k(x(i),x(j))=((x(i))Tx(j))2。
通过上面的推导,我们发现虽然维度转化的过程较为繁琐复杂,但是矢量内积的结果却是相当简洁,现在我们直接用核函数计算上述结果:
k
(
x
(
1
)
,
x
(
2
)
)
=
(
1
×
4
+
2
×
5
+
3
×
6
)
2
=
1024
k(x^{(1)},x^{(2)})=(1×4+2×5+3×6)^2=1024
k(x(1),x(2))=(1×4+2×5+3×6)2=1024
结果和先映射再进行矢量积运算的结果一样,但计算过程却大大简化了!
简而言之,核技巧的中心思想就是,我们不需要知道低维空间的数据是怎样映射到高维空间的,我们只需要知道计算结果是怎么计算出来的。
几种常用的核函数
下面介绍几种核技巧中经常用到的核函数的形式:
在支持向量机中常用的两种核函数是高斯核(Radial basis function kernel,又叫径向基函数核,简称RBF)、多项式核(Polynomial kernel)。
多项式核
我们前面举例中用到的核函数 k ( x ( i ) , x ( j ) ) = ( ( x ( i ) ) T x ( j ) ) 2 k(x^{(i)},x^{(j)} )=((x^{(i)})^T x^{(j)})^2 k(x(i),x(j))=((x(i))Tx(j))2即为一种多项式核,其基本表达式为:
k
(
x
,
l
)
=
(
x
T
l
+
c
)
d
k(x,l)= (x^T l+c)^d
k(x,l)=(xTl+c)d
其中,
c
c
c 和
d
d
d 为常数,向量
x
x
x,
l
l
l 均为
n
−
n-
n− 维向量。
高斯核
高斯核的基本表达式为:
k
(
x
,
l
)
=
e
x
p
(
−
‖
x
−
l
‖
2
2
σ
2
)
k(x,l)=exp(\frac{-‖x-l‖^2}{2σ^2})
k(x,l)=exp(2σ2−‖x−l‖2)
高斯核是一个对应于无限空间的核函数。实际上我们无法给出映射到无限空间的映射函数 Φ ( x ) \Phi(x) Φ(x),更没有办法对两个无限维度的矢量进行内积运算,但是我们却可以通过高斯核直接给出无限空间矢量积的表达式,是不是很神奇呀!
来看一下高斯核的特征,如果两个向量离得很近,甚至于重合,即 x ≈ l x \approx l x≈l,则 k ( x , l ) ≈ 1 k(x,l) \approx 1 k(x,l)≈1,如果两个向量距离很远, ‖ x − l ‖ 2 ‖x-l‖^2 ‖x−l‖2将会是一个很大的值,则 k ( x , l ) ≈ 0 k(x,l) \approx 0 k(x,l)≈0. 可以发现,如果以向量 l l l 作为一个标记点的话,高斯核计算的结果衡量了向量 x x x 与 l l l 的相似程度。
如下图5示例,其中 l = [ 3 , 5 ] T l=[3,5]^T l=[3,5]T, 当 x = l = [ 3 , 5 ] T x=l=[3,5]^T x=l=[3,5]T 时,曲面处在最高点,对应值为1。此外, σ 2 \sigma ^2 σ2 控制了曲面的坡度, σ 2 \sigma^2 σ2 越大,经过高斯核转换之后的值变化越平缓。
应用示例
下面,我们使用SVM+高斯核的方法,应用到下图6中的非线性分类问题,我们得到了一条可以区分大多数异类数据点的分界线(即如下图6中蓝色曲线所示):
核技巧的另一种解释(相似度)
关于核技巧的另外一种直观解释,是将核函数理解为一种计算向量间相似度的方法3。
还是对应于上图6中的问题,这里,我们手动定义了一个新的 l ( 1 ) l^{(1)} l(1) (如下图7所示),然后对所有的样本点,计算和这个新的点的相似度(即距离),这样我们就构建了一个新的特征。如果采用高斯核作为相似度的计算方法的话,由前面的介绍可知, l ( 1 ) l^{(1)} l(1) 附近的点新特征取值接近于1,离较远 l ( 1 ) l^{(1)} l(1) 的点新特征取值越接近于0,这样就可以把图中两类点区分开来了。
上面的图示中只有一个点 l ( 1 ) l^{(1)} l(1),实际可以有无限多个点,这就是为什么说SVM可以将数据映射到多维空间中。计算与一个点的相似度就新构建一维特征,2个点就是二维,3个点就是三维等等….上面例子中的 l ( 1 ) l^{(1)} l(1) 是直接手动指定,实际情况中不是这样,通常是设置成训练数据中的样本点(即 l ( 1 ) = x ( 1 ) , l ( 2 ) = x ( 2 ) , … , l ( m ) = x ( m ) l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},…,l^{(m)}=x^{(m)} l(1)=x(1),l(2)=x(2),…,l(m)=x(m)),再慢慢试出最好的点。
算法比较
回顾一下,截至目前我们介绍了两类有监督学习中的经典分类方法,即逻辑回归和支持向量机。那么实践中,应该如何选择两类方法呢?吴恩达在机器学习课程中给出了如下建议3:
- 相对于训练样本数量而言,特征数量较多,可以选择:
- 逻辑回归;或者,
- 线性SVM (即不使用核技巧)
- 特征数量较少,训练样本数量适中,可以选择:
- SVM + 高斯核;
- 特征数量较少,训练样本数量较大,可以选择:
- 手动构建新的特征,并使用逻辑回归;或者,
- 手动构建新的特征,并使用线性SVM(如果样本数量较大,计算核函数效率较低)。
小结
- 当异类样本在二维空间内线性不可分时,可以使用映射函数,将数据从低维特征空间映射到高维特征空间,使样本数据在高维特征空间中线性可分。
- 核技巧的中心思想就是,我们不需要知道低维空间的数据是怎样映射到高维空间的,我们只需要知道计算结果是怎么计算出来的,从而大大简化在高维空间内的矢量积计算,其实现方法即为核函数。
- 两种常用的核函数是多项式核: k ( x , l ) = ( x T l + c ) d k(x,l)= (x^T l+c)^d k(x,l)=(xTl+c)d与高斯核: k ( x , l ) = e x p ( − ‖ x − l ‖ 2 2 σ 2 ) k(x,l)=exp(\frac{-‖x-l‖^2}{2σ^2}) k(x,l)=exp(2σ2−‖x−l‖2)。