十分抱歉 , 由于最近学习繁忙以及私人的一点事情,博客都积灰了,在这里特别向支持我的老师同学们说声对不起:“Sorry~对唔住~!”
好啦,我们进入正题吧!我们今天来学习一个即BP神经网络之后的一个重量级算法 —— 支持向量机(Support Vector Machine).
支持向量机简介
支持向量机是一类解决二分问题的监督学习算法,其决策边界是求解最大化边距超平面(最大间隔分离超平面),即使得间隔最大化。又由于其包括各式各样的核技巧(Kernal method),故其为一种非线性分类器。
线性可分支持向量机
我们首先给定一个欧式空间或希尔伯特空间(存在内积)上有一训练集:
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}
T={(x1,y1),(x2,y2),...,(xn,yn)}
其中
x
i
∈
χ
∈
R
n
,
y
i
∈
γ
∈
{
−
1
,
+
1
}
x_i\in\chi\in\R^n,y_i\in\gamma\in\{-1,+1\}
xi∈χ∈Rn,yi∈γ∈{−1,+1},再次
x
i
x_i
xi是指第i个数据的特征向量。当
y
i
=
−
1
y_i=-1
yi=−1时,
x
i
x_i
xi为正例;反之为负例
确定好训练集了以后,我们来看一下分类模型:假定我们知道了某个超平面,其为:
ω
∗
⋅
x
+
b
∗
=
0
\omega^*·x+b^*=0
ω∗⋅x+b∗=0
其对应的决策函数为:
f
(
x
)
=
s
i
g
n
(
ω
∗
⋅
x
+
b
∗
)
f(x)=sign(\omega^*·x+b^*)
f(x)=sign(ω∗⋅x+b∗)
这样的模型,我们将其成为线性支持向量机。等等!且慢!这不就是感知机模型吗?!且慢!还真的不同!感知机模型是通过梯度下降法迭代得出最优的权值以及偏差,而支持向量机是通过求解最大分隔超平面来求解整个模型。下一节,我就跟大家娓娓道来。
函数间隔与几何间隔
函数间隔
我们作一个假设:假设平面中有三点:A,B,C,他们都归于同一类。如果A点离超平面最近,C点离超平面最远,B点介于两者之间。则A点确信度最高,因为离分离超平面最近,B点其次,C点最小,因为我们用距离来表示分类预测的确信程度。
在超平面确定的情况下,我们使用 ∣ ω ⋅ x + b ∣ |\omega·x+b| ∣ω⋅x+b∣来表示点与超平面的距离(请参考投影的概念),而我们再用 y i ( ω ⋅ x + b ) y_i(\omega·x+b) yi(ω⋅x+b)的正负号来表示其是否分类准确,即若 y i ( ω ⋅ x + b ) > 0 y_i(\omega·x+b)>0 yi(ω⋅x+b)>0,则分类正确,反之错误。
假如说我们有一个正例为 x x x,则其对应的 y = + 1 y=+1 y=+1,将点 x x x代入决策函数 ω ⋅ x + b \omega·x+b ω⋅x+b中,得其远大于0,则 y i ( ω ⋅ x + b ) > 0 y_i(\omega·x+b)>0 yi(ω⋅x+b)>0;若 x x x为负例,同理。
而我们令上述 y i ( ω ⋅ x + b ) y_i(\omega·x+b) yi(ω⋅x+b)为 γ i \gamma_i γi,即: γ i = y i ( ω ⋅ x + b ) \gamma_i=y_i(\omega·x+b) γi=yi(ω⋅x+b)我们将 γ i \gamma_i γi称之为函数间隔(functional margin)。
在这里,我们以最小的那个函数间隔为函数间隔即: γ ^ = m i n γ ^ i \hat{\gamma}=min\ \hat\gamma_i γ^=min γ^i因为这样可以更利于判断性能的好坏与否(最小的那个都离超平面很远了,何况其他的呢)。
几何间隔
但是我们如果成比例地改变
ω
\omega
ω和
b
b
b,如
3
ω
,
3
b
3\omega,3b
3ω,3b或
1
3
ω
,
1
3
b
\frac{1}{3}\omega,\frac{1}{3}b
31ω,31b,则超平面会随之改变,故我们需要对权值向量
ω
\omega
ω规范化,即加上些约束,比如令
∣
∣
ω
∣
∣
=
1
||\omega||=1
∣∣ω∣∣=1,则使间隔确定下来,即
γ
i
=
γ
^
i
∣
∣
ω
∣
∣
\gamma_i=\frac{\hat\gamma_i}{||\omega||}
γi=∣∣ω∣∣γ^i同理于函数间隔,我们使用最小的几何间隔代表所有的几何间隔,即
γ
=
m
i
n
γ
i
\gamma=min\ \gamma_i
γ=min γi
这时,我们将这个确定下来的间隔称之为几何间隔(geometric margin),即:
γ
i
=
−
y
i
(
ω
∣
∣
ω
∣
∣
⋅
x
+
b
∣
∣
ω
∣
∣
)
\gamma_i=-y_i(\frac{\omega}{||\omega||}·x+\frac{b}{||\omega||})
γi=−yi(∣∣ω∣∣ω⋅x+∣∣ω∣∣b)
为了达到最优化的分类结果,即训练出最优化的超平面,即使得几何间隔最大化(为了能够找到离两边最远的那个超平面)
几何间隔最大化
我们为了更好的去对样本点进行区分,我们需要找最大的几何间隔。换句话来说,便是能够找到离点最远的的超平面以更好地划分它。
在这里,我们可以把它看作是一个规划问题:最大化几何间隔
γ
\gamma
γ,约束条件为
y
i
(
ω
∣
∣
ω
∣
∣
⋅
x
i
+
b
∣
∣
ω
∣
∣
)
≥
γ
y_i(\frac{\omega}{||\omega||}·x_i+\frac{b}{||\omega||})\ge\gamma
yi(∣∣ω∣∣ω⋅xi+∣∣ω∣∣b)≥γ,以使样本点能关于每个间隔点的几何间隔至少为最小化的
γ
\gamma
γ,即
m
a
x
ω
,
b
γ
\mathop{max}\limits_{\omega,b}\ \gamma
ω,bmax γ
y
i
(
ω
∣
∣
ω
∣
∣
⋅
x
i
+
b
∣
∣
ω
∣
∣
)
≥
γ
y_i(\frac{\omega}{||\omega||}·x_i+\frac{b}{||\omega||})\ge\gamma
yi(∣∣ω∣∣ω⋅xi+∣∣ω∣∣b)≥γ
而由于
γ
=
γ
^
∣
∣
ω
∣
∣
\gamma=\frac{\hat\gamma}{||\omega||}
γ=∣∣ω∣∣γ^故可以将问题写成:
m
a
x
ω
,
b
γ
^
∣
∣
ω
∣
∣
\mathop{max}\limits_{\omega,b}\ \frac{\hat\gamma}{||\omega||}
ω,bmax ∣∣ω∣∣γ^
s
.
t
y
i
(
ω
⋅
x
+
b
)
≥
γ
^
s.t\ y_i(\omega·x+b)\geq\hat\gamma
s.t yi(ω⋅x+b)≥γ^
回到高数一所学的知识,最大化
1
∣
∣
ω
∣
∣
\frac{1}{||\omega||}
∣∣ω∣∣1将等价于最小化
1
2
∣
∣
ω
∣
∣
2
\frac{1}{2}||\omega||^2
21∣∣ω∣∣2,由此可得:
m
i
n
ω
,
b
1
2
∣
∣
ω
∣
∣
2
\mathop{min}\limits_{\omega,b}\ \frac{1}{2}||\omega||^2
ω,bmin 21∣∣ω∣∣2
s
.
t
.
y
i
(
ω
⋅
x
+
b
)
−
1
≥
0
s.t.\ y_i(\omega·x+b)-1\geq0
s.t. yi(ω⋅x+b)−1≥0
这就变成了一个凸二次规划问题,故我们求解支持向量机的最大间隔超平面可以使用构造拉格朗日函数的方法去解决这类问题,即通过求解对偶算法(其实还可以有其他办法,譬如梯度投影法,内点法,椭球法等)来求出最大间隔超平面。
我们求出来的最大间隔超平面具有唯一性以及存在性(存在最大间隔超平面),在这里,由于笔者才疏学浅,就不在这里给大家证明了。
拉格朗日函数法
我们构造拉格朗日函数的方法来求线性可分支持向量机的最优化问题可以更容易求解以及方便引入核函数,已推广到求解线性不可分的支持向量机问题。
我们首先构造一个拉格朗日函数,对于每一个不等式约束(看有多少个样本点)都需要引入一拉格朗日乘子(还可以在对拉格朗日乘子求和的结果前面乘以一个惩罚因子C以及引入松弛变量,这里我就不列出来了),即:
L
(
ω
,
b
,
α
)
=
1
2
∣
∣
ω
∣
∣
2
−
∑
i
=
1
N
α
i
y
i
(
ω
⋅
x
+
b
)
+
∑
i
=
1
N
α
i
L(\omega,b,\alpha)=\frac{1}{2}||\omega||^2-\sum_{i=1}^N\alpha_iy_i(\omega·x+b)+\sum_{i=1}^N\alpha_i
L(ω,b,α)=21∣∣ω∣∣2−i=1∑Nαiyi(ω⋅x+b)+i=1∑Nαi
根据拉格朗日对偶性(求最小化决策函数的的最大化问题),得:
m
a
x
α
m
i
n
ω
,
b
L
(
ω
,
b
,
α
)
\mathop{max}\limits_\alpha\mathop{min}\limits_{\omega,b}L(\omega,b,\alpha)
αmaxω,bminL(ω,b,α)所以我们为了得到对偶问题的解,故,我们先利用求偏导数的方法(高数二知识点)求解最小化的拉格朗日函数,再对
α
\alpha
α求最大
1)求解 m i n ω , b L ( ω , b , α ) \mathop{min}\limits_{\omega,b}L(\omega,b,\alpha) ω,bminL(ω,b,α):
我们将
L
(
ω
,
b
,
α
)
L(\omega,b,\alpha)
L(ω,b,α)对
ω
,
b
\omega,b
ω,b求偏导,得:
ω
−
∑
i
=
1
N
α
i
y
i
x
i
=
0
\omega-\sum_{i=1}^N\alpha_iy_ix_i=0
ω−i=1∑Nαiyixi=0
−
∑
i
=
1
N
α
i
y
i
=
0
-\sum_{i=1}^N\alpha_iy_i=0
−i=1∑Nαiyi=0从而得出:
ω
=
∑
i
=
1
N
α
i
y
i
x
i
\omega=\sum_{i=1}^N\alpha_iy_ix_i
ω=i=1∑Nαiyixi
∑
i
=
1
N
α
i
y
i
=
0
\sum_{i=1}^N\alpha_iy_i=0
i=1∑Nαiyi=0
将上述两式代入拉格朗日函数中得:
L
(
ω
,
b
,
α
)
=
−
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
+
∑
i
=
1
N
α
i
L(\omega,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i
L(ω,b,α)=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
既得到:
m
i
n
ω
,
b
L
(
ω
,
b
,
α
)
=
−
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
+
∑
i
=
1
N
α
i
\mathop{min}\limits_{\omega,b}\ L(\omega,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i
ω,bmin L(ω,b,α)=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
然后我们对α求最大,即:
m
a
x
α
L
(
ω
,
b
,
α
)
=
−
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
+
∑
i
=
1
N
α
i
\mathop{max}\limits_\alpha\ L(\omega,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i
αmax L(ω,b,α)=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
s
.
t
.
∑
i
=
1
N
α
i
y
i
=
0
s.t.\ \sum_{i=1}^N\alpha_iy_i=0
s.t. i=1∑Nαiyi=0
α
i
≥
0
,
i
=
1
,
2
,
3
,
.
.
.
,
N
\alpha_i\geq0,\ \ i=1,2,3,...,N
αi≥0, i=1,2,3,...,N
由运筹学知识得,求决策函数最大等于对其取负求最小:
m
i
n
α
L
(
ω
,
b
,
α
)
=
−
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
+
∑
i
=
1
N
α
i
\mathop{min}\limits_\alpha\ L(\omega,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum_{i=1}^N\alpha_i
αmin L(ω,b,α)=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
s
.
t
.
∑
i
=
1
N
α
i
y
i
=
0
s.t.\ \sum_{i=1}^N\alpha_iy_i=0
s.t. i=1∑Nαiyi=0
α
i
≥
0
,
i
=
1
,
2
,
3
,
.
.
.
,
N
\alpha_i\geq0,\ \ i=1,2,3,...,N
αi≥0, i=1,2,3,...,N
我们解这个对偶问题得到拉格朗日乘子所组成的向量
α
\alpha
α,当
α
i
>
0
\alpha_i>0
αi>0时,其所对应的样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)为支持向量(support vector),其对
ω
∗
,
b
∗
\omega^*,b^*
ω∗,b∗有影响,而非支持向量就不影响
ω
∗
,
b
∗
\omega^*,b^*
ω∗,b∗了。
线性不可分与核技巧
线性支持向量机顾名思义,就是解决线性可分的问题,其如下图所示:
而这种线性可分的问题在实际工程上并不多见,我们常见的是线性不可分的问题,例如:
故我们需要把样本变换至如右上所示之图,故我们引入核函数的概念。
核函数简单来说就是把低维的样本变换到高维样本点然后进行区分的一种映射;我们用
k
(
x
,
z
)
k(x,z)
k(x,z)来表示核函数,其为映射函数的内积,而核函数我们用
ϕ
(
x
)
\phi(x)
ϕ(x)来表示,一般使用高斯函数作为映射函数对其进行变换,其公式如下所示:
ϕ
(
r
)
=
e
(
−
ϵ
r
)
2
\phi(r)=e^{(-\epsilon r)^2}
ϕ(r)=e(−ϵr)2
其中,每一个样本代表的向量
x
i
x_i
xi离中心(对每个样本的分量求均值然后得出来的一个点)的距离为:
r
=
∣
∣
x
ˉ
−
x
i
∣
∣
r=||\bar x-x_i||
r=∣∣xˉ−xi∣∣
而
ϵ
\epsilon
ϵ的平方,在我们用sklearn去计算的时候,会用gamma来表示。
我们再将各个样本点的特征点(
x
i
x_i
xi,
x
j
x_j
xj)代入映射函数
ϕ
(
x
)
\phi(x)
ϕ(x)算出核函数
k
(
x
i
,
x
j
)
k(x_i,x_j)
k(xi,xj),再将核函数代入线性支持向量机的原始问题中,得:
m
i
n
ω
,
b
1
2
∣
∣
ω
∣
∣
2
\mathop{min}\limits_{\omega,b}\ \frac{1}{2}||\omega||^2
ω,bmin 21∣∣ω∣∣2
s
.
t
.
y
i
(
ω
⋅
ϕ
(
x
)
+
b
)
−
1
≥
0
s.t.\ y_i(\omega·\phi (x)+b)-1\geq0
s.t. yi(ω⋅ϕ(x)+b)−1≥0
则原始问题的对偶问题为:
m
i
n
α
L
(
ω
,
b
,
α
)
=
−
1
2
∑
i
=
1
N
∑
j
=
1
N
α
i
α
j
y
i
y
j
∗
k
(
x
i
⋅
x
j
)
+
∑
i
=
1
N
α
i
\mathop{min}\limits_\alpha\ L(\omega,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j*k(x_i·x_j)+\sum_{i=1}^N\alpha_i
αmin L(ω,b,α)=−21i=1∑Nj=1∑Nαiαjyiyj∗k(xi⋅xj)+i=1∑Nαi
s
.
t
.
∑
i
=
1
N
α
i
y
i
=
0
s.t.\ \sum_{i=1}^N\alpha_iy_i=0
s.t. i=1∑Nαiyi=0
α
i
≥
0
,
i
=
1
,
2
,
3
,
.
.
.
,
N
\alpha_i\geq0,\ \ i=1,2,3,...,N
αi≥0, i=1,2,3,...,N
而
k
(
x
i
,
y
i
)
=
ϕ
(
x
i
)
T
ϕ
(
x
j
)
k(x_i,y_i)=\phi (x_i)^T\phi(x_j)
k(xi,yi)=ϕ(xi)Tϕ(xj)
求解后可以得到决策函数
f
(
x
)
=
s
i
g
h
(
∑
i
=
1
N
α
i
y
i
k
(
x
,
x
i
)
+
b
)
f(x)=sigh(\sum_{i=1}^N \alpha_iy_i k(x,x_i)+b)
f(x)=sigh(i=1∑Nαiyik(x,xi)+b)
实例:乳腺癌的判别
数据集简介
有关乳腺癌的科普请看这里,笔者就不在这里介绍了:
百度百科:乳腺癌
维基百科:乳腺癌/乳癌
本次用到的乳腺癌数据集由美国康斯威星大学医院的研究人员所收集的数据集,该数据集的特征分别为:
1)半径(从中心到周边点的距离的平均值)
2)纹理(灰度值的标准偏差)
3)周边
4)面积
5)平滑度(半径长度的局部变化)
6)紧密度(周长^ 2 /面积-1.0)
7)凹度(轮廓的凹入部分的严重程度)
8)凹点(轮廓的凹入部分的数量)
9)对称性
10)分形维数(“海岸线近似”-1)
该数据集有正例(良性)458例,负例(恶性)241例。
数据集下载
这个数据集本身sklearn也自带,故在此,我将会直接在sklearn库中调用数据集。
代码
需要引入的库
import numpy as np
from sklearn.datasets import load_breast_cancer # 乳腺癌數據集
from sklearn.model_selection import train_test_split # 切分數據集
from sklearn.svm import SVC # 支持向量機(分類),其實還有回歸機(SVR)
from sklearn.model_selection import GridSearchCV # 網格搜索,用於調參
引入数据
# 加載數據
cancer_data = load_breast_cancer()
X = cancer_data.data
Y = cancer_data.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) # 劃分數據集,測試集佔比0.2
模型训练及调参
# 訓練數據及調參
gammas = np.linspace(0, 0.0001, 30) # 劃定要調試的範圍
para_grid = {'gamma': gammas} # 將所要搜索的梯度範圍向量存入字典
clf = GridSearchCV(SVC(), para_grid, cv=5, return_train_score=True) # SVC():初始化支持向量機模型,cv:定義交叉驗證的折數(k折驗證法)
model = clf.fit(X_train, Y_train) # 模型訓練
print("最優參數:{},對應score:{}".format(clf.best_params_, clf.best_score_)) # 將最優參數與驗證得分輸出
对测试集进行预测以及评估预测结果
# 輸出數據
prediction = clf.predict(X_test) # 對測試集進行預測
print(prediction[0:20]) # 打印前20個預測結果
# 檢驗誤差
error_num = 0
for i in range(len(prediction)):
if prediction[i] != Y_test[i]:
error_num = error_num + 1
error_rate = error_num / len(prediction)
print("預測錯誤的樣本數為:{},錯誤率為:{:.4f}".format(error_num, error_rate))
计算结果
最優參數:{'gamma': 4.482758620689656e-05},對應score:0.9340659340659341
[1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1]
預測錯誤的樣本數為:8,錯誤率為:0.0702