将线性支持向量机向非线性支持向量机推广需要用到核函数技巧(kernel trick),一般分为两步:
1、使用一个变换将原空间的数据映射到新空间;
2、在新空间用线性分类器分类学习从训练数据中学习分类模型。
核函数运用到支持向量机就是通过一个非线性变换将输入空间对应到一个特征空间,使得在输入空间
R
n
\textbf R^n
R
n
中的超曲面模型对应于特征空间中的超平面模型。这样,分类问题就可以通过在特征空间中求解线性支持向量机完成。
核函数的定义:
ϕ
(
x
)
:
X
→
H
\phi(x):X→H
ϕ
(
x
)
:
X
→
H
K
(
x
,
z
)
=
ϕ
(
x
)
⋅
ϕ
(
z
)
K(x,z)=\phi(x)\cdot \phi(z)
K
(
x
,
z
)
=
ϕ
(
x
)
⋅
ϕ
(
z
)
其中,
ϕ
(
x
)
\phi (x)
ϕ
(
x
)
为映射函数,
ϕ
(
x
)
⋅
ϕ
(
z
)
\phi(x)\cdot \phi(z)
ϕ
(
x
)
⋅
ϕ
(
z
)
为内积
K
(
x
,
z
)
K(x,z)
K
(
x
,
z
)
称为核函数。
使用核函数的优势在于,在核函数
K
(
x
,
z
)
K(x,z)
K
(
x
,
z
)
给定的情况下,可以利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行的,不需要显示地定义特征空间和映射函数。在实际应用中,往往是依赖领域知识直接选择核函数,核函数选择的有效性需要通过实验验证。
常用的核函数
1、多项式核函数(polynomial kernel function)
K
(
x
,
z
)
=
(
x
⋅
z
+
1
)
p
K(x,z)=(x\cdot z+1)^p
K
(
x
,
z
)
=
(
x
⋅
z
+
1
)
p
对应的支持向量机是一个p次多项式分类器,在此情形下,分类决策函数为:
f
(
x
)
=
s
i
g
n
(
∑
i
=
1
N
s
α
i
∗
y
i
(
x
i
⋅
x
+
1
)
p
+
b
∗
)
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_i(x_i\cdot x+1)^p+b^*)
f
(
x
)
=
s
i
g
n
(
i
=
1
∑
N
s
α
i
∗
y
i
(
x
i
⋅
x
+
1
)
p
+
b
∗
)
2、高斯核函数(Gaussian kernel function)
K
(
x
,
z
)
=
e
x
p
(
−
∣
∣
x
−
z
∣
∣
2
2
σ
2
)
K(x,z)=exp(-\frac{||x-z||^2}{2\sigma^2})
K
(
x
,
z
)
=
e
x
p
(
−
2
σ
2
∣
∣
x
−
z
∣
∣
2
)
对应的支持向量机为高斯径向基函数分类器。在此情形下,分类决策函数为
f
(
x
)
=
s
i
g
n
(
∑
i
=
1
N
s
α
i
∗
y
i
e
x
p
(
−
∣
∣
x
−
z
∣
∣
2
2
σ
2
+
b
∗
)
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_iexp(-\frac{||x-z||^2}{2\sigma^2}+b^*)
f
(
x
)
=
s
i
g
n
(
i
=
1
∑
N
s
α
i
∗
y
i
e
x
p
(
−
2
σ
2
∣
∣
x
−
z
∣
∣
2
+
b
∗
)
非线性支持向量机的学习算法
1、选择适当的核函数
K
(
x
,
z
)
K(x,z)
K
(
x
,
z
)
和适当的参数C,构造并求解做优化问题
min
α
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
K
(
x
i
,
x
j
)
−
∑
i
=
1
N
α
i
\min_\alpha\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_i
α
min
2
1
i
=
1
∑
N
j
=
1
∑
N
α
i
α
j
y
i
y
j
K
(
x
i
,
x
j
)
−
i
=
1
∑
N
α
i
s.t.
∑
i
=
1
N
α
i
y
i
=
0
\sum_{i=1}^N\alpha_iy_i=0
i
=
1
∑
N
α
i
y
i
=
0
0
⩽
α
i
⩽
C
,
i
=
1
,
2
,
⋯
,
N
0\leqslant\alpha_i\leqslant C, i=1,2,\cdots,N
0
⩽
α
i
⩽
C
,
i
=
1
,
2
,
⋯
,
N
求得最优解
α
∗
=
(
α
1
∗
,
α
2
∗
,
⋯
,
α
N
∗
)
T
\alpha^*=(\alpha_1^*,\alpha_2^*,\cdots,\alpha_N^*)^T
α
∗
=
(
α
1
∗
,
α
2
∗
,
⋯
,
α
N
∗
)
T
2、选择
α
∗
\alpha^*
α
∗
的一个正分量
0
<
α
j
∗
<
C
0<\alpha^*_j<C
0
<
α
j
∗
<
C
,计算
b
∗
=
y
j
−
∑
i
=
1
N
α
i
∗
y
i
K
(
x
i
,
x
j
)
b^*=y_j-\sum_{i=1}^N\alpha_i^*y_iK(x_i,x_j)
b
∗
=
y
j
−
i
=
1
∑
N
α
i
∗
y
i
K
(
x
i
,
x
j
)
3、构造决策函数:
f
(
x
)
=
s
i
g
n
(
∑
i
=
1
N
α
i
∗
y
i
K
(
x
,
x
i
)
+
b
∗
)
f(x)=sign(\sum_{i=1}^N\alpha_i^*y_iK(x,x_i)+b^*)
f
(
x
)
=
s
i
g
n
(
i
=
1
∑
N
α
i
∗
y
i
K
(
x
,
x
i
)
+
b
∗
)
当
K
(
x
,
z
)
K(x,z)
K
(
x
,
z
)
为正定核函数时,上述问题为凸二次规划问题,解是存在的。
下面,由15行python实现线性SVM与高斯核函数SVM的对比
from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
X = data['data']
y = data['target']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf1 = SVC(kernel='linear')#不采用核函数
clf2 = SVC(kernel='rbf', C=10, gamma=0.0001)#采用高斯核函数
clf1.fit(x_train, y_train)
clf2.fit(x_train, y_train)
print('线性SVM的精度为{}:'.format(clf1.score(x_test, y_test)))
print('高斯核函数SVM的精度为{}:'.format(clf2.score(x_test, y_test)))
运行结果如下:
说明,在乳腺癌诊断的数据集上,采用软间隔线性SVM是要由于采用高斯核函数SVM的。