文章目录
3. SVM支持向量机
3.1 基本介绍
- SVM 本身是 二分类算法,是对感知机算法模式的扩展。
- 该算法 支持 线性分类,也支持 非线性分类,且也能应用到回归中。
- 可通过 OvR 或 OvO 的方式将其应用到多分类中,在不考虑集成学习算法和特定数据集时,SVM算是分类的佼佼者。
既然是感知机的扩展,那么什么是感知机模式?
3.2 感知机算法思想
在任意空间内,感知机模型都会寻找一个超平面,该平面能把二元类别分开。而前提是:数据是线性可分的。
此时配合标签 y ,
正确的分类 y * θx > 0, 错误的分类 y * θx < 0。
则损失函数可以是期望分类错误的所有样本距离超平面的距离之和最小。
聊到距离了,那么看下距离类型
3.3 几何距离和函数距离
- 几何距离
从点到直线的距离:
对于直线 a x + b y + c = 0 ,距离公式为: d ( x , y ) = ∣ a x + b y + c ∣ a 2 + b 2 \text{对于直线} ax\,\,+\,\,by\,\,+\,\,c\,\,=\,\,0\text{,距离公式为:} \\ d\left( x, y \right) \,\,=\,\,\frac{|ax\,\,+\,\,by\,\,+c|}{\sqrt{a^2\,\,+\,\,b^2}} 对于直线ax+by+c=0,距离公式为:d(x,y)=a2+b2∣ax+by+c∣
推广到高维空间:
对于某平面 w T x + b = 0 ,距离公式为: d ( x , y ) = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ , ∣ ∣ w ∣ ∣ = w T w \text{对于某平面} w^Tx\,\,+\,\,b\,\,=\,\,0\text{,距离公式为:} \\ d\left( x, y \right) \,\,=\,\,\frac{| w^Tx+\,\,b|}{||w||}, ||w|| =\,\,\sqrt{w^Tw} 对于某平面wTx+b=0,距离公式为:d(x,y)=∣∣w∣∣∣wTx+b∣,∣∣w∣∣=wTw
对于分类正确的点 y i ,与结果同号,否则异号,距离可表示为 : d ( x , y ) = y i ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ 那么求和时,负数干扰越小越好 \text{对于分类正确的点} y_i\text{,与结果同号,否则异号,距离可表示为}: \\ d\left( x, y \right) \,\,=\,\,\frac{y_i| w^Tx+\,\,b|}{||w||} \\ \text{那么求和时,负数干扰越小越好} 对于分类正确的点yi,与结果同号,否则异号,距离可表示为:d(x,y)=∣∣w∣∣yi∣wTx+b∣那么求和时,负数干扰越小越好 - 函数距离
点比较之间的相对距离
分子部分 y i ∣ w T x + b ∣ 为点到平面的函数距离 \text{分子部分} y_i| w^Tx+\,\,b| \text{为点到平面的函数距离} 分子部分yi∣wTx+b∣为点到平面的函数距离
3.4 损失函数求解
由前面得知,错误分类导致异号,距离与标签值的乘积 < 0。
进一步可看出 分子分母都有w,而分子的异号可以代表值的大小,所以有:
L
=
∑
i
=
1
m
−
y
i
∣
w
T
x
i
+
b
∣
L\,\,=\,\,\sum_{i=1}^m{-y_i| w^Tx_i+\,\,b|}
L=i=1∑m−yi∣wTxi+b∣
梯度下降求解,不过此时集合是错误点集合,数量不固定,所以可以使用MBGD 或 SGD,不使用 BGD,一般用 SGD:
L
′
=
−
∑
i
=
1
m
y
i
x
i
L\prime =\,\,-\sum_{i=1}^m{y_ix_i}
L′=−i=1∑myixi
现在我们再来看SVM
3.5 SVM算法思想
相同的地方
不同的地方
- 损失函数不同,感知机通过判错点寻找超平面,而SVM通过支持向量寻找超平面。
- 感知机 直接最小化损失函数得到 θ,SVM 还可以通过寻找支持向量。
高级在哪?
感知机 关注了 错误的点的距离,但正确的点的距离不会影响超平面的划分,就出现上图这种情况。
那么为了解决,我们可以寻找最胖的超平面,然后让分类正确的离超平面比较近的点,都尽可能远离超平面,达到一个均衡的效果。
所以对这些近距离的点,设置条件且满足的,我们称其为支持向量。
SVM 尝试 寻找 决策边界, 距离两个类别 最近的样本最远。
3.6 SVM 类别
- 线性可分SVM
硬间隔最大化 - 线性SVM
软间隔最大化 - 非线性SVM
升维(核函数)
3.6.1 几个基本概念
- 线性可分
数据集中,可以寻找到超平面,将两组数据分开,则该数据线性可分。 - 分割超平面
将数据分开来的直线或平面。 - 间隔
数据点到分割超平面的距离。 - 支持向量
满足条件,离分割超平面最近的点。
3.6.2 线性可分SVM
目标:
能分类的平面中,距离越近的点越远越好。
约束条件:
max
w
,
b
Υ
min
=
y
min
(
w
x
min
+
b
)
∣
∣
w
∣
∣
\max _{w,b}\varUpsilon _{\min}\,\,=\,\,\frac{y_{\min}\left( wx_{\min}\,\,+\,\,b \right)}{||w||}
w,bmaxΥmin=∣∣w∣∣ymin(wxmin+b)
当距离只看分子时函数距离满足:
则
y
i
(
w
x
i
+
b
)
=
Υ
i
≥
Υ
min
(
i
=
1
,
2
,
.
.
.
,
m
)
\text{则} y_i\left( wx_i\,\,+\,\,b \right) \,\,=\,\,\varUpsilon _i\,\,≥\,\,\varUpsilon _{\min}\,\,\left( i\,\,=\,\,1, 2, ..., m \right)
则yi(wxi+b)=Υi≥Υmin(i=1,2,...,m)
3.6.2.1__简化目标__
一组 w,b 确定一个超平面,
一个超平面 可以有多个 w,b,只要任意一组符合条件的就可以了。
选择最好求的, 令 最短函数距离为 1(其他值也可以,因为是相对值),则有:
max
w
,
b
Υ
min
=
1
∣
∣
w
∣
∣
\max _{w,b}\varUpsilon _{\min}\,\,=\,\,\frac{1}{||w||}\,\,
w,bmaxΥmin=∣∣w∣∣1
y
i
(
w
x
i
+
b
)
=
Υ
i
≥
1
(
i
=
1
,
2
,
.
.
.
,
m
)
\,\,y_i\left( wx_i\,\,+\,\,b \right) \,\,=\,\,\varUpsilon _i\,\,≥\,\,1 \left( i\,\,=\,\,1, 2, ..., m \right)
yi(wxi+b)=Υi≥1(i=1,2,...,m)
要让最近的点距离越远越好,分子确定,进一步等价于最小化分母:
即求解
min
∣
∣
w
∣
∣
,
为了方便后续求导计算
,
可以写成
:
优化
min
1
2
∣
∣
w
∣
∣
2
,
但本质还是最小化
L
2
范数。
\text{即求解} \min ||w||, \text{为了方便后续求导计算},\text{可以写成}: \\ \text{优化} \min \frac{1}{2}||w||^2,\text{但本质还是最小化}L_2\text{范数。}
即求解min∣∣w∣∣,为了方便后续求导计算,可以写成:优化min21∣∣w∣∣2,但本质还是最小化L2范数。
约束条件为
y
i
(
w
x
i
+
b
)
=
Υ
i
≥
1
(
i
=
1
,
2
,
.
.
.
,
m
)
\text{约束条件为} y_i\left( wx_i\,\,+\,\,b \right) \,\,=\,\,\varUpsilon _i\,\,≥\,\,1 \left( i\,\,=\,\,1, 2, ..., m \right)
约束条件为yi(wxi+b)=Υi≥1(i=1,2,...,m)
因为带有约束条件,那么此次最优化并不采用 梯度下降GD, 而是 利用拉格朗日函数二次优化,并采用SMO求解
关于带约束条件的最优化问题
原始问题泛化表示:
min
x
ϵ
R
n
f
(
x
)
\underset{x\epsilon R^n}{\min}f\left( x \right)
xϵRnminf(x)
约束条件:
c
i
(
x
)
≤
0
,
i
=
1
,
2
,
.
.
.
,
k
c_i\left( x \right) \,\,≤\,\,0, i=1,2,...,k
ci(x)≤0,i=1,2,...,k
h
j
(
x
)
=
0
,
j
=
1
,
2
,
.
.
.
,
l
h_j\left( x \right) =0, j=1,2,...,l
hj(x)=0,j=1,2,...,l
可以将约束条件表述为k个不等式约束条件,和L个等式约束条件。
进一步可以将其定义为拉格朗日函数:
L
(
x
,
α
,
β
)
=
f
(
x
)
+
∑
i
=
1
k
a
i
c
i
(
x
)
+
∑
j
=
1
l
β
j
h
j
(
x
)
c
i
是第
i
个不等式约束函数
,
b
j
是第
j
个不等式约束函数
α
i
,
β
j
是拉格朗日乘子
L\left( x,\alpha ,\beta \right) \,\,=\,\,f\left( x \right) \,\,+\,\,\sum_{i=1}^k{a_ic_i\left( x \right)}\,\,+\,\,\sum_{j=1}^l{\beta _jh_j\left( x \right)} \\ c_i\text{是第}i\text{个不等式约束函数}, b_j\text{是第}j\text{个不等式约束函数} \\ \alpha _i, \beta _j\,\,\text{是拉格朗日乘子}
L(x,α,β)=f(x)+i=1∑kaici(x)+j=1∑lβjhj(x)ci是第i个不等式约束函数,bj是第j个不等式约束函数αi,βj是拉格朗日乘子
在进一步套用时, 我们先看下拉格朗日函数的特性:
- 可以将有约束函数变为无约束条件函数来求解;
- 根据上两条,我们可以通过对拉格朗日函数求最大,得到 f(x),之后再去求 min f(x);即通过二次优化 去除 约束 代替 一次优化。
- 原始问题具有对偶问题,当f(x) 和 ci函数为凸函数,hj函数为仿射函数,可以先求极小拉格朗日函数(α和β视作常数,求x,这里代表w),再求极大f(x)(求α和β)。
求解步骤:三个未知数求导,外接四个约束条件
现在套用到我们的问题
约束条件为
y
i
(
w
x
i
+
b
)
=
Υ
i
≥
1
(
i
=
1
,
2
,
.
.
.
,
m
)
\text{约束条件为}y_i\left( wx_i\,\,+\,\,b \right) \,\,=\,\,\varUpsilon _i\,\,≥\,\,1\left( i\,\,=\,\,1,2,...,m \right)
约束条件为yi(wxi+b)=Υi≥1(i=1,2,...,m)
L
(
x
,
α
,
β
)
=
f
(
x
)
+
∑
i
=
1
k
a
i
c
i
(
x
)
+
∑
j
=
1
l
β
j
h
j
(
x
)
满足
α
i
≥
0
f
(
x
)
=
1
2
∣
∣
w
∣
∣
2
,无
h
j
(
x
)
等式约束,
c
i
(
x
)
=
−
(
y
i
(
w
T
x
i
+
b
)
−
1
)
≤
0
L\left( x,\alpha ,\beta \right) \,\,=\,\,f\left( x \right) \,\,+\,\,\sum_{i=1}^k{a_ic_i\left( x \right)}\,\,+\,\,\sum_{j=1}^l{\beta _jh_j\left( x \right)}\,\, \text{满足}\alpha _i\,\,≥\,\,0 \\ f\left( x \right) \,\,=\,\,\frac{1}{2}||w||^2\text{,无} h_j\left( x \right) \,\,\text{等式约束,}c_i\left( x \right) \,\,=\,\,-(y_i\left( w^Tx_i\,\,+\,\,b \right) \,\,-\,\,1) ≤\,\,0
L(x,α,β)=f(x)+i=1∑kaici(x)+j=1∑lβjhj(x)满足αi≥0f(x)=21∣∣w∣∣2,无hj(x)等式约束,ci(x)=−(yi(wTxi+b)−1)≤0
得出:
L
(
x
,
α
,
β
)
=
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
k
a
i
[
y
i
(
w
T
x
i
+
b
)
−
1
]
L\left( x,\alpha ,\beta \right) \,\,=\,\,\frac{1}{2}||w||^2\,\,-\,\,\sum_{i=1}^k{a_i\left[ y_i\left( w^Tx_i\,\,+\,\,b \right) \,\,-\,\,1 \right]}
L(x,α,β)=21∣∣w∣∣2−i=1∑kai[yi(wTxi+b)−1]
3.6.2.2 问题求解
求w,b导数解极小
反代回去求α解极大
先分解后代入一个w
将第二个w和b的结论也带入:
求最大,整理对偶函数
得到最终超平面
通过SMO算法,求的 a* ,带入w式子,求解w*
ω
∗
=
∑
i
=
1
m
a
i
∗
y
i
x
i
\omega ^*\,\,=\,\,\sum_{i=1}^m{a_{i}^{*}y_ix_i}
ω∗=i=1∑mai∗yixi
b^的求法,可以由约束条件:
(ys和xs就是支持向量点)
找到每个支持向量带进去求b,然后求平均得 b^。
3.6.2.3 硬分隔SVM总结
流程
3.6.3 线性SVM
硬分隔可能面临
- 由于噪声点得不到可分平面;
- 或者分界过窄,泛化能力较弱
通过引入 松弛变量 采用 软间隔,可以解决这些问题
同时需要对 ε 进行限制,得出原始函数:
之后跟硬分隔一样的4步:
3.6.4 非线性SVM
升维手段将非线性转化为线性可解的数据。
但是可能导致维度爆炸,所以后期引入 核函数。
核函数
低维空间的运算 + 非线性变换 = 升维效果
这样既保证了运算速度,避免维度爆炸,也可进行线性处理。
3.6.5 总结
3.7 代码使用
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_lfw_people
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import PCA
from sklearn.svm import SVC
# 读取数据
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
n_sample, h, w = lfw_people.images.shape
X, y = lfw_people.data, lfw_people.target
n_features = X.shape[1]
target_names = lfw_people.target_names
n_classes = target_names.shape[0]
print('Total dataset size:')
print(f'n_samples: {n_sample}')
print(f'n_features: {n_features}')
print(f'n_classes: {n_classes}')
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
print(X_train.shape)
print(X_test.shape)
# PCA降维
n_components = 150
pca = PCA(n_components=n_components, svd_solver='randomized', whiten=True).fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
print(X_train_pca.shape)
print(X_test_pca.shape)
# 训练 选参
param_grid = {
'C': [1e3, 5e3, 1e4, 5e4, 1e5],
'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1]
}
clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid, cv=5)
clf = clf.fit(X_train_pca, y_train)
print(clf.best_estimator_)
3.8 SMO算法
之前提到了SMO算法,现在来看看SMO到底是何方神圣。
3.8.1 SMO思路
先前利用对偶函数得性质,最小化w,b,将原始问题化简成
现在要求解上述式子,得 α,总计 m 个变量需要处理,所以会有α1,α2,… αm作为待求解得参数。
SMO想要通过将 m 个参数二次规划得问题,化简成多个一次求解 2 个参数的子二次规划问题。
简单来说,分两步
- 选择一对需要更新的 α,使用启发式的方式进行选择,以使目标函数最大程度接近全局最优解(即 m 个 α不违背条件);
- 将目标函数对 此次的α进行优化,保持其他α不变。
3.8.2 第一步 视为一个二元函数
求解 2个为一组的 α(视为变量),固定其他α(视为常量),例如 α1 α2:
3.8.3 第二步 化为一元函数
有等式约束:
∑
i
=
1
N
α
i
y
i
=
0
\sum_{i=1}^N{\alpha _iy_i\,\,=\,\,0}
i=1∑Nαiyi=0
则单独剔除1和2,得:
α
1
y
1
+
α
2
y
2
=
−
∑
i
=
3
N
α
i
y
i
=
ζ
\alpha _1y_1\,\,+\,\,\alpha _2y_2\,\,=\,\,-\sum_{i=3}^N{\alpha _iy_i}\,\,=\,\,\zeta
α1y1+α2y2=−i=3∑Nαiyi=ζ
ζ 为定值,在等式两边同乘以y1,且知道y1是标签为 1 或 -1,则y² = 1,进而得:
α
1
=
(
ζ
−
α
2
y
2
)
y
1
(
2
)
\alpha _1\,\,=\,\,\left( \zeta \,\,-\,\,\alpha _2y_2 \right) y_1\,\, {\color{red} \left( 2 \right) }
α1=(ζ−α2y2)y1(2)
此时α1用α2表示了,带回二元函数的得一元函数:
3.8.4 第三步 一元函数求极值点
∂
Φ
(
α
2
)
∂
α
2
=
(
K
11
+
K
22
−
2
K
12
)
α
2
−
K
11
ζ
y
2
+
K
12
ζ
y
2
+
y
1
y
2
−
1
−
v
1
y
2
+
v
2
y
2
=
0
\frac{\partial \varPhi \left( \alpha _2 \right)}{\partial \alpha _2}\,\,=\,\,\left( K_{11}\,\,+\,\,K_{22}\,\,-\,\,2K_{12} \right) \alpha _2\,\,-\,\,K_{11}\zeta y_2\,\,+\,\,K_{12}\zeta y_2\,\,+\,\,y_1y_2\,\,-\,\,1 -\,\,v_1y_2\,\,+\,\,v_2y_2\,\,=\,\,0
∂α2∂Φ(α2)=(K11+K22−2K12)α2−K11ζy2+K12ζy2+y1y2−1−v1y2+v2y2=0
将上述得(4)(6)(7)代入求导公式,但由于之前未考虑不等式的约束条件,所以此时的α为未约束的版本,故化简得:
(
K
11
+
K
22
−
2
K
12
)
α
2
n
e
w
,
u
n
c
l
i
p
p
e
d
=
(
K
11
+
K
22
−
2
K
12
)
α
2
o
l
d
+
y
2
[
y
2
−
y
1
+
f
(
x
1
)
−
f
(
x
2
)
]
\left( K_{11}\,\,+\,\,K_{22}\,\,-\,\,2K_{12} \right) \alpha _{2}^{new,unclipped}\,\,=\,\,\left( K_{11}\,\,+\,\,K_{22}\,\,-\,\,2K_{12} \right) \alpha _{2}^{old}\,\,+\,\,y_2\left[ y_2\,\,-\,\,y_1\,\,+\,\,f\left( x_1 \right) \,\,-\,\,f\left( x_2 \right) \right]
(K11+K22−2K12)α2new,unclipped=(K11+K22−2K12)α2old+y2[y2−y1+f(x1)−f(x2)]
将(5)代入上式,并令η=k11+k22-2k12,得更新式:
α
2
n
e
w
,
u
n
c
l
i
p
p
e
d
=
α
2
o
l
d
+
y
2
(
E
1
−
E
2
)
η
(
8
)
\alpha _{2}^{new,unclipped}\,\,=\,\,\alpha _{2}^{old}\,\,+\,\,\frac{y_2\left( E_1\,\,-\,\,E_2 \right)}{\eta}\,\, {\color{red} \left( 8 \right) }
α2new,unclipped=α2old+ηy2(E1−E2)(8)
3.8.5 第四步 利用约束条件 修剪
两个条件给 α 一个边界:
L
⩽
α
i
n
e
w
⩽
H
L\,\,\leqslant \alpha _{i}^{new}\leqslant \,\,H
L⩽αinew⩽H
当
y
i
≠
y
j
,
{
L
i
=
max
(
0
,
a
i
o
l
d
−
a
j
o
l
d
)
H
i
=
min
(
C
,
C
+
a
i
o
l
d
−
a
j
o
l
d
)
\text{当} y_{i\,\,}\ne \,\,y_j,\begin{cases} L_i\,\,=\,\,\max \left( 0, a_{i}^{old}\,\,-\,\,a_{j}^{old} \right)\\ H_i\,\,=\,\,\min \left( C, C\,\,+\,\, a_{i}^{old}\,\,-\,\,a_{j}^{old} \right)\\ \end{cases}\,\,
当yi=yj,{Li=max(0,aiold−ajold)Hi=min(C,C+aiold−ajold)
当
y
i
=
y
j
,
{
L
i
=
max
(
0
,
a
i
o
l
d
+
a
j
o
l
d
−
C
)
H
i
=
min
(
C
,
C
+
a
i
o
l
d
+
a
j
o
l
d
)
\text{当} y_{i\,\,}=\,\,y_j,\begin{cases} L_i\,\,=\,\,\max \left( 0, a_{i}^{old}\,\,+\,\,a_{j}^{old}\,\,-\,\,C \right)\\ H_i\,\,=\,\,\min \left( C, C\,\,+\,\, a_{i}^{old}\,\,+\,\, a_{j}^{old} \right)\\ \end{cases}\,\,
当yi=yj,{Li=max(0,aiold+ajold−C)Hi=min(C,C+aiold+ajold)
则套用约束对之前的求解进行修剪:
α
i
n
e
w
=
{
H
,
α
i
n
e
w
,
u
n
c
l
i
p
p
e
d
>
H
α
i
n
e
w
,
u
n
c
l
i
p
p
e
d
,
L
⩽
α
i
n
e
w
,
u
n
c
l
i
p
p
e
d
⩽
H
L
,
α
2
n
e
w
,
u
n
c
l
i
p
p
e
d
<
L
\alpha _{i}^{new}\,\,=\,\,\begin{cases} H, \alpha _{i}^{new,unclipped}\,\,>\,\,H\\ \alpha _{i}^{new,unclipped}, L\,\,\leqslant \,\, \alpha _{i}^{new,unclipped}\,\,\leqslant \,\,H\\ L, \alpha _{2}^{new,unclipped}\,\,<\,\,L\\ \end{cases}
αinew=⎩
⎨
⎧H,αinew,unclipped>Hαinew,unclipped,L⩽αinew,unclipped⩽HL,α2new,unclipped<L
求解 αj
因为
3.8.6 启发式选择变量
3.8.7 阈值b的计算
完成两个变量的优化后,要对b的值进行更新,因为b的值关系到f(x)的计算,即关系到下次优化时的Ei的计算。
3.9 SVM算法小结