- 假设给定一个特征空间上的训练数据集 T = ( x 1 , y 1 ) , . . . , ( x N , y N ) T={(x_1,y_1),...,(x_N,y_N)} T=(x1,y1),...,(xN,yN),其中 x i ∈ R n , y i ∈ { − 1 , + 1 } , i = 1 , 2 , . . . , N x_i\in R^n, y_i\in\{-1,+1\}, i=1,2,...,N xi∈Rn,yi∈{−1,+1},i=1,2,...,N
- x i x_i xi为第 i 个实例(若n>1, x i x_i xi为向量);
- y_i为x_i的类标记;
- 当y_i=+1时,称 x i x_i xi为正例;
- 当y_i=-1时,称 x i x_i xi为负例;
- ( x i , y i x_i, y_i xi,yi)称为样本点。
线性可分支持向量机
- 给定线性可分训练数据集,通过间隔最大化得到的分离超平面为
y ( x ) = w T ϕ ( x ) + b y(x)=w^T\phi(x)+b y(x)=wTϕ(x)+b
相应的分类决策函数 f ( x ) = s i g n ( w T ϕ ( x ) + b ) f(x)=sign(w^T\phi(x)+b) f(x)=sign(wTϕ(x)+b)
该决策函数称为线性可分支持向量机。 -
ϕ
(
x
)
\phi(x)
ϕ(x)是某个确定的特征空间转换函数,它的作用是将x映射到(更高的)维度。
- 最简单直接的: ϕ ( x ) = x \phi(x)=x ϕ(x)=x
- 求解分离超平面问题可以等价为求解相应的凸二次规划问题。
符号标记
- 分割平面: y ( x ) = w T ϕ ( x ) + b y(x)=w^T\phi(x)+b y(x)=wTϕ(x)+b
- 训练集: x 1 , . . . , x n x_1,...,x_n x1,...,xn
- 目标值: y 1 , . . . , y n , y i ∈ { − 1 , + 1 } y_1,...,y_n,y_i\in\{-1,+1\} y1,...,yn,yi∈{−1,+1}
- 新数据的分类: s i g n ( y ( x ) ) sign(y(x)) sign(y(x))
下面给出SVM算法的理论推导:
线性支持向量机
若数据线性不可分,则增加松弛因子
ξ
i
≤
0
\xi_i\le0
ξi≤0,使函数间隔加上松弛变量大于等于1,这样约束条件变成了
y
i
(
w
⋅
x
i
+
b
)
≥
1
−
ξ
i
y_i(w\cdot x_i+b)\ge 1- \xi_i
yi(w⋅xi+b)≥1−ξi
则目标函数为:
m
i
n
w
,
b
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
N
ξ
i
min_{w,b}\frac{1}{2}||w||^2+C\sum_{i=1}^{N}\xi_i
minw,b21∣∣w∣∣2+Ci=1∑Nξi
约束条件:
y
i
(
w
⋅
x
i
+
b
)
≥
1
−
ξ
i
,
i
=
1
,
2
,
.
.
.
,
n
y_i(w\cdot x_i+b)\ge 1- \xi_i,\ i=1,2,...,n
yi(w⋅xi+b)≥1−ξi, i=1,2,...,n
ξ
i
≥
0
i
=
1
,
2
,
.
.
.
,
n
\xi_i\ge0\ i=1,2,...,n
ξi≥0 i=1,2,...,n
与上述过程相同,整理得到对偶问题:
m
i
n
α
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
(
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_j(x_ix_j)-\sum_{i=1}^{n}\alpha_i
minα21i=1∑nj=1∑nαiαjyiyj(xixj)−i=1∑nαi
约束条件为:
∑
i
=
1
n
α
i
y
i
=
0
\sum_{i=1}^{n}\alpha_iy_i=0
i=1∑nαiyi=0
0
≤
α
i
≤
C
0\le\alpha_i\le C
0≤αi≤C
上述优化问题可用SMO算法解得,将解待人即可得分离超平面和决策函数。
事实上SVM的损失函数为:max(1-d,0)
SMO算法
- 序列最小最优化(Sequential Minimal Optimization)
- 有多个拉格朗日乘子
- 每次只选择其中两个乘子做优化,其它因子认为是常数。
- 将N个解问题,转换成两个变量的求解问题:并且目标函数是凸的。
具体步骤如下:
核函数
可以使用核函数,将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。
- 多项式核函数: κ ( x 1 , x 2 ) = ( x 1 ⋅ x 2 + c ) d \kappa(x_1,x_2)=(x_1\cdot x_2+c)^d κ(x1,x2)=(x1⋅x2+c)d
- 高斯核RBF函数: κ ( x 1 , x 2 ) = e x p ( − γ ∣ ∣ x 1 − x 2 ∣ ∣ 2 ) \kappa(x_1,x_2)=exp(-\gamma||x_1-x_2||^2) κ(x1,x2)=exp(−γ∣∣x1−x2∣∣2)
- Sigmoid核函数: κ ( x 1 , x 2 ) = t a n h ( x 1 x 2 + c ) \kappa(x_1,x_2)=tanh(x_1x_2+c) κ(x1,x2)=tanh(x1x2+c)
例如多项式核函数:
κ
(
x
,
y
)
=
(
x
⋅
y
)
2
=
∑
i
=
1
n
∑
j
=
1
n
(
x
i
x
j
)
(
y
i
y
j
)
\kappa(x,y)=(x\cdot y)^2=\sum_{i=1}^{n}\sum_{j=1}^{n}(x_ix_j)(y_iy_j)
κ(x,y)=(x⋅y)2=∑i=1n∑j=1n(xixj)(yiyj)
此时
ϕ
(
x
)
=
(
x
i
x
j
)
i
,
j
=
1
n
\phi(x)=(x_ix_j)_{i,j=1}^{n}
ϕ(x)=(xixj)i,j=1n
注:高斯核是无穷维的
from sklearn import svm
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 载入鸢尾花数据
lr = load_iris()
# 分割数据集
x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, train_size=0.75)
# C即是目标函数里面的C,kernel='linear'代表核函数为线性核函数,decision_function_shape='ovr'代表分类类型为one versus rest即1对多,对应的1对1是'ovo'
clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')
clf.fit(x_train, y_train)
# 训练集准确率
print(clf.score(x_train, y_train))
# decision_function
print(clf.decision_function(x_train))
# 预测数据
print(clf.predict(x_train))