文章目录
CH8 核学习
8.1 SVM
支持向量机(support vector machines, SVM)是一种二分类模型,它将实力的特征向量映射为空间中的一些点,SVM的目的就是想要画出一条线,以“最好地”区分这两类点。如果以后有了新的点,这条线也能做出很好的分类。SVM适合中小型数据样本、非线性、高维的分类问题。
8.1.1 SVM基本概念
将实例的特征向量(以二维为例)映射为空间中的一些点,如下图的实心点和空心点,它们属于不同的两类。SVM目的就是想要画出一条线,以“最好的”区分这两类点。
Q1:画线的标准是什么?
线是有无数条可以画的,区别就在于效果好不好。SVM将会寻找可以区分两个类别并且能使间隔(margin)最大的划分超平面。
超平面:样本的特征很可能是高维的,此时样本空间的划分就不是一条线了
Q2:间隔(margin)是什么?
对于任意一个超平面,其两侧数据点都距离它有一个最小距离。如下图,虚线是由距离中央实线最近的两个点所确定出来的(也就是由支持向量决定),但此时margin比较小,如果用第二种方式,margin明显变大也更接近我们的目标。
Q3:支持向量是什么?
从上图可以看出,虚线上的点到划分超平面的距离都是一样的,实际上只有这几个点共同确定了超平面的位置,因此被称作“支持向量”,“支持向量机”也是由此来的。
8.1.2 SVM可扩展到多分类问题
对于每个类,有一个当前类和其他类的二类分类器
将多分类问题转化为n个二分类问题,n就是类别个数
8.1.3 SVM算法特性
- 训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的,所以SVM不太容易产生overfitting
- SVM训练出来的模型完全依赖于支持向量,即使训练集里面的所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型
- 一个SVM如果训练得出的支持向量个数比较少,那么SVM训练出的模型比较容易被泛化
8.2 核方法
核方法主要思想:
在低维空间中不能线性分割的点集,通过转化为高维空间中的点集,很有可能变为线性可分的。
8.2.1 二维空间的例子
左边是一个原始的数据空间,虽然肉眼可见这个数据有明显的数据边界来进行区分,但是SVM并不能得到这样的边界,但是通过转换,例如转换到右边的空间,就可以称为线性可分的数据,公式如下:
Φ
(
x
)
→
x
1
2
,
x
2
2
,
2
x
1
x
2
\Phi(x) \to x_1^2, x_2^2,\sqrt{2}x_1x_2
Φ(x)→x12,x22,2x1x2
其中
Φ
\Phi
Φ是一个转换函数,其将2-D空间的数据转换到3-D空间,
2
\sqrt{2}
2是为了后续的计算方便,有了这个3-D空间的数据,就可以利用直线或者平面将其分开,假设使用罗切斯特回归的方式,那么公式如下:
β
0
+
β
1
x
1
2
+
β
2
x
2
2
+
β
3
2
x
1
x
2
=
0
\beta_0+\beta_1x_1^2+\beta_2x_2^2+\beta_3\sqrt{2}x_1x_2 = 0
β0+β1x12+β2x22+β32x1x2=0
利用SVM也能得到这样的公式,在SVM的计算过程中,需要利用到点积的操作,即
<
Φ
(
x
i
)
,
Φ
(
x
j
)
>
<\Phi(x_i),\Phi(x_j)>
<Φ(xi),Φ(xj)>,先将某向量转换到高维空间,然后计算点积。
<
Φ
(
x
i
)
,
Φ
(
x
j
)
>
=
<
{
x
i
1
2
,
x
i
2
2
,
2
x
i
1
x
i
2
}
,
{
x
j
1
2
,
x
j
2
2
,
2
x
j
1
x
j
2
}
>
=
x
i
1
2
x
j
1
2
+
x
i
2
2
x
j
2
2
+
2
x
i
1
x
i
2
x
j
1
x
j
2
\begin{split} \big<\Phi(x_i),\Phi(x_j)\big> &= \big<\{x_{i1}^2,x_{i2}^2,\sqrt{2}x_{i1}x_{i2}\},\{x_{j1}^2,x_{j2}^2,\sqrt{2}x_{j1}x_{j2}\}\big>\\ &=x_{i1}^2x_{j1}^2+x_{i2}^2x_{j2}^2+2x_{i1}x_{i2}x_{j1}x_{j2} \end{split}
⟨Φ(xi),Φ(xj)⟩=⟨{xi12,xi22,2xi1xi2},{xj12,xj22,2xj1xj2}⟩=xi12xj12+xi22xj22+2xi1xi2xj1xj2
使用核函数:(直接在原始空间中进行卷积)
<
x
i
,
x
j
>
2
=
<
{
x
i
1
,
x
i
2
}
,
{
x
j
1
,
x
j
2
}
>
2
=
(
x
i
1
x
j
1
+
x
i
2
x
j
2
)
2
=
x
i
1
2
x
j
1
2
+
x
i
2
2
x
j
2
2
+
2
x
i
1
x
i
2
x
j
1
x
j
2
\begin{split} \big<x_i,x_j\big>^2 &= \big<\{x_{i1},x_{i2}\},\{x_{j1},x_{j2}\}\big>^2 \\ &=(x_{i1}x_{j1}+x_{i2}x_{j2})^2\\ &=x_{i1}^2x_{j1}^2+x_{i2}^2x_{j2}^2+2x_{i1}x_{i2}x_{j1}x_{j2} \end{split}
⟨xi,xj⟩2=⟨{xi1,xi2},{xj1,xj2}⟩2=(xi1xj1+xi2xj2)2=xi12xj12+xi22xj22+2xi1xi2xj1xj2
从计算量来看前者比二者多很多,从计算空间看后者也更直接
8.2.2 使用核方法的动机
在线性SVM中转化为最优化问题时求解的公式计算都是以内积形式出现的,其中 Φ ( X ) \Phi(X) Φ(X)是把训练集中的向量点转化为高维的非线性映射函数。
因为内积的算法复杂度非常大,所以我们利用核函数来取代计算非线性映射函数的内积。
以下核函数和非线性映射函数的内积等同,但核函数K的运算量要远少于求内积。
K
(
X
i
,
X
j
)
=
Φ
(
X
i
)
⋅
Φ
(
X
j
)
K(X_i,X_j) = \Phi(X_i)\cdot\Phi(X_j)
K(Xi,Xj)=Φ(Xi)⋅Φ(Xj)
8.2.3 常用的核函数(kernel functions)
h度多项式核函数:
K
(
X
i
,
X
j
)
=
(
X
i
,
X
j
+
1
)
h
K(X_i,X_j) = (X_i,X_j+1)^h
K(Xi,Xj)=(Xi,Xj+1)h
高斯径向基核函数:
K
(
X
i
,
X
j
)
=
e
−
∣
∣
X
i
−
X
j
∣
∣
2
2
σ
2
K(X_i,X_j) = e^{\frac{-||X_i-X_j||^2}{2\sigma^2}}
K(Xi,Xj)=e2σ2−∣∣Xi−Xj∣∣2
S型核函数:
K
(
X
i
,
X
j
)
=
tanh
(
k
X
i
⋅
X
j
−
δ
)
K(X_i,X_j) = \tanh(kX_i\cdot X_j-\delta)
K(Xi,Xj)=tanh(kXi⋅Xj−δ)
如何选择使用哪个kernel?
- 根据先验知识,比如图像分类。通常使用RBF(高斯径向基核函数),文字不使用RBF
- 尝试不同的kernel,根据结果准确度而定。
使用kernel的意义在于:
- 将向量的维度从低维映射到高维
- 降低运算复杂度
线性不可分
无法用一条直线将两类样本点区分开
在线性不可分的情况下,数据集在空间中对应的向量无法被一个超平面区分开,如何处理:
- 利用一个非线性的映射把原数据集中的向量点转化到一个更高维度的空间中
- 在这个高维度的空间中找一个线性的超平面来根据线性可分的情况处理
如何利用非线性映射将原始数据转化到高维空间中去?
例子:
有一个3维输入量
X
=
(
x
1
,
x
2
,
x
3
)
X=(x_1,x_2,x_3)
X=(x1,x2,x3),将其转化到6维空间Z中去:
Φ
1
(
X
)
=
x
1
,
Φ
2
(
X
)
=
x
2
,
Φ
3
(
X
)
=
x
3
,
Φ
4
(
X
)
=
(
x
1
)
2
,
Φ
5
(
X
)
=
x
1
x
2
,
Φ
6
(
X
)
=
x
1
x
3
\begin{split} &\Phi_1(X) = x_1,\Phi_2(X)=x_2,\Phi_3(X)=x_3,\\ &\Phi_4(X) = (x_1)^2,\Phi_5(X)=x_1x_2,\Phi_6(X) = x_1x_3 \end{split}
Φ1(X)=x1,Φ2(X)=x2,Φ3(X)=x3,Φ4(X)=(x1)2,Φ5(X)=x1x2,Φ6(X)=x1x3
新的决策超平面: d ( Z ) = W Z + b d(Z) = WZ+b d(Z)=WZ+b,其中W和Z是向量,这个超平面是线性的
解出W和b之后带入原方程
d
(
Z
)
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
w
4
(
x
1
)
2
+
w
5
x
1
x
2
+
w
6
x
1
x
3
+
b
=
w
1
z
1
+
w
2
z
2
+
w
3
z
3
+
w
4
z
4
+
w
5
z
5
+
w
6
z
6
+
b
\begin{split} d(Z) &= w_1x_1+w_2x_2+w_3x_3+w_4(x_1)^2+w_5x_1x_2+w_6x_1x_3+b\\ &=w_1z_1+w_2z_2+w_3z_3+w_4z_4+w_5z_5+w_6z_6+b \end{split}
d(Z)=w1x1+w2x2+w3x3+w4(x1)2+w5x1x2+w6x1x3+b=w1z1+w2z2+w3z3+w4z4+w5z5+w6z6+b