赞
踩
SVM一般是用来分类的(一般先分为两类,再向多类推广)
自变量可以数值型和标称型数据
因变量是二分类,通过改造也可以是多分类;
通过核函数,可解决非线性问题
优点:泛化错误率低,计算开销不大,结果易解释;
在预测时因为只需考虑支持向量,而不需要考虑全部数据点,理论上较逻辑回归等算法会快很多;
对于靠近超平面的噪声敏感
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题;
支持向量机基本上是最好的有监督学习算法了。很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的。这里以斯坦福提供的学习材料为基础。这份材料从前几节讲的logistic回归出发,引出了SVM,既揭示了模型间的联系,也让人觉得过渡更自然。
Logistic回归目的是从特征学习出一个0/1分类模型,通过使用logistic函数(或称作sigmoid函数)将因变量的取值范围从线性回归的
(
−
∞
,
+
∞
)
(-\infty,+\infty)
(−∞,+∞)映射到(0,1)上,映射后的值可以认为是属于
y
=
1
y=1
y=1的概率。
形式化表示就是函数
h
w
(
x
)
=
g
(
w
T
x
)
=
1
1
+
e
−
w
T
x
h_{w}(x)=g(w^Tx)=\frac{1}{1+e^{-w^Tx}}
hw(x)=g(wTx)=1+e−wTx1
其中
w
w
w是权重向量,x是样本的n维特征,两者均为列向量,函数g是sigmoid函数。
P
(
y
=
1
∣
x
,
w
)
=
h
w
(
x
)
P
(
y
=
0
∣
x
,
w
)
=
1
−
h
w
(
x
)
P(y=1|x,w)=h_w(x)\\ P(y=0|x,w)=1-h_w(x)\\
P(y=1∣x,w)=hw(x)P(y=0∣x,w)=1−hw(x)
通过学习,我们可以得到对全体样本最佳拟合的系数
w
=
[
w
0
w
1
.
.
.
w
p
]
w=\left[
当我们要判别一个新来的样本属于哪个类时,只需求
h
w
(
x
)
h_w(x)
hw(x),若
h
w
(
x
)
h_w(x)
hw(x)大于0.5就是y=1的类,反之属于y=0类。
再审视一下
h
w
(
x
)
h_w(x)
hw(x),发现只和
w
T
x
w^Tx
wTx有关,
w
T
x
w^Tx
wTx >0,那么
h
w
(
x
)
>
0
h_w(x)>0
hw(x)>0,g(z)只不过是用来映射,真实的类别决定权还在
w
T
x
w^Tx
wTx。还有当
w
T
x
>
>
0
w^Tx>>0
wTx>>0时,
h
w
(
x
)
=
1
h_w(x)=1
hw(x)=1;当
w
T
x
<
<
0
w^Tx<<0
wTx<<0反之
h
w
(
x
)
=
0
h_w(x)=0
hw(x)=0。如果我们只从
w
T
x
w^Tx
wTx出发,希望模型达到的目标无非就是让训练数据中y=1的样本
w
T
x
>
>
0
w^Tx>>0
wTx>>0,而且y=0的特征
w
T
x
<
<
0
w^Tx<<0
wTx<<0。Logistic回归就是要学习得到,使得正例的
w
T
x
w^Tx
wTx远大于0,负例的
w
T
x
w^Tx
wTx远小于0,强调在全部训练实例上达到这个目标。
图形化表示如下:
中间那条线是
w
T
x
=
0
w^Tx=0
wTx=0,logistic回顾强调所有点尽可能地远离中间那条线。学习出的结果也就中间那条线。考虑上面3个点A、B和C。从图中我们可以确定A是×类别的,B还算能够确定,然而C我们是不太确定的。这样我们可以得出结论,我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不用在所有点上达到最优。因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。比如在谋求全局最优的时候,为了让A点这样的数据更靠近中间线,可能会使得一部分像C这样的数据点做出牺牲,这些数据点可能被分在对方那一侧去了,这是没必要的。我想这就是支持向量机的思路和logistic回归的不同点,一个考虑局部(不关心已经确定远离的点),一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)。这是我的个人直观理解。
我们这次使用的结果标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。再明确下假设函数
h
w
,
b
=
g
(
w
T
x
+
b
)
h_{w,b}=g(w^Tx+b)
hw,b=g(wTx+b)
这里将参数的常数量单独拿出来了,用b表示,与逻辑回归是一个意思。
上一节提到过我们只需考虑的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:
g
(
z
)
=
{
1
,
z
≥
0
−
1
,
z
<
0
g(z)= \left\{
函数间隔
给定一个训练样本,x是特征,y是结果标签,i表示第i个样本。我们定义函数间隔如下:
γ
^
i
=
y
i
(
w
T
x
i
+
b
)
\hat{\gamma}_i=y_i(w^Tx_i+b)
γ^i=yi(wTxi+b)
当
y
i
=
1
y_i=1
yi=1时,
w
T
x
i
+
b
≥
0
w^Tx_i+b\geq 0
wTxi+b≥0;当
y
i
=
−
1
y_i=-1
yi=−1时,
w
T
x
i
+
b
<
0
w^Tx_i+b<0
wTxi+b<0;
γ
^
i
\hat{\gamma}_i
γ^i的值实际上就是
∣
∣
w
T
x
i
+
b
∣
∣
||w^Tx_i+b||
∣∣wTxi+b∣∣,
∣
∣
w
T
x
i
+
b
∣
∣
||w^Tx_i+b||
∣∣wTxi+b∣∣越大,我们更有信心确定是正例还是负例。因此函数间隔代表了我们认为样本是正例还是负例的确信度。
继续考虑w和b,如果同时加大w和b,比如在前面乘个系数比如2,那么所有点的函数间隔都会增大二倍,这个对求解问题来说没有影响,因为我们要求解的是
W
T
x
+
b
=
0
W^Tx+b=0
WTx+b=0,同时扩大w和b对结果是无影响的。在判断样本类别,作定性分析的时候,也没有影响;但想定量分析某一类别概率的时候,这种概率应该是固定,也就判断的尺度本身不应该可变。我们可以对系数进行归一化,归一化的函数间隔其实就是几何间隔。
几何间隔
当然我们也可以一开始就从几何间隔出发。
在初中的几何中,我们知道点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)到直线
A
x
+
B
y
+
C
=
0
Ax+By+C=0
Ax+By+C=0的距离公式为
r
=
∣
∣
A
x
0
+
B
y
0
+
C
∣
∣
A
2
+
B
2
r=\frac{||Ax_0+By_0+C||}{\sqrt{A^2+B^2}}
r=A2+B2
∣∣Ax0+By0+C∣∣
对应到我们的情况:
此时
w
w
w就相当于A,而B=0,C相当于b。
因而样本点到分界面的几何间隔可如下表示和计算
γ
i
=
∣
∣
w
T
x
i
+
b
∣
∣
(
w
T
)
2
=
\gamma_i=\frac{||w^Tx_i+b||}{\sqrt{(w^T)^2}}=
γi=(wT)2
∣∣wTxi+b∣∣=
考虑到
y
i
y_i
yi与
w
T
x
i
+
b
w^Tx_i+b
wTxi+b正负取值的一致,可以将上式改写为
γ
i
=
y
i
(
w
T
x
i
+
b
)
∣
∣
w
∣
∣
\gamma_i=y_i\frac{(w^Tx_i+b)}{||w||}
γi=yi∣∣w∣∣(wTxi+b)
再回过来看,当时||w||=1时,不就是函数间隔吗?是的,前面提到的函数间隔归一化结果就是几何间隔。
全局的几何间隔
定义如下:
γ
=
m
i
n
i
=
1
,
2
,
…
,
m
γ
i
\gamma=min_{i=1,2,\dots,m} ~\gamma_i
γ=mini=1,2,…,m γi
回想前面我们提到我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。形象的说,我们将上面的图看作是一张纸,我们要找一条折线,按照这条折线折叠后,离折线最近的点的间距比其他折线都要大。形式化表示为:
m
a
x
w
,
b
γ
s
.
t
.
y
i
(
w
T
x
i
+
b
)
∣
∣
w
∣
∣
≥
γ
,
i
=
0
,
1
,
…
,
m
max_{w,b} ~\gamma\\ s.t. ~y_i\frac{(w^Tx_i+b)}{||w||} \geq \gamma ,i=0,1,\dots,m
maxw,b γs.t. yi∣∣w∣∣(wTxi+b)≥γ,i=0,1,…,m
上面的目标函数归纳起来就是求取w和b使得离分类超平面最近的点到分类超平面的几何距离最大,而其他点到分类超平面的几何距离比这个值都大。
到此,我们已经将模型定义出来了。如果求得了w和b,那么来一个样本特征x,代入到
W
T
x
+
b
W^Tx+b
WTx+b,我们就能够分类了,满足上述目标函数的分类器称为最优间隔分类器。接下的问题就是如何求解w和b的问题了。
离超平面最近的点即所谓的支持向量。如上图中圆圈所中的点。
注意,函数间隔的尺度缩放并不会影响几何间隔的大小,我们不防把离超平面最近点的函数间隔设为1,此时离超平台最近点的几何间隔为
1
∣
∣
w
∣
∣
\frac{1}{||w||}
∣∣w∣∣1。我们的目标就变成了求一组参数使得
1
∣
∣
w
∣
∣
\frac{1}{||w||}
∣∣w∣∣1尽可能大,且其它样本点到超平面的距离都大于等于这个距离。而
1
∣
∣
w
∣
∣
\frac{1}{||w||}
∣∣w∣∣1尽可能大,也就是
∣
∣
w
∣
∣
2
2
\frac{||w||^2}{2}
2∣∣w∣∣2尽可能小;其它样本点到超平面的距离都大于等于这个距离,这与其它样本点到超平面的函数距离都大于等于1是等价的。
因而整个目标函数就变成
m
i
n
w
,
b
∣
∣
w
2
∣
∣
2
s
.
t
y
i
(
w
T
x
i
+
b
)
≥
1
min_{w,b} ~ \frac{||w^2||}{2}\\ s.t ~~~ y_i(w^Tx_i+b)\geq 1
minw,b 2∣∣w2∣∣s.t yi(wTxi+b)≥1
这下好了,只有线性约束了,而且是个典型的二次规划问题(目标函数是自变量的二次函数)。代入优化软件可解。
接下来介绍的是手工求解的方法了,一种更优的求解方法。
最优间隔器的目标函数为:
m
i
n
w
,
b
∣
∣
w
∣
∣
2
2
s
.
t
.
1
−
y
i
(
w
T
x
i
+
b
)
≤
0
min_{w,b} ~ \frac{||w||^2}{2}\\ s.t. ~~~ 1-y_i(w^Tx_i+b)\leq 0\\
minw,b 2∣∣w∣∣2s.t. 1−yi(wTxi+b)≤0
这是一个不等式约束条件下的极值求解问题。先构造广义拉格朗日函数
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
+
∑
i
=
1
m
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
L(w,b,\alpha)=\frac{1}{2} ||w||^2+\sum_{i=1}^m \alpha_i (1-y_i(w^Tx_i+b))
L(w,b,α)=21∣∣w∣∣2+i=1∑mαi(1−yi(wTxi+b))
套用KKT条件的结论,上式中如下位置取到极值
∂
L
(
w
,
b
,
α
)
∂
w
=
0
−
−
−
−
−
(
1
)
∂
L
(
w
,
b
,
α
)
∂
b
=
0
−
−
−
−
−
(
2
)
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
=
0
−
−
−
−
−
(
3
)
α
i
≥
0
−
−
−
−
−
(
4
)
1
−
y
i
(
w
T
x
i
+
b
)
≤
0
−
−
−
−
−
(
5
)
\frac{\partial L(w,b,\alpha)}{\partial w}=0-----(1)\\ \frac{\partial L(w,b,\alpha)}{\partial b}=0-----(2)\\ \alpha_i (1-y_i(w^Tx_i+b))=0-----(3)\\ \alpha_i\geq 0-----(4)\\ 1-y_i(w^Tx_i+b)\leq 0-----(5)\\
∂w∂L(w,b,α)=0−−−−−(1)∂b∂L(w,b,α)=0−−−−−(2)αi(1−yi(wTxi+b))=0−−−−−(3)αi≥0−−−−−(4)1−yi(wTxi+b)≤0−−−−−(5)
在展开进一步计算前我们先理清一些关系,对于任意一个样本点,只有其是支持向量的时候才有
1
−
y
i
(
w
T
x
i
+
b
)
=
0
1-y_i(w^Tx_i+b)=0
1−yi(wTxi+b)=0,而其它样本点
1
−
y
i
(
w
T
x
i
+
b
)
<
0
1-y_i(w^Tx_i+b)<0
1−yi(wTxi+b)<0,代入(3)式中,我们可以得到结论,只有在支持向量处
α
i
≠
0
\alpha_i\neq 0
αi̸=0而其他位置
α
i
=
0
\alpha_i = 0
αi=0。
下面就(1)(2)两式展开计算。
∂
L
(
w
,
b
,
α
)
∂
w
=
w
+
∑
i
=
1
m
α
i
(
−
y
i
x
i
)
=
0
∑
i
=
1
m
α
i
y
i
=
0
\frac{\partial L(w,b,\alpha)}{\partial w}=w+\sum_{i=1}^m \alpha_i(-y_ix_i)=0\\ \sum_{i=1}^m\alpha_i y_i=0
∂w∂L(w,b,α)=w+i=1∑mαi(−yixi)=0i=1∑mαiyi=0
即
w
=
∑
i
=
1
m
α
i
y
i
x
i
∑
i
=
1
m
α
i
y
i
=
0
w=\sum_{i=1}^m \alpha_iy_ix_i\\ \sum_{i=1}^m\alpha_i y_i=0
w=i=1∑mαiyixii=1∑mαiyi=0
将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
+
∑
i
=
1
m
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
L(w,b,\alpha)=\frac{1}{2} ||w||^2+\sum_{i=1}^m \alpha_i (1-y_i(w^Tx_i+b))
L(w,b,α)=21∣∣w∣∣2+i=1∑mαi(1−yi(wTxi+b))
目标函数进一步化简为:
L
(
w
,
b
,
α
)
=
1
2
(
∑
i
=
1
m
α
i
y
i
x
i
)
T
∑
i
=
1
m
α
i
y
i
x
i
+
∑
i
=
1
m
α
i
−
∑
i
=
1
m
α
i
y
i
(
∑
i
=
1
m
α
i
y
i
x
i
)
T
x
i
−
∑
i
=
1
m
α
i
y
i
b
=
1
2
∑
i
=
1
m
α
i
y
i
(
x
i
)
T
∑
i
=
1
m
α
i
y
i
x
i
+
∑
i
=
1
m
α
i
−
∑
i
=
1
m
α
i
y
i
(
x
i
)
T
∑
i
=
1
m
α
i
y
i
x
i
=
−
1
2
∑
i
=
1
m
α
i
y
i
(
x
i
)
T
∑
i
=
1
m
α
i
y
i
x
i
+
∑
i
=
1
m
α
i
=
−
1
2
∑
i
=
1
m
α
i
y
i
(
x
i
)
T
∑
j
=
1
m
α
j
y
j
x
j
+
∑
i
=
1
m
α
i
=
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
y
i
(
x
i
)
T
α
j
y
j
x
j
+
∑
i
=
1
m
α
i
=
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
(
x
i
)
T
x
j
+
∑
i
=
1
m
α
i
上式中
(
x
i
)
T
x
j
(x_i)^T x_j
(xi)Txj就是两个向量内向积的计算公式,可以表示成
<
x
i
,
x
j
>
<x_i,x_j>
<xi,xj>
至此,目标函数及其约束可以表示成下面的形式
L
(
w
,
b
,
α
)
=
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
<
x
i
,
x
j
>
+
∑
i
=
1
m
α
i
−
−
−
−
−
(
6
)
w
=
∑
i
=
1
m
α
i
y
i
x
i
−
−
−
−
−
(
7
)
∑
i
=
1
m
α
i
y
i
=
0
−
−
−
−
−
(
8
)
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
=
0
−
−
−
−
−
(
9
)
α
i
≥
0
−
−
−
−
−
(
10
)
1
−
y
i
(
w
T
x
i
+
b
)
≤
0
−
−
−
−
−
(
11
)
L(w,b,\alpha) =-\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j<x_i,x_j>+\sum_{i=1}^m \alpha_i-----(6)\\ w=\sum_{i=1}^m \alpha_iy_ix_i-----(7)\\ \sum_{i=1}^m\alpha_i y_i=0-----(8)\\ \alpha_i (1-y_i(w^Tx_i+b))=0-----(9)\\ \alpha_i\geq 0-----(10)\\ 1-y_i(w^Tx_i+b)\leq 0-----(11)\\
L(w,b,α)=−21i=1∑mj=1∑mαiαjyiyj<xi,xj>+i=1∑mαi−−−−−(6)w=i=1∑mαiyixi−−−−−(7)i=1∑mαiyi=0−−−−−(8)αi(1−yi(wTxi+b))=0−−−−−(9)αi≥0−−−−−(10)1−yi(wTxi+b)≤0−−−−−(11)
如果求得极值点的
α
i
∗
\alpha_i^*
αi∗,那么极值点的
w
∗
w^*
w∗可由公式(7)计算得到。极值点处的
b
∗
b^*
b∗可由支持向量给出。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
(
w
∗
)
T
x
(
∗
i
)
+
b
∗
=
1
,
x
(
∗
i
)
为
正
方
向
的
支
持
向
量
(
w
∗
)
T
x
(
∗
j
)
+
b
∗
=
−
1
,
x
(
∗
j
)
为
负
方
向
的
支
持
向
量
(w^*)^Tx^{(*i)}+b^*=1,x^{(*i)}为正方向的支持向量\\ (w^*)^Tx^{(*j)}+b^*=-1,x^{(*j)}为负方向的支持向量\\
(w∗)Tx(∗i)+b∗=1,x(∗i)为正方向的支持向量(w∗)Tx(∗j)+b∗=−1,x(∗j)为负方向的支持向量
从而$b*=-\frac{(w*)Tx{(*i)}+(w*)Tx^{(*j)}}{2} $
但其实关于样本的类别判断,我们都不需要这么麻烦的去计算
w
∗
w^*
w∗和
b
∗
b^*
b∗。
先看看
w
T
x
i
+
b
w^Tx_i+b
wTxi+b,这是我们对样本进行类别判断的标准。
w
T
x
+
b
=
(
∑
i
=
1
m
α
i
y
i
x
i
)
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
(
x
i
)
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
<
x
i
,
x
>
+
b
也就是说,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于0还是小于0,来判断正例还是负例。现在有了
α
i
α_i
αi,我们不需要求出
w
w
w,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的
α
i
>
0
α_i>0
αi>0,其他情况
α
i
=
0
α_i=0
αi=0。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。
考虑我们最初在“线性回归”中提出的问题,特征是房子的面积x,这里的x是实数,结果y是房子的价格。假设我们**从样本点的分布中(因而如何选核函数的时候这就是一种方法,对样本抽样,查看其分布)**看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维
(
x
,
x
2
,
x
3
)
(x,x^2,x^3 )
(x,x2,x3),然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。映射函数称作
ϕ
\phi
ϕ,在这个例子中
ϕ
(
x
)
=
[
x
x
2
x
3
]
\phi(x)= \left[
我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。这样,我们需要将前面
w
T
x
+
b
w^T x+b
wTx+b公式中的内积从
〈
x
i
,
x
〉
〈x_i,x〉
〈xi,x〉,映射到
〈
ϕ
(
x
i
)
,
ϕ
(
x
)
〉
〈\phi(x_i),\phi(x)〉
〈ϕ(xi),ϕ(x)〉。
至于为什么需要映射后的特征而不是最初的特征来参与计算,上面提到的(为了更好地拟合)是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。(在《数据挖掘导论》Pang-Ning Tan等人著的《支持向量机》那一章有个很好的例子说明)
上图所示的数据,如果用线性分类器来分类,没有办法作区分。
但如果通过下面的映射
z
1
=
x
1
2
z
2
=
x
2
2
z
3
=
x
2
z_1=x_1^2\\ z_2=x_2^2\\ z_3=x_2\\
z1=x12z2=x22z3=x2
映射后的图像如下:
我们可以看到,在高维空间就可分了。
我们作映射的原因:
将数据映射到高维空间后,我们就可以使用与之前一样的方法来迭代拟合相应的
α
i
α_i
αi和b,不同的是特征变量数目会比原空间多很多,但整个优化过程中是没有任何区别的。
将核函数形式化定义
如果原始特征内积是
〈
x
,
z
〉
〈x,z〉
〈x,z〉,映射后为
〈
φ
(
x
)
,
φ
(
z
)
〉
〈φ(x),φ(z)〉
〈φ(x),φ(z)〉,那么定义
核函数(Kernel)为
K
(
x
,
z
)
=
ϕ
(
x
)
T
ϕ
(
z
)
K(x,z)=\phi(x)^T \phi(z)
K(x,z)=ϕ(x)Tϕ(z)
即把计算两个向量在隐式映射后的空间内内积的函数做作核函数。
到这里,我们可以得出结论,如果要实现该节开头的效果,只需先计算
ϕ
(
x
)
\phi(x)
ϕ(x),然后计算
ϕ
(
x
)
T
ϕ
(
z
)
\phi(x)^T \phi(z)
ϕ(x)Tϕ(z)即可,然而这种计算方式是非常低效的。
**问题:**虽然上面的方式原理上可解,但是因为多了列,假如
φ
(
x
)
φ(x)
φ(x)的列是$x
3
倍
,
那
么
内
积
的
数
目
将
是
原
来
的
9
倍
。
如
何
是
用
高
斯
函
数
或
多
项
式
项
目
的
时
候
,
就
会
存
在
维
数
灾
难
。
比
如
最
初
的
特
征
是
3倍,那么内积的数目将是原来的9倍。如何是用高斯函数或多项式项目的时候,就会存在维数灾难。比如最初的特征是
3倍,那么内积的数目将是原来的9倍。如何是用高斯函数或多项式项目的时候,就会存在维数灾难。比如最初的特征是n
维
的
,
我
们
将
其
映
射
到
维的,我们将其映射到
维的,我们将其映射到n2$维,然后再计算,这样需要$O(n2)$的时间。那么我们能不能想办法减少计算时间呢?
先看一个例子,假设x和z都是n维的,,其核函数表示如下:
K
(
x
,
z
)
=
(
x
T
z
)
2
K(x,z)=(x^T z)^2
K(x,z)=(xTz)2
**当我们看到核函数后就知道要怎么计算映射后的内积:将原始空间的内积经过一定变换后得到。但根据核函数的不同,可能有的是在原始空间的内积上运算,有的是直接将样本代入核函数,此时可能就看不到内积的运算。**现在我们来看看这种变换的结果是不是映射后空间的内积。
将上面的核函数展开
K
(
x
,
z
)
=
(
x
T
z
)
2
=
(
∑
i
=
1
n
x
i
z
i
)
(
∑
j
=
1
n
x
j
z
j
)
=
∑
i
=
1
n
∑
j
=
1
n
x
i
z
i
x
j
z
j
=
∑
i
=
1
n
∑
j
=
1
n
(
x
i
x
j
)
(
z
i
z
j
)
=
ϕ
(
x
)
T
ϕ
(
z
)
这个时候发现我们可以只计算原始特征x和z内积的平方(时间复杂度是O(n)),就等价于计算映射后特征的内积。也就是说我们不需要花
O
(
n
2
)
O(n^2)
O(n2)时间了(上面的转换过程还是看不懂,那是因为我们不知道原始空间如何映射的,下面由核函数反推映射函数)。
现在看一下映射函数(n=3时),根据上面的公式,得到
φ
(
x
)
=
[
x
1
x
1
x
1
x
2
x
1
x
3
x
2
x
1
x
2
x
2
x
2
x
3
x
3
x
1
x
3
x
2
x
3
x
3
]
φ(x)= \left[
也就是说核函数
K
(
x
,
z
)
=
(
x
T
z
)
2
K(x,z)=(x^T z)^2
K(x,z)=(xTz)2只能在选择这样的
ϕ
\phi
ϕ作为映射函数时才能够等价于映射后特征的内积。
再看一个核函数
K
(
x
,
z
)
=
(
x
T
z
+
c
)
2
=
∑
i
=
1
n
∑
j
=
1
n
[
(
x
i
x
j
)
(
z
i
z
j
)
]
+
∑
i
=
1
n
[
(
2
c
x
i
)
2
c
z
i
)
]
+
c
2
K(x,z)=(x^T z+c)^2=∑_{i=1}^n∑_{j=1}^n[(x_i x_j)(z_i z_j)]+∑_{i=1}^n[(\sqrt{2c}x_i)\sqrt{2c}z_i)]+c^2
K(x,z)=(xTz+c)2=i=1∑nj=1∑n[(xixj)(zizj)]+i=1∑n[(2c
xi)2c
zi)]+c2
对应的映射函数(n=3时)是
ϕ
(
x
)
=
[
x
1
x
1
x
1
x
2
x
1
x
3
x
2
x
1
x
2
x
2
x
2
x
3
x
3
x
1
x
3
x
2
x
3
x
3
2
c
x
1
2
c
x
2
2
c
x
3
c
]
\phi(x)= \left[
更一般地,多项式核函数
K
(
x
,
z
)
=
(
x
T
z
+
c
)
d
K(x,z)=(x^T z+c)^d
K(x,z)=(xTz+c)d对应的映射后特征维度为
(
n
+
d
d
)
\left(
由于计算的是内积,我们可以想到IR中的余弦相似度,如果x和z向量夹角越小,那么核函数值越大,反之,越小。因此,核函数值是
ϕ
(
x
)
\phi(x)
ϕ(x)和
ϕ
(
z
)
\phi(z)
ϕ(z)的相似度。
再看另外一个核函数–高斯径向核
K
(
x
,
z
)
=
e
x
p
(
−
‖
x
−
z
‖
2
2
σ
2
)
K(x,z)=exp \left(-\frac{‖x-z‖^2}{2σ^2} \right)
K(x,z)=exp(−2σ2‖x−z‖2)
这时,如果x和z很相近
(
‖
x
−
z
‖
≈
0
)
(‖x-z‖≈0)
(‖x−z‖≈0),那么核函数值为1,如果x和z相差很大
(
‖
x
−
z
‖
≫
0
)
(‖x-z‖≫0)
(‖x−z‖≫0),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。
既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。
下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。
注意,使用核函数后,怎么分类新来的样本呢?
回想我们之前说过的
w
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
<
x
i
,
x
>
+
b
现在只需将
〈
x
i
,
x
〉
〈x_i,x〉
〈xi,x〉替换成
K
(
x
i
,
x
)
K(x_i,x)
K(xi,x),
〈
x
i
,
x
〉
〈x_i,x〉
〈xi,x〉是在原始空间上算内积,
K
(
x
i
,
x
)
K(x_i,x)
K(xi,x),
〈
x
i
,
x
〉
〈x_i,x〉
〈xi,x〉是将原始空间的样本代入到核函数计算。然后值的判断同上。
请查阅原文
要构造出一个具有良好性能的SVM,核函数的选择是关键也是最重要的一步.通常来讲核函数的选择包括两部分工作:一是核函数类型的选择,二是确定核函数类型后相关参数的选择。如何根据具体的数据选择恰当的核函数是SVM应用领域遇到的一个重大难题,也成为科研工作者所关注的焦点,但是目前还没有具体的理论或方法来指导核函数的选取。
核函数的定义并不困难,根据泛函的有关理论,只要一种函数
K
(
x
i
,
x
j
)
K(x_i,x_j)
K(xi,xj)满足Mercer条件,它就对应某一变换空间的内积。对于判断哪些函数是核函数到目前为止也取得了重要的突破,得到Mercer定理和以下常用的核函数类型:
线性核
线性内核是最简单的内核函数。 它由内积
<
x
,
y
>
<x,y>
<x,y>加上可选的常数c给出。 使用线性内核的内核算法通常等于它们的非内核对应物,即具有线性内核的KPCA与标准PCA相同。
表达式 :
k
(
x
,
y
)
=
x
T
y
+
c
k(x,y)=x^Ty+c
k(x,y)=xTy+c
线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。
**多项式核函数 **
多项式核是非固定内核。 多项式内核非常适合于所有训练数据都归一化的问题。我记得一般都会把问题归一化吧?
表达式:
k
(
x
,
y
)
=
(
α
x
T
y
+
c
)
d
,
d
>
0
k(x,y)=(αx ^ T y + c)^ d,d>0
k(x,y)=(αxTy+c)d,d>0
可调参数是斜率
α
α
α,常数项
c
c
c和多项式度
d
d
d。
多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
**高斯核 **
高斯核是径向基函数核的一个例子。
k
(
x
,
y
)
=
e
x
p
(
−
∣
∣
x
−
y
∣
∣
2
2
σ
2
)
,
σ
>
0
k(x,y)=exp(-\frac{||x-y||^2}{2\sigma^2}),\sigma>0
k(x,y)=exp(−2σ2∣∣x−y∣∣2),σ>0
或者,它也可以使用来实现
k
(
x
,
y
)
=
e
x
p
(
−
γ
∣
∣
x
−
y
∣
∣
2
)
k(x,y)=exp(-\gamma||x-y||^2)
k(x,y)=exp(−γ∣∣x−y∣∣2)
可调参数
σ
>
0
\sigma>0
σ>0在内核的性能中起着主要作用,并且应该仔细地调整到手头的问题。 如果过高估计,指数将几乎呈线性,高维投影将开始失去其非线性功率。 另一方面,如果低估,该函数将缺乏正则化,并且决策边界将对训练数据中的噪声高度敏感。
Gauss径向基函数则是局部性强的核函数,其外推能力随着参数
σ
\sigma
σ的增大而减弱。多项式形式的核函数具有良好的全局性质,但局部性较差。
指数的内核
指数核与高斯核密切相关,只有正态的平方被忽略。 它也是一个径向基函数内核。
表达式:
k
(
x
,
y
)
=
e
x
p
(
−
∣
∣
x
−
y
∣
∣
2
σ
2
)
,
σ
>
0
k(x,y)=exp(-\frac{||x-y||}{2\sigma^2}),\sigma>0
k(x,y)=exp(−2σ2∣∣x−y∣∣),σ>0
拉普拉斯算子核
拉普拉斯核心完全等同于指数内核,除了对
σ
\sigma
σ参数的变化不那么敏感。 作为等价的,它也是一个径向基函数内核。
表达式:
k
(
x
,
y
)
=
e
x
p
(
−
∣
∣
x
−
y
∣
∣
σ
)
,
σ
>
0
k(x,y)=exp(-\frac{||x-y||}{\sigma}),\sigma>0
k(x,y)=exp(−σ∣∣x−y∣∣),σ>0
重要的是注意,关于高斯内核的σ参数的观察也适用于指数和拉普拉斯内核。
Sigmoid核(sigmoid):
表达式:
k
(
x
,
y
)
=
t
a
n
h
(
β
x
T
y
+
θ
)
,
β
>
0
k(x,y)=tanh(\beta x^Ty+\theta),\beta>0
k(x,y)=tanh(βxTy+θ),β>0
采用Sigmoid函数作为核函数时,支持向量机实现的就是一种多层感知器神经网络,应用SVM方法,隐含层节点数目(它确定神经网络的结构)、隐含层节点对输入节点的权值都是在设计(训练)的过程中自动确定的。而且支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部最小值,也保证了它对于未知样本的良好泛化能力而不会出现过学习现象。
傅里叶核
表达式:
k
(
x
,
y
)
=
1
−
q
2
2
(
1
−
2
q
c
o
s
(
x
−
y
)
−
q
2
)
k(x,y)=\frac{1-q^2}{2(1-2q~cos(x-y)-q^2)}
k(x,y)=2(1−2q cos(x−y)−q2)1−q2
样条核
表达式:
k
(
x
,
y
)
=
B
2
n
+
1
(
x
−
y
)
k(x,y)=B_{2n+1}(x-y)
k(x,y)=B2n+1(x−y)
在选取核函数解决实际问题时,通常采用的方法有:
经验一:
1). Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
2). RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。我个人的体会是:使用libsvm,默认参数,RBF核比Linear核效果稍差。通过进行大量参数的尝试,一般能找到比linear核更好的效果。
应用最广的应该就是RBF核了,无论是小样本还是大样本,高维还是低维等情况,RBF核函数均适用,它相比其他的函数有一下优点:
1)RBF核函数可以将一个样本映射到一个更高维的空间,而且线性核函数是RBF的一个特例,也就是说如果考虑使用RBF,那么就没有必要考虑线性核函数了。
2)与多项式核函数相比,RBF需要确定的参数要少,核函数参数的多少直接影响函数的复杂程度。另外,当多项式的阶数比较高时,核矩阵的元素值将趋于无穷大或无穷小,而RBF则在上,会减少数值的计算困难。
3)对于某些参数,RBF和sigmoid具有相似的性能。
经验二:
如果如果特征数远远大于样本数的情况下,使用线性核就可以了.
如果特征数和样本数都很大,例如文档分类,一般使用线性核, LIBLINEAR比LIBSVM速度要快很多.
如果特征数远小于样本数,这种情况一般使用RBF.但是如果一定要用线性核,则选择LIBLINEAR较好,而且使用-s 2选项。
来源:支持向量机中核函数的选取方法的研究
如何从简单的核函数构造复杂的混合核函数,仍然满足于 Mercer定理
定理 设 K 1 K_1 K1和 K 2 K_2 K2是 X × X X \times X X×X上的核, X ⊆ R n X \subseteq R^n X⊆Rn.设常数 a > 0 a>0 a>0,则下面的函数均是核:
(i)
K
(
x
,
x
′
)
=
K
1
(
x
,
x
′
)
+
K
2
(
x
,
x
′
)
K(x,x')=K_1(x,x')+K_2(x,x')
K(x,x′)=K1(x,x′)+K2(x,x′)
(ii)
K
(
x
′
,
x
′
)
=
a
K
1
(
x
,
x
′
)
K(x', x')=aK_1(x, x')
K(x′,x′)=aK1(x,x′)
(iii)
K
(
x
,
x
′
)
=
K
1
(
x
,
x
′
)
K
2
(
x
,
x
′
)
K(x, x')=K_1(x, x')K_2(x, x')
K(x,x′)=K1(x,x′)K2(x,x′)
混合核函数能够兼顾其构成中的普通核函数的优势,得到性能更加优越的SvM的同时,仍存在着以下问题和困难:
①易出现构造的混合核函数比单一的普通核函数的性能差的情形,主要原因是混合核函数中的核参数过多,使得模型选择的困难增大及核参数的选取不当。如何根据待解决的问题筛选恰当的普通核函数来构造混合核函数,如何确定核参数的问题仍缺乏相应的理论指导
②在已选定用哪些普通核函数来构造混合核函数并确定核参数的情况下,如何根据具体的数据选择恰当的权参数
ρ
ρ
ρ是尚待解决的难题
事实上,现有的这些核函数的选取方法,其本质上是先粗略的确定了核函数的类型,再通过已知的测试数据选取核参数,这已基本形成共识。但如何确定核函数的类型,成为核函数选取的关键。
选取规则1
首先,我们规定求解具体问题所选取的核函数为混合核函数,这是因为混合核函数较之其他普通核函数在性能上更具优越性,且有着巨大的应用潜力。同时也存在一个子问题,即选择哪些类型的普通核函数来构造混合核函数理想的结果是尽量采用较少类型的普通核函数来构造一个适应于多数问题的混合核函数在融入先验知识的基础上,我们通过分析对比上述常用核函数的特性来解决此问题。
在五种常用的核函数中,应用最广泛的是具有较好学习能力的RBF核函数,无论低维、高维、小样本、大样本等情况,RBF核函数均适应,具有较宽的收敛域,是较为理想的分类依据函数。Keerthi等人证明了线性核函数和多项式核函数是RBF核函数的特殊情况Lin等人说明了在某些参数情况下, Sigmoid核函数同RBF核函数具有相似的性能另外,与其他常用核函数相比,RBF核函数具有参数少的优点,易于掌握,其参数
σ
\sigma
σ 对SVM性能的优劣有着至关重要的影响。大量的数值实验表明,RBF核函数的学习能力随参数
σ
\sigma
σ的增大而减弱。当
σ
\sigma
σ过大会造成SVM的分类能力差且无较好的推广能力;当
σ
\sigma
σ很小时,SVM对训练样本点的错误分类率虽为0,但对测试样本点的正确分类率低,即推广能力差;当
σ
\sigma
σ过小时易出现“过拟合”现象。
下面给出选取RBF核函数的SVM(RBF-SVM)随参数
σ
\sigma
σ变化时所具有的两个重要的性质:
性质1 若 RBF-SVM中的参数 σ → 0 \sigma→0 σ→0,则所有训练样本点 x i , i = 1 , … … , l x_i,i=1,……,l xi,i=1,……,l都是支持向量,且它们全部能被正确分类
性质2 若 RBF-SVM中的参数 σ → ∞ \sigma→\infty σ→∞,则其学习推广能力或对新样本点的正确判别能力为0,即它把所有的样本点都判为同一类。
由数学分析知识可知:任何连续函数都可以用多项式逼近;任何连续可微的周期性函数均可以展开成傅立叶级数由此可以设想用这两类核函数去逼近其它类型的核函数。多项式核函数具有较强的推广能力,并随阶数d的减小而增强当d过大时,函数集的VC维升高,学习机器的复杂性也提高,SVM的推广能力降低,易出现“过拟合”现象。而对于某些具有周期性,包含正弦(余弦)频率分量等特点的特殊问题,选取傅立叶核函数可使SVM的性能达到最优,并且只要其展开项数不多,“过拟合”现象很难产生但二者都有参数较为复杂的缺点。
综上所述,RBF核函数、多项式核函数和傅立叶核函数各自都有突出的优点且有很强的互补性,自然地可以想象用RBF核函数和比较简单的多项式核函数、傅立叶核函数的混合形式能够针对不同的实际问题构造出更为理想的核函数为了叙述方便,我们先引入如下符号
令
F
p
d
=
{
(
(
x
.
x
′
)
+
1
)
d
∣
d
>
0
}
,
F
R
σ
=
{
e
x
p
(
−
∣
∣
x
−
x
′
∣
∣
2
σ
2
)
∣
σ
>
0
}
,
F
f
q
=
{
1
−
q
2
2
(
1
−
2
q
c
o
s
(
x
−
x
′
)
+
q
2
)
∣
0
<
q
<
1
}
,
F
m
i
x
p
=
{
ρ
1
F
p
d
+
ρ
2
F
R
σ
+
ρ
3
F
f
q
∣
ρ
i
≥
0
,
∑
i
=
1
3
ρ
i
=
1
,
i
=
1
,
2
,
3
}
F_p^d=\left\{((x.x')+1)^d|d>0\right\},\\ F_R^{\sigma}=\left\{exp(-\frac{||x-x'||^2}{\sigma^2})|\sigma>0\right\},\\ F_f^q=\left\{\frac{1-q^2}{2(1-2qcos(x-x')+q^2)}|0<q<1\right\},\\ F_{mix}^p=\left\{\rho_1 F_p^d + \rho_2 F_R^{\sigma}+\rho_3 F_f^q|\rho_i \geq 0 , \sum_{i=1}^3 \rho_i =1 ,i=1,2,3 \right\}
Fpd={((x.x′)+1)d∣d>0},FRσ={exp(−σ2∣∣x−x′∣∣2)∣σ>0},Ffq={2(1−2qcos(x−x′)+q2)1−q2∣0<q<1},Fmixp={ρ1Fpd+ρ2FRσ+ρ3Ffq∣ρi≥0,i=1∑3ρi=1,i=1,2,3}
其中,
σ
i
\sigma_i
σi称为权参数,代表着这三类核函数在混合核函数中占的比重。
d
,
σ
,
q
d,σ,q
d,σ,q称为核参数
**规则1:**取核函数 K ( x , x ′ ) ∈ F m i x ρ K(x,x')\in F_{mix}^{\rho} K(x,x′)∈Fmixρ
选取规则2
在选取核参数之前,我们需要对多项式核函数的阶数 d d d及傅立叶核函数的阶数 n n n做出限定。二者的阶数不易过大,正如上文所述,阶数太大,二者各自的展开项越多,不仅增加了学习模型的复杂性,易出现“过拟合”现象,而且使SVM的推广性能降低因此,规定 d d d(或 n n n)的取值不超过3
规则2: d ≤ m i n { 3 , d i m { 训 练 集 } } , n ≤ m i n { 3 , d i m { 训 练 集 } } d≤min\{3,dim\{训练集\}\},n≤min\{3,dim\{训练集\}\} d≤min{3,dim{训练集}},n≤min{3,dim{训练集}}
选取规则3
确定了混合核函数后,核参数的选择也同样重要正如上文所分析,核参数选取的好坏直接影响着SVM的性能。正确的核参数选择可以使SVM恰当表征数据的内在结构,以达到最小化结构风险的目的。由于已选择的混合核函数:
K
(
x
,
x
′
)
=
ρ
1
(
x
⋅
x
′
)
+
1
)
d
+
ρ
2
e
x
p
(
−
∣
∣
x
−
x
′
∣
∣
2
2
σ
2
)
+
ρ
3
1
−
q
2
2
(
1
−
2
q
c
o
s
(
x
−
x
′
)
+
q
2
)
K(x,x')=\rho_1(x·x')+1)^d+\rho_2exp(-\frac{||x-x'||^2}{2\sigma^2})+\rho_3 \frac{1-q^2}{2(1-2qcos(x-x')+q^2)}
K(x,x′)=ρ1(x⋅x′)+1)d+ρ2exp(−2σ2∣∣x−x′∣∣2)+ρ32(1−2qcos(x−x′)+q2)1−q2
中的参数比较复杂,所以按照每一部分又可单独作为一个核函数的特点,把参数选取分成两个步骤完成,即:首先,选取单一核的参数
(
d
,
σ
,
q
)
(d,\sigma,q)
(d,σ,q);其次,选取权参数
(
ρ
1
,
ρ
2
,
ρ
3
)
(\rho_1,\rho_2,\rho_3)
(ρ1,ρ2,ρ3)。下面针对
(
d
,
σ
,
q
)
(d,σ,q)
(d,σ,q)的选取给出规则3,针对
(
ρ
1
,
ρ
2
,
ρ
3
)
(\rho_1,\rho_2,\rho_3)
(ρ1,ρ2,ρ3)的选取给出规则4.
令
ρ
1
=
1
,
ρ
2
=
ρ
3
=
0
\rho_1=1,\rho_2=\rho_3=0
ρ1=1,ρ2=ρ3=0,相当于仅选用单一的多项式核函数,此时用下面所给出的方法之一来选取最优的核参数
d
d
d
方法一:已经被人们所熟悉的选取核参数的方法,主要有:①预先给定参数值;②交叉验证法;③网络搜索法;④改进的方法,如遗传算法等
方法二:本文采用董玉林提出的平衡约束规划(MPEO)模型来优化选取核参数。其思想是首先给出非线性SVM核参数优化选取的具有非光滑目标函数的平衡约束规划(MPEC)模型;其次,为了方便求解该模型,给出了它的光滑化近似模型,并且证明了原模型和光滑化模型之间的解存在一定的关系;最后给出了光滑化模型的最优性条件及求解算法,由此即可求得最优的核参数的值。
同理,令
ρ
2
=
1
,
r
h
o
1
=
ρ
3
=
0
\rho_2=1,rho_1=\rho_3=0
ρ2=1,rho1=ρ3=0,对单一的RBF核函数,采用同样的方法选取最优的核参数
σ
\sigma
σ;
令
ρ
3
=
1
,
ρ
1
=
ρ
2
=
0
\rho_3=1,\rho_1=\rho_2=0
ρ3=1,ρ1=ρ2=0,对单一的傅立叶核函数,也采用相同的方法选取最优的核参数
q
q
q
据上述分析,我们得到
规则3:
(
d
,
σ
,
q
)
(d,\sigma,q)
(d,σ,q)满足:
d
∈
{
最
优
核
参
数
d
∣
ρ
1
=
1
,
ρ
2
=
ρ
3
=
0
}
,
σ
∈
{
最
优
核
参
数
σ
∣
ρ
2
=
0
,
ρ
1
=
ρ
3
=
0
}
,
q
∈
{
最
优
核
参
数
q
∣
ρ
3
=
1
,
ρ
1
=
ρ
2
=
0
}
d∈\{最优核参数d|\rho_1=1,\rho_2=\rho_3=0\},\sigma∈\{最优核参数\sigma|\rho_2=0,\rho_1=\rho_3=0\},q∈\{最优核参数q|\rho_3=1,\rho_1=\rho_2=0\}
d∈{最优核参数d∣ρ1=1,ρ2=ρ3=0},σ∈{最优核参数σ∣ρ2=0,ρ1=ρ3=0},q∈{最优核参数q∣ρ3=1,ρ1=ρ2=0}
选取规则4
将规则3中已确定好的
(
d
,
σ
,
q
)
(d,\sigma,q)
(d,σ,q)代入混合核函数后,接下来要考虑哪一类型的核函数在混合中占主导地位,从而使得SVM具有最优的非线性处理能力,这取决于权参数
ρ
i
(
i
=
1
,
2
,
3
)
\rho_i(i=1,2,3)
ρi(i=1,2,3)的选择。当
(
d
,
σ
,
q
)
(d,σ,q)
(d,σ,q)确定后,权参数实质上相当于混合核函数中的核参数,可采用效仿规则3中的方法进行选择(即选择方法一或方法二中的某种方法)
规则4:
(
ρ
1
,
ρ
2
,
ρ
3
)
(\rho_1,\rho_2,\rho_3)
(ρ1,ρ2,ρ3)满足:
( ρ 1 , ρ 2 , ρ 3 ) ∈ { 最 优 权 参 数 ( ρ 1 , ρ 2 , ρ 3 ) ∣ ( d , σ , q 按 照 规 则 3 给 出 } (\rho_1,\rho_2,\rho_3)∈\{最优权参数(\rho_1,\rho_2,\rho_3)|(d,\sigma,q按照规则3给出\} (ρ1,ρ2,ρ3)∈{最优权参数(ρ1,ρ2,ρ3)∣(d,σ,q按照规则3给出}
以上4点选取规则,仅仅为解决核函数的选取问题提供一种思路。不同于传统意义上核函数的选取方法,采用本文给出的方法来确定的核函数更具有合理性,我们称该选取方法为RSM( Reasonable Selection Method)方法
def kernelTrans(X, A, kTup): #通过数据计算转换后的核函数 #X是支持向量(因而数目不多,一行为一个样本),A是需要预测的样本,kTup用来选择核的类型,及其跟核相关的其它参数 m,n = shape(X) K = mat(zeros((m,1))) if kTup[0]=='lin': #线性核函数 K = X * A.T #结果是m行一列,每一行是一个支持向量与新样本的内积 elif kTup[0]=='rbf':#高斯核 for j in range(m): deltaRow = X[j,:] - A K[j] = deltaRow*deltaRow.T K = exp(K/(-1*kTup[1]**2)) elif kTup[0] == 'laplace':#拉普拉斯核 for j in range(m): deltaRow = X[j,:] - A K[j] = deltaRow*deltaRow.T K[j] = sqrt(K[j]) K = exp(-K/kTup[1]) elif kTup[0] == 'poly':#多项式核 K = X * A.T for j in range(m): K[j] = K[j]**kTup[1] elif kTup[0] == 'sigmoid':#Sigmoid核 K = X * A.T for j in range(m): K[j] = tanh(kTup[1]*K[j]+kTup[2]) else: raise NameError('Houston We Have a Problem -- \ That Kernel is not recognized') return K
之前我们得到了支持向量机的目标函数及其约束
L
(
w
,
b
,
α
)
=
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
<
x
i
,
x
j
>
+
∑
i
=
1
m
α
i
−
−
−
−
−
(
6
)
w
=
∑
i
=
1
m
α
i
y
i
x
i
−
−
−
−
−
(
7
)
∑
i
=
1
m
α
i
y
i
=
0
−
−
−
−
−
(
8
)
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
=
0
−
−
−
−
−
(
9
)
α
i
≥
0
−
−
−
−
−
(
10
)
1
−
y
i
(
w
T
x
i
+
b
)
≤
0
−
−
−
−
−
(
11
)
L(w,b,\alpha) =-\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j<x_i,x_j>+\sum_{i=1}^m \alpha_i-----(6)\\ w=\sum_{i=1}^m \alpha_iy_ix_i-----(7)\\ \sum_{i=1}^m\alpha_i y_i=0-----(8)\\ \alpha_i (1-y_i(w^Tx_i+b))=0-----(9)\\ \alpha_i\geq 0-----(10)\\ 1-y_i(w^Tx_i+b)\leq 0-----(11)\\
L(w,b,α)=−21i=1∑mj=1∑mαiαjyiyj<xi,xj>+i=1∑mαi−−−−−(6)w=i=1∑mαiyixi−−−−−(7)i=1∑mαiyi=0−−−−−(8)αi(1−yi(wTxi+b))=0−−−−−(9)αi≥0−−−−−(10)1−yi(wTxi+b)≤0−−−−−(11)
之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。
看下面两张图:
可以看到一个离群点(可能是噪声)可以造成超平面的移动,间隔缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分了。
这时候我们应该允许一些点游离并在在模型中违背限制条件(函数间隔大于1)。我们设计得到新的模型如下(也称软间隔):
KaTeX parse error: Expected 'EOF', got '\ ' at position 52: …_{i=1}^m\xi_i\\\̲ ̲s.t ~~~ y_i(w^T…
引入非负参数
ξ
i
\xi_i
ξi后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数,以对离群点进行处罚,目标函数后面加上的
C
∑
i
=
1
m
ξ
i
C\sum_{i=1}^m\xi_i
C∑i=1mξi就表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。这里的C是离群点的权重,C越大表明离群点对目标函数影响越大,也就是越不希望看到离群点。我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。
模型修改后,拉格朗日公式也要修改如下:
L
(
w
,
b
,
ξ
,
α
,
γ
)
=
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
ξ
i
+
∑
i
=
1
m
α
i
(
1
−
ξ
i
−
y
i
(
w
T
x
i
+
b
)
)
−
∑
i
=
1
m
γ
i
ξ
i
L(w,b,\xi,\alpha,\gamma)=\frac{1}{2} ||w||^2+C\sum_{i=1}^m\xi_i+\sum_{i=1}^m \alpha_i (1-\xi_i - y_i(w^Tx_i+b))-\sum_{i=1}^m\gamma_i \xi_i
L(w,b,ξ,α,γ)=21∣∣w∣∣2+Ci=1∑mξi+i=1∑mαi(1−ξi−yi(wTxi+b))−i=1∑mγiξi
这里的
α
i
\alpha_i
αi和
γ
i
\gamma_i
γi都是拉格朗日乘子,回想我们在拉格朗日对偶中提到的求法,先写出拉格朗日公式(如上),然后将其看作是变量w和b的函数,分别对其求偏导,得到w和b的表达式。
∂
L
∂
w
=
w
−
∑
i
=
1
m
α
i
y
i
x
i
=
0
∂
L
∂
b
=
∑
i
=
1
m
α
i
y
i
=
0
∂
L
∂
ξ
i
=
C
−
α
i
−
γ
i
=
0
\frac{\partial L}{\partial w}=w-\sum_{i=1}^{m} \alpha_i y_i x_i=0\\ \frac{\partial L}{\partial b}=\sum_{i=1}^{m} \alpha_i y_i =0\\ \frac{\partial L}{\partial \xi_i}=C-\alpha_i-\gamma_i=0\\
∂w∂L=w−i=1∑mαiyixi=0∂b∂L=i=1∑mαiyi=0∂ξi∂L=C−αi−γi=0
即
w
=
∑
i
=
1
m
α
i
y
i
x
i
∑
i
=
1
m
α
i
y
i
=
0
C
−
α
i
−
γ
i
=
0
w=\sum_{i=1}^{m} \alpha_i y_i x_i\\ \sum_{i=1}^{m} \alpha_i y_i =0\\ C-\alpha_i-\gamma_i=0\\
w=i=1∑mαiyixii=1∑mαiyi=0C−αi−γi=0
然后代入公式中,求带入后公式的极大值。整个推导过程类似以前的模型,这里只写出最后结果如下:
m
a
x
α
ψ
(
α
)
=
m
a
x
α
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
<
x
i
,
x
j
>
+
∑
i
=
1
m
α
i
−
−
−
−
−
(
12
)
α
i
≥
0
−
−
−
−
−
(
13
)
∑
i
=
1
m
α
i
y
i
=
0
−
−
−
−
−
(
14
)
γ
i
≥
0
−
−
−
(
15
)
C
−
α
i
−
γ
i
=
0
−
−
−
(
16
)
max_{\alpha} \psi(\alpha) =max_{\alpha} -\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j<x_i,x_j>+\sum_{i=1}^m \alpha_i-----(12)\\ \alpha_i \geq 0 -----(13)\\ \sum_{i=1}^m\alpha_i y_i=0-----(14)\\ \gamma_i \geq 0 ---(15)\\ C-\alpha_i-\gamma_i=0---(16)\\
maxαψ(α)=maxα−21i=1∑mj=1∑mαiαjyiyj<xi,xj>+i=1∑mαi−−−−−(12)αi≥0−−−−−(13)i=1∑mαiyi=0−−−−−(14)γi≥0−−−(15)C−αi−γi=0−−−(16)
即
m
i
n
α
ψ
(
α
)
=
m
i
n
α
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
<
x
i
,
x
j
>
−
∑
i
=
1
m
α
i
−
−
−
−
−
(
12
)
α
i
≥
0
−
−
−
−
−
(
13
)
∑
i
=
1
m
α
i
y
i
=
0
−
−
−
−
−
(
14
)
γ
i
≥
0
−
−
−
(
15
)
C
−
α
i
−
γ
i
=
0
−
−
−
(
16
)
min_{\alpha} \psi(\alpha) =min_{\alpha} \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j<x_i,x_j> - \sum_{i=1}^m \alpha_i-----(12)\\ \alpha_i \geq 0 -----(13)\\ \sum_{i=1}^m\alpha_i y_i=0-----(14)\\ \gamma_i \geq 0 ---(15)\\ C-\alpha_i-\gamma_i=0---(16)\\
minαψ(α)=minα21i=1∑mj=1∑mαiαjyiyj<xi,xj>−i=1∑mαi−−−−−(12)αi≥0−−−−−(13)i=1∑mαiyi=0−−−−−(14)γi≥0−−−(15)C−αi−γi=0−−−(16)
当然还有其他的一些表达式,这里只列举了与最后类别判断有关的(都是围绕着
α
i
\alpha_i
αi的计算)。
此时,我们发现没有了参数
ξ
i
\xi_i
ξi,与之前模型唯一不同在于
α
i
\alpha_i
αi又多了的限制条件
α
i
≤
C
\alpha_i\leq C
αi≤C。即由(13)和(16)式
可以得到
0
≤
α
i
≤
C
0 \leq \alpha_i \leq C
0≤αi≤C
需要提醒的是,
b
b
b的求值公式也发生了改变,改变结果在SMO算法里面介绍。
前面根据KKT条件我们得到一个结论,只有在支持向量处
α
i
\alpha_i
αi才不等于0。这里需要作一些变化。
α
i
=
0
  
⟺
  
y
i
(
w
T
x
i
+
b
)
≥
1
α
i
=
C
  
⟺
  
y
i
(
w
T
x
i
+
b
)
≤
1
0
<
α
i
<
C
  
⟺
  
y
i
(
w
T
x
i
+
b
)
=
1
\alpha_i=0\iff y_i(w^Tx_i+b)\geq1\\ \alpha_i=C \iff y_i(w^Tx_i+b)\leq 1\\ 0<\alpha_i<C \iff y_i(w^Tx_i+b)=1
αi=0⟺yi(wTxi+b)≥1αi=C⟺yi(wTxi+b)≤10<αi<C⟺yi(wTxi+b)=1
这个KKT条件说明,在两条间隔线外面的点,对应前面的系数为0,在两条间隔线里面的对应为C,在两条间隔线上的对应的系数在0和C之间。通过KKT条件可知,某些在最大间隔线上的样本点也不是支持向量,相反也可能是离群点。
在最后讨论
w
(
α
)
w(\alpha)
w(α)的求解之前,我们先看看坐标上升法的基本原理。假设要求解下面的优化问题:
m
a
x
α
w
(
α
1
,
α
2
,
…
,
α
m
)
max_{\alpha}w(\alpha_1,\alpha_2,\dots,\alpha_m)
maxαw(α1,α2,…,αm)
这里
w
w
w是向量的函数。之前我们在回归中提到过两种求最优解的方法,一种是梯度下降法,另外一种是牛顿法。现在我们再讲一种方法称为坐标上升法(求解最小值问题时,称作坐标下降法,原理一样)。
方法过程:
Loop until convergence:{
~~~~
For i=1,…,m,{
~~~~
~~~~
α
i
:
=
a
r
g
m
a
x
α
i
w
(
α
1
,
…
,
α
i
−
1
,
α
i
,
α
i
+
1
,
…
,
α
m
)
\alpha_i:=arg max_{\alpha_i}w(\alpha_1,\dots,\alpha_{i-1},\alpha_{i},\alpha_{i+1},\dots,\alpha_m)
αi:=argmaxαiw(α1,…,αi−1,αi,αi+1,…,αm)
~~~~
}
}
最里面语句的意思是固定除
α
i
\alpha_i
αi之外的所有
α
j
\alpha_j
αj,这时
W
W
W可看作只是关于
α
i
\alpha_i
αi的函数,那么直接对
α
i
\alpha_i
αi求导优化即可。这里我们进行最大化求导的顺序i是从1到m,可以通过更改优化顺序来使
w
w
w能够更快地增加并收敛。如果
w
w
w在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法。
下面通过一张图来展示:
椭圆代表了二次函数的各个等高线,变量数为2,起始坐标是(2,-2)。图中的直线式迭代优化的路径,可以看到每一步都会向最优值前进一步,而且前进路线是平行于坐标轴的,因为每一步只优化一个变量。
SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》了。
下面先说讲义上对此方法的总结。
首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:
m
i
n
α
ψ
(
α
)
=
m
i
n
α
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
<
x
i
,
x
j
>
−
∑
i
=
1
m
α
i
α
i
≥
0
∑
i
=
1
m
α
i
y
i
=
0
α
i
=
0
  
⟺
  
y
i
(
w
T
x
i
+
b
)
≥
1
α
i
=
C
  
⟺
  
y
i
(
w
T
x
i
+
b
)
≤
1
0
<
α
i
<
C
  
⟺
  
y
i
(
w
T
x
i
+
b
)
=
1
min_{\alpha} \psi(\alpha) =min_{\alpha} \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j<x_i,x_j> - \sum_{i=1}^m \alpha_i\\ \alpha_i \geq 0 \\ \sum_{i=1}^m\alpha_i y_i=0\\ \alpha_i=0\iff y_i(w^Tx_i+b)\geq1\\ \alpha_i=C \iff y_i(w^Tx_i+b)\leq 1\\ 0<\alpha_i<C \iff y_i(w^Tx_i+b)=1\\
minαψ(α)=minα21i=1∑mj=1∑mαiαjyiyj<xi,xj>−i=1∑mαiαi≥0i=1∑mαiyi=0αi=0⟺yi(wTxi+b)≥1αi=C⟺yi(wTxi+b)≤10<αi<C⟺yi(wTxi+b)=1
推广到更一般的情况,即带核函数的情形。同时用
u
i
u_i
ui表示
y
i
(
w
T
x
i
+
b
)
y_i(w^Tx_i+b)
yi(wTxi+b)
m
i
n
α
ψ
(
α
)
=
m
i
n
α
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
K
(
x
i
,
x
j
)
−
∑
i
=
1
m
α
i
−
−
−
(
15
)
α
i
≥
0
∑
i
=
1
m
α
i
y
i
=
0
α
i
=
0
  
⟺
  
y
i
u
i
≥
1
α
i
=
C
  
⟺
  
y
i
u
i
≤
1
0
<
α
i
<
C
  
⟺
  
y
i
u
i
=
1
min_{\alpha} \psi(\alpha) =min_{\alpha} \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j K(x_i,x_j) - \sum_{i=1}^m \alpha_i---(15)\\ \alpha_i \geq 0 \\ \sum_{i=1}^m\alpha_i y_i=0\\ \alpha_i=0\iff y_i u_i\geq1\\ \alpha_i=C \iff y_i u_i\leq 1\\ 0<\alpha_i<C \iff y_i u_i=1\\
minαψ(α)=minα21i=1∑mj=1∑mαiαjyiyjK(xi,xj)−i=1∑mαi−−−(15)αi≥0i=1∑mαiyi=0αi=0⟺yiui≥1αi=C⟺yiui≤10<αi<C⟺yiui=1
同时有下面的关系式:(还需要进一步核查)
W
∗
=
W
=
∑
i
=
1
m
α
i
y
i
x
i
b
∗
=
b
=
y
j
−
∑
i
=
1
m
α
i
y
i
⟨
x
i
,
x
j
⟩
=
−
m
a
x
i
:
y
i
=
−
1
W
∗
T
x
i
+
m
i
n
i
:
y
i
=
1
W
∗
T
x
i
2
W
T
x
+
b
=
(
∑
i
=
1
m
α
i
y
i
x
i
)
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
⟨
x
i
,
x
⟩
+
b
W^*=W=\sum_{i=1}^m \alpha_i y_ix_i\\ b^*=b=y_j - \sum_{i=1}^m \alpha_i y_i\langle x_i,x_j \rangle\\ =-\frac{max_{i:y_i=-1}W^{*T}x_i+min_{i:y_i=1}W^{*T}x_i}{2}\\ W^Tx+b=(\sum_{i=1}^m \alpha_i y_ix_i)^Tx+b=\sum_{i=1}^m \alpha_i y_i\langle x_i,x\rangle+b
W∗=W=i=1∑mαiyixib∗=b=yj−i=1∑mαiyi⟨xi,xj⟩=−2maxi:yi=−1W∗Txi+mini:yi=1W∗TxiWTx+b=(i=1∑mαiyixi)Tx+b=i=1∑mαiyi⟨xi,x⟩+b
上式中
W
W
W表示对偶问题的解,
W
∗
W^*
W∗表示原问题的解。b的表达式说明离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
按照之前的方法,新来一个样本,要判断其类别,需要根据
W
W
W和
b
b
b做一次线性运算,然后看
W
T
x
+
b
W^Tx+b
WTx+b结果是大于0还是小于0。现在则可以根据
α
i
\alpha_i
αi,并将新样本与全体样本做内积即可计算出
W
T
x
+
b
W^Tx+b
WTx+b的正负。表面上似乎没有减少什么计算量,但是,由于只有支持向量以内的样本对应的
α
i
>
0
\alpha_i>0
αi>0,其他
α
i
=
0
\alpha_i=0
αi=0,所以只需要将新来的样本与少数向量做内积即可。
SMO优化算法(Sequential minimal optimization)
现在要解决的是在参数
{
α
1
,
α
2
,
…
,
α
m
}
\{\alpha_1,\alpha_2,\dots,\alpha_m\}
{α1,α2,…,αm}上求最大值
ψ
\psi
ψ的问题,至于
x
i
x_i
xi和
y
i
y_i
yi都是已知数。C由我们预先设定,也是已知数。
按照坐标上升的思路,我们首先固定
α
1
\alpha_1
α1除以外的所有参数,然后在
α
1
\alpha_1
α1上求极值。等一下,这个思路有问题,因为如果固定
α
1
\alpha_1
α1以外的所有参数,那么
α
1
\alpha_1
α1将不再是变量(可以由其他值推出),因为问题中规定了
α
1
y
1
=
−
∑
i
=
2
m
α
i
y
i
\alpha_1y_1=-\sum_{i=2}^m\alpha_i y_i
α1y1=−i=2∑mαiyi
因此,我们需要一次选取两个参数做优化,比如
α
1
\alpha_1
α1和
α
2
\alpha_2
α2,此时
α
2
\alpha_2
α2可以由
α
1
\alpha_1
α1和其他参数表示出来。这样回带到
w
w
w中,
w
w
w就只是关于
α
1
\alpha_1
α1的函数了,可解。
SMO的主要步骤如下:
Repeat until convergence:{
1.Select some pair
α
i
\alpha_i
αi and
α
j
\alpha_j
αj to update next (using a heuristic that tries to pick the two that will allow us to make the biggest progess towards the global maximum).
2.Reoptimize
W
(
α
)
W(\alpha)
W(α) with respect to
α
i
\alpha_i
αi and
α
j
\alpha_j
αj ,while holding all the other
α
k
′
s
(
k
≠
i
,
j
)
\alpha_k^{'}s\ (k \neq i,j)
αk′s (k̸=i,j) fixed.
}
意思是:
第一步选取一对
α
i
\alpha_i
αi和
α
j
\alpha_j
αj,选取方法使用启发式方法(后面讲)。
第二步,固定除
α
i
\alpha_i
αi和
α
j
\alpha_j
αj之外的其他参数,确定
w
w
w极值条件下的
α
i
\alpha_i
αi,
α
j
\alpha_j
αj由
α
i
\alpha_i
αi表示。
SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。
下面讨论具体方法:
假设我们选取的初始值
{
α
1
,
α
2
,
⋯
 
,
α
m
}
\{\alpha_1,\alpha_2,\cdots,\alpha_m\}
{α1,α2,⋯,αm}满足了问题中的约束条件。接下来,我们固定
{
α
3
,
α
4
,
⋯
 
,
α
m
}
\{\alpha_3,\alpha_4,\cdots,\alpha_m\}
{α3,α4,⋯,αm},固定其他变量,先求一部分变量,这是坐标上升法的思想,具体过程后面再给出,这样W就是
α
1
\alpha_1
α1和
α
2
\alpha_2
α2的函数。并且
α
1
\alpha_1
α1和
α
2
\alpha_2
α2满足条件:
α
1
+
α
2
=
−
∑
i
=
3
m
α
i
y
i
\alpha_1+\alpha_2=-\sum_{i=3}^m \alpha_i y_i
α1+α2=−i=3∑mαiyi
由于
{
α
3
,
α
4
,
⋯
 
,
α
m
}
\{\alpha_3,\alpha_4,\cdots,\alpha_m\}
{α3,α4,⋯,αm}都是已知固定值,因此为了方便,可将等式右边标记成实数值
ζ
\zeta
ζ。
α
1
+
α
2
=
ζ
\alpha_1+\alpha_2=\zeta
α1+α2=ζ
当
α
1
\alpha_1
α1和
α
2
\alpha_2
α2异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1;当
α
1
\alpha_1
α1和
α
2
\alpha_2
α2同号时,也就是同为1,或同为-1时,他们斜率为-1。如下图:
横轴是
α
1
\alpha_1
α1,纵轴是
α
2
\alpha_2
α2,
α
1
\alpha_1
α1和
α
2
\alpha_2
α2既要在矩形方框内,也要在直线上。
如果只把
α
2
\alpha_2
α2作为变量
(1)
y
1
y_1
y1和
y
2
y_2
y2同号,此时
当
α
2
−
α
1
<
0
\alpha_2-\alpha_1<0
α2−α1<0时,
α
2
\alpha_2
α2的取值范围为
[
0
,
C
+
k
]
[0,C+k]
[0,C+k],即
[
0
,
C
+
α
2
−
α
1
]
[0,C+\alpha_2-\alpha_1]
[0,C+α2−α1];
当
α
2
−
α
1
≥
0
\alpha_2-\alpha_1 \geq 0
α2−α1≥0时,
α
2
\alpha_2
α2的取值范围为
[
k
,
C
]
[k,C]
[k,C],即
[
α
2
−
α
1
,
C
]
[\alpha_2-\alpha_1,C]
[α2−α1,C];
将上面两种情况合并起来就是
α
2
\alpha_2
α2的取值范围为
[
m
a
x
(
0
,
α
2
−
α
1
)
,
m
i
n
(
C
,
C
+
α
2
−
α
1
)
]
[max(0,\alpha_2-\alpha_1),min(C,C+\alpha_2-\alpha_1)]
[max(0,α2−α1),min(C,C+α2−α1)];
(2)
y
1
y_1
y1和
y
2
y_2
y2异号,此时
当
α
2
+
α
1
<
C
\alpha_2+\alpha_1<C
α2+α1<C时,
α
2
\alpha_2
α2的取值范围为
[
0
,
k
]
[0,k]
[0,k],即
[
0
,
α
2
+
α
1
]
[0,\alpha_2+\alpha_1]
[0,α2+α1];
当
α
2
+
α
1
≥
C
\alpha_2+\alpha_1 \geq C
α2+α1≥C时,
α
2
\alpha_2
α2的取值范围为
[
k
,
C
]
[k,C]
[k,C],即
[
α
2
+
α
1
−
C
,
C
]
[\alpha_2+\alpha_1-C,C]
[α2+α1−C,C];
将上面两种情况合并起来就是
α
2
\alpha_2
α2的取值范围为
[
m
a
x
(
0
,
α
2
+
α
1
−
C
)
,
m
i
n
(
C
,
α
2
+
α
1
)
]
[max(0,\alpha_2+\alpha_1-C),min(C,\alpha_2+\alpha_1)]
[max(0,α2+α1−C),min(C,α2+α1)];
把(1)(2)统一表示为
L
≤
α
2
≤
H
当
y
1
和
y
2
同
号
时
:
L
=
m
a
x
(
0
,
α
2
−
α
1
)
H
=
m
i
n
(
C
,
C
+
α
2
−
α
1
)
当
y
1
和
y
2
异
号
时
:
L
=
m
a
x
(
0
,
α
2
+
α
1
−
C
)
H
=
m
i
n
(
C
,
C
+
α
2
+
α
1
)
L \leq \alpha_2 \leq H\\ 当y_1和y_2同号时:\\ L=max(0,\alpha_2-\alpha_1)\\ H=min(C,C+\alpha_2-\alpha_1)\\ 当y_1和y_2异号时:\\ L=max(0,\alpha_2+\alpha_1-C)\\ H=min(C,C+\alpha_2+\alpha_1)
L≤α2≤H当y1和y2同号时:L=max(0,α2−α1)H=min(C,C+α2−α1)当y1和y2异号时:L=max(0,α2+α1−C)H=min(C,C+α2+α1)
将
α
1
\alpha_1
α1用
α
2
\alpha_2
α2来表示,
α
1
=
(
ζ
−
α
2
y
1
)
y
1
=
ζ
y
1
−
α
2
y
1
y
1
\alpha_1=(\zeta -\alpha_2 y_1)y_1=\zeta y_1-\alpha_2 y_1y_1
α1=(ζ−α2y1)y1=ζy1−α2y1y1
将
α
1
\alpha_1
α1代入目标函数
M
A
X
α
W
(
α
)
=
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
y
i
y
j
α
i
α
j
⟨
x
i
,
x
j
⟩
MAX_{\alpha}\ \ \ W(\alpha)=\sum_{i=1}^m \alpha_i - \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m y_iy_j\alpha_i \alpha_j\langle x_i,x_j\rangle
MAXα W(α)=i=1∑mαi−21i=1∑mj=1∑myiyjαiαj⟨xi,xj⟩
目标函数可转化成下面的形式(大概看一下就可以知道)
W
(
α
)
=
a
α
2
2
+
b
α
2
+
c
—
—
(
2
)
W(\alpha)=a\alpha_2^2+b\alpha_2+c——(2)
W(α)=aα22+bα2+c——(2)
式中
a
,
b
,
c
a,b,c
a,b,c均为固定值,由已知样本和固定的拉格朗日乘子给出,具体推导过程下面马上给出。
(2)式对
α
2
\alpha_2
α2进行求导并令导数为0,可以得到极值点处的
α
2
\alpha_2
α2,但是要保证
L
≤
α
2
≤
H
L \leq \alpha_2 \leq H
L≤α2≤H,我们可以使用
α
2
n
e
w
\alpha_2^{new}
α2new表示极值点处的
α
2
\alpha_2
α2。最后
α
2
\alpha_2
α2的取值要由下式来确定。
α
2
n
e
w
=
{
L
i
f
α
2
n
e
w
≤
L
α
2
n
e
w
i
f
L
<
α
2
n
e
w
<
H
H
i
f
α
2
n
e
w
≥
H
\alpha_2^{new}=\left\{
这样得到
α
2
n
e
w
\alpha_2^{new}
α2new后,我们可以得到
α
1
\alpha_1
α1的新值
α
1
n
e
w
\alpha_1^{new}
α1new。
下面进行具体计算:
我们将重新计算(2)式,同时我们将核函数引入。
M
A
X
α
W
(
α
)
=
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
y
i
y
j
α
i
α
j
K
⟨
x
i
,
x
j
⟩
  
⟺
  
M
I
N
α
W
(
α
)
=
1
2
∑
i
=
1
m
∑
j
=
1
m
y
i
y
j
K
⟨
x
i
,
x
j
⟩
α
i
α
j
−
∑
i
=
1
m
α
i
MAX_{\alpha}\ \ \ W(\alpha)=\sum_{i=1}^m \alpha_i - \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m y_iy_j\alpha_i \alpha_j K\langle x_i,x_j\rangle\\ \iff \\ MIN_{\alpha}\ \ \ W(\alpha)=\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m y_iy_jK\langle x_i,x_j\rangle\alpha_i \alpha_j -\sum_{i=1}^m \alpha_i
MAXα W(α)=i=1∑mαi−21i=1∑mj=1∑myiyjαiαjK⟨xi,xj⟩⟺MINα W(α)=21i=1∑mj=1∑myiyjK⟨xi,xj⟩αiαj−i=1∑mαi
W
(
α
)
W(\alpha)
W(α)可推导如下:
W
(
α
)
=
1
2
∑
i
=
1
m
[
y
i
y
1
K
⟨
x
i
,
x
1
⟩
α
i
α
1
+
y
i
y
1
K
⟨
x
i
,
x
1
⟩
α
i
α
2
+
∑
j
=
3
m
y
i
y
j
K
⟨
x
i
,
x
j
⟩
α
i
α
j
]
−
α
1
−
α
2
−
∑
i
=
3
m
α
i
=
1
2
[
y
1
y
1
K
⟨
x
1
,
x
1
⟩
α
1
α
1
+
y
1
y
1
K
⟨
x
1
,
x
1
⟩
α
2
α
1
+
∑
i
=
3
m
y
i
y
1
K
⟨
x
i
,
x
1
⟩
α
i
α
1
]
+
1
2
[
y
1
y
1
K
⟨
x
1
,
x
1
⟩
α
1
α
2
+
y
1
y
1
K
⟨
x
1
,
x
1
⟩
α
2
α
2
+
∑
i
=
3
m
y
i
y
1
K
⟨
x
i
,
x
1
⟩
α
i
α
2
]
+
1
2
[
∑
j
=
3
m
y
1
y
j
K
⟨
x
1
,
x
j
⟩
α
1
α
j
+
∑
j
=
3
m
y
1
y
j
K
⟨
x
1
,
x
j
⟩
α
2
α
j
+
∑
i
=
3
m
∑
j
=
3
m
y
i
y
j
K
⟨
x
i
,
x
j
⟩
α
i
α
j
]
−
α
1
−
α
2
−
∑
i
=
3
m
α
i
=
1
2
K
⟨
x
1
,
x
1
⟩
α
1
2
+
1
2
K
⟨
x
1
,
x
1
⟩
α
2
2
+
y
1
y
1
K
⟨
x
1
,
x
1
⟩
α
1
α
2
+
y
1
α
1
∑
j
=
3
m
y
j
K
⟨
x
1
,
x
j
⟩
α
j
+
y
1
α
2
∑
j
=
3
m
y
j
K
⟨
x
1
,
x
j
⟩
α
j
−
α
1
−
α
2
+
1
2
∑
i
=
3
m
∑
j
=
3
m
y
i
y
j
K
⟨
x
i
,
x
j
⟩
α
i
α
j
−
∑
i
=
3
m
α
i
为了便于书写和推导,我们作一些字符替换,不防令
K
⟨
x
i
,
x
j
⟩
=
K
i
j
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
=
v
i
y
i
y
j
=
S
i
j
1
2
∑
i
=
3
m
∑
j
=
3
m
y
i
y
j
K
⟨
x
i
,
x
j
⟩
α
i
α
j
−
∑
i
=
3
m
α
i
=
W
c
o
n
s
t
a
n
t
K\langle x_i,x_j\rangle=K_{ij}\\ \sum_{j=3}^m y_jK\langle x_i,x_j\rangle \alpha_j=v_i\\ y_iy_j=S_{ij}\\ \frac{1}{2} \sum_{i=3}^m \sum_{j=3}^m y_iy_jK\langle x_i,x_j\rangle\alpha_i \alpha_j -\sum_{i=3}^m \alpha_i=W_{constant}
K⟨xi,xj⟩=Kijj=3∑myjK⟨xi,xj⟩αj=viyiyj=Sij21i=3∑mj=3∑myiyjK⟨xi,xj⟩αiαj−i=3∑mαi=Wconstant
则
W
(
α
)
W(\alpha)
W(α)可简写如下:
$$
W(\alpha)=\frac{1}{2} K_{11} \alpha_1^2 +\frac{1}{2} K_{22} \alpha_2^2 +S_{12}K_{12}\alpha_1 \alpha_2 \
下面我们将
α
1
\alpha_1
α1用
α
2
\alpha_2
α2来表示。注意下面表达式的演化,后面将反复用到这种关系。
y
1
α
1
+
y
1
α
2
=
−
∑
i
=
3
m
y
i
α
i
⟹
α
1
+
S
12
α
2
=
−
y
1
∑
i
=
3
m
y
i
α
i
=
−
y
1
∑
i
=
3
m
y
i
α
i
∗
=
α
1
∗
+
S
12
α
2
∗
上式中,
α
1
∗
\alpha_1^*
α1∗和
α
2
∗
\alpha_2^*
α2∗均表示迭代前的值,为固定值。我们暂时用
A
A
A来表示,
A
=
−
y
1
∑
i
=
3
m
y
i
α
i
=
−
y
1
∑
i
=
3
m
y
i
α
i
∗
A=-y_1\sum_{i=3}^m y_i \alpha_i=-y_1\sum_{i=3}^m y_i \alpha_i^*
A=−y1∑i=3myiαi=−y1∑i=3myiαi∗,则$ \alpha_1 $可表示成
α
1
=
A
−
S
12
α
2
\alpha_1 =A-S_{12}\alpha_2
α1=A−S12α2
将
α
1
\alpha_1
α1代入
W
(
α
)
W(\alpha)
W(α),则有
W
(
α
)
=
1
2
K
11
(
A
−
S
12
α
2
)
2
+
1
2
K
22
α
2
2
+
S
12
K
12
(
A
−
S
12
α
2
)
α
2
+
y
1
(
A
−
S
12
α
2
)
v
1
+
y
1
α
2
v
2
−
(
A
−
S
12
α
2
)
−
α
2
+
W
c
o
n
s
t
a
n
t
现在对上式求导,则有
d
W
d
α
2
=
(
−
S
12
)
K
11
(
A
−
S
12
α
2
)
+
K
22
α
2
+
S
12
K
12
(
−
S
12
)
α
2
+
S
12
K
12
(
A
−
S
12
α
2
)
+
y
1
(
−
S
12
)
v
1
+
y
1
v
2
−
(
−
S
12
)
−
1
=
−
S
12
K
11
A
+
K
11
α
2
+
K
22
α
2
−
K
12
α
2
+
S
12
K
12
A
−
K
12
α
2
−
y
1
S
12
v
1
+
y
1
v
2
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
S
12
A
(
K
11
−
K
12
)
−
y
1
(
v
1
−
v
2
)
−
(
−
S
12
)
−
1
求导过程中要注意,
v
i
v_i
vi的表达式中只有
i
≥
3
i \geq 3
i≥3时的
α
i
\alpha_i
αi值,因而是一个固定值。
下面将
S
12
=
y
1
y
1
S_{12}=y_1y_1
S12=y1y1、
A
=
−
y
1
∑
i
=
3
m
y
i
α
i
=
α
1
∗
+
S
12
α
2
∗
A=-y_1\sum_{i=3}^m y_i \alpha_i=\alpha_1^* + S_{12}\alpha_2^*
A=−y1∑i=3myiαi=α1∗+S12α2∗
和
v
i
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
∗
=
u
i
∗
−
y
1
K
⟨
x
i
,
x
1
⟩
α
1
∗
−
y
1
K
⟨
x
i
,
x
1
⟩
α
2
∗
−
b
∗
上式中
u
i
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
b
u_i=\sum_{j=1}^m y_jK\langle x_i,x_j\rangle \alpha_j+b
ui=∑j=1myjK⟨xi,xj⟩αj+b,
u
i
u_i
ui就是我们用来判断新样本类别的公式。
将上面三式代回
d
W
d
α
2
\frac{d_W}{d_{\alpha_2}}
dα2dW,可得(这里将值代入的时候有一个技巧:由于后面是要求导数等于0的,因而我们要尽可能用迭代前的值即带*号的变量代入。)
d
W
d
α
2
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
S
12
C
(
K
11
−
K
12
)
−
y
1
(
v
1
−
v
2
)
−
(
−
S
12
)
−
1
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
S
12
(
α
1
∗
+
S
12
α
2
∗
)
(
K
11
−
K
12
)
−
y
1
[
(
u
1
∗
−
y
1
K
⟨
x
1
,
x
1
⟩
α
1
∗
−
y
1
K
⟨
x
1
,
x
1
⟩
α
2
∗
−
b
∗
)
−
(
u
2
∗
−
y
1
K
⟨
x
1
,
x
1
⟩
α
1
∗
−
y
1
K
⟨
x
1
,
x
1
⟩
α
2
∗
−
b
∗
)
]
−
(
−
y
1
y
1
)
−
y
1
y
1
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
(
y
1
y
1
α
1
∗
+
α
2
∗
)
(
K
11
−
K
12
)
−
y
1
[
(
u
1
∗
−
u
2
∗
−
y
1
(
K
11
−
K
12
)
α
1
∗
−
y
1
(
K
12
−
K
22
)
α
2
∗
]
−
(
−
y
1
y
1
)
−
y
1
y
1
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
y
1
(
u
1
∗
−
u
2
∗
)
−
[
(
y
1
y
1
α
1
∗
+
α
2
∗
)
(
K
11
−
K
12
)
−
y
1
y
1
(
K
11
−
K
12
)
α
1
∗
−
(
K
12
−
K
22
)
α
2
∗
]
−
(
−
y
1
y
1
)
−
y
1
y
1
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
y
1
(
u
1
∗
−
y
1
−
u
2
∗
+
y
1
)
−
[
y
1
y
1
α
1
∗
K
11
+
α
2
∗
K
11
−
y
1
y
1
α
1
∗
K
12
−
α
2
∗
K
12
−
y
1
y
1
K
11
α
1
∗
+
y
1
y
1
K
12
α
1
∗
−
K
12
α
2
∗
+
K
22
α
2
∗
]
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
y
1
(
u
1
∗
−
y
1
−
u
2
∗
+
y
1
)
−
[
α
2
∗
K
11
−
α
2
∗
K
12
−
K
12
α
2
∗
+
K
22
α
2
∗
]
=
(
K
11
−
2
K
12
+
K
22
)
α
2
−
y
1
(
E
1
−
E
2
)
−
(
K
11
−
2
K
12
+
K
22
)
α
2
∗
式中
E
i
=
u
i
∗
−
y
i
E_i=u_i^*-y_i
Ei=ui∗−yi;
令导数为0,则有
(
K
11
−
2
K
12
+
K
22
)
α
2
=
(
K
11
−
2
K
12
+
K
22
)
α
2
∗
+
y
1
(
E
1
∗
−
E
2
∗
)
(K_{11} - 2 K_{12} +K_{22} )\alpha_2 = (K_{11} - 2 K_{12} +K_{22} )\alpha_2^* + y_1(E_1^* - E_2^*)\\
(K11−2K12+K22)α2=(K11−2K12+K22)α2∗+y1(E1∗−E2∗)
用$\eta=K_{11} - 2 K_{12} +K_{22} $同除等式两边得到
α
2
=
α
2
∗
+
y
1
(
E
1
∗
−
E
2
∗
)
η
\alpha_2 = \alpha_2^* + \frac{y_1(E_1^* - E_2^*)}{\eta}\\
α2=α2∗+ηy1(E1∗−E2∗)
为了与原论文一致,这里仍然用
α
2
\alpha_2
α2表示迭代前的值,
α
2
n
e
w
\alpha_2^{new}
α2new表示迭代后的值,则上式可重新表示如下:
α
2
n
e
w
=
α
2
+
y
1
(
E
1
−
E
2
)
η
\alpha_2^{new} = \alpha_2 + \frac{y_1(E_1 - E_2)}{\eta}\\
α2new=α2+ηy1(E1−E2)
加入边界约束后,有如下表达式:
α
2
n
e
w
,
c
l
i
p
p
e
d
=
{
L
i
f
α
2
n
e
w
≤
L
α
2
n
e
w
i
f
L
<
α
2
n
e
w
<
H
H
i
f
α
2
n
e
w
≥
H
\alpha_2^{new,clipped}=\left\{
由于
α
1
+
S
12
α
2
=
α
1
∗
+
S
12
α
2
∗
\alpha_1 + S_{12}\alpha_2 = \alpha_1^* + S_{12}\alpha_2^*
α1+S12α2=α1∗+S12α2∗
即
α
1
n
e
w
+
S
12
α
2
n
e
w
,
c
l
i
p
p
e
d
=
α
1
+
S
12
α
2
\alpha_1^{new} + S_{12}\alpha_2^{new,clipped} = \alpha_1 + S_{12}\alpha_2
α1new+S12α2new,clipped=α1+S12α2
则有
α
1
n
e
w
=
α
1
+
S
12
(
α
2
−
α
2
n
e
w
,
c
l
i
p
p
e
d
)
\alpha_1^{new} = \alpha_1 + S_{12}(\alpha_2-\alpha_2^{new,clipped})
α1new=α1+S12(α2−α2new,clipped)
至此,我们就将最关键的拉格朗日乘数的更新方式推导出来了,每次同时更新两个值,具体先更新哪两个值,随机选都可以。但实际上为了加快收敛速度,会采用启发式的方式选择优先更新的
α
i
\alpha_i
αi。
在
u
i
u_i
ui的表达式里是包含参数
b
b
b的,而
y
i
u
i
y_iu_i
yiui要满足KKT条件,即在最优解里
b
b
b会受到约束。我们可以利用这种约束,在每一步迭代的时候都对
b
b
b进行更新,这样可以使得整体的解更快收敛。我们令
b
b
b为更新前的值,
b
n
e
w
b^{new}
bnew为更新后的值,则有下面的表达式:
u
i
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
b
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
y
1
K
⟨
x
i
,
x
1
⟩
α
1
+
y
1
K
⟨
x
i
,
x
1
⟩
α
2
+
b
u
i
n
e
w
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
n
e
w
+
b
n
e
w
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
y
1
K
⟨
x
i
,
x
1
⟩
α
1
n
e
w
+
y
1
K
⟨
x
i
,
x
1
⟩
α
2
n
e
w
+
b
n
e
w
上式中,
α
i
\alpha_i
αi和
b
b
b最开始由初始化给出,一般开始时均为0,因为最终的结果里大部分
α
i
\alpha_i
αi为0。虽然
α
1
n
e
w
\alpha_1^{new}
α1new和
α
2
n
e
w
\alpha_2^{new}
α2new的计算并不依赖于
b
b
b的取值;但我们可以反过来看,当已经计算出
α
1
n
e
w
\alpha_1^{new}
α1new和
α
2
n
e
w
\alpha_2^{new}
α2new后,我们将这两个参数代回到
u
i
n
e
w
u_i^{new}
uinew的计算,
α
i
\alpha_i
αi必须满足如下矩形约束
**说明:**在矩形框内即为界内和在矩形边界即为界上。
当
α
i
\alpha_i
αi在界内
这是最普通的情况,此时由KKT条件有
y
i
u
i
=
1
y_iu_i=1
yiui=1
在完美拟合(或者利用数学公式推导)的情况下,最终的最优解应该满足如下表达式:
y
i
=
u
i
最
优
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
最
优
+
b
最
优
如果在迭代更新的时候b不变,计算出的
u
i
n
e
w
u_i^{new}
uinew可能与
y
i
y_i
yi的差距很大;我们应该通过更新b使得
u
i
n
e
w
u_i^{new}
uinew等于
y
i
y_i
yi。因而之前的表达式可重写如下:
u
i
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
b
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
y
1
K
⟨
x
i
,
x
1
⟩
α
1
+
y
1
K
⟨
x
i
,
x
1
⟩
α
2
+
b
y
i
=
∑
j
=
1
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
n
e
w
+
b
n
e
w
=
∑
j
=
3
m
y
j
K
⟨
x
i
,
x
j
⟩
α
j
+
y
1
K
⟨
x
i
,
x
1
⟩
α
1
n
e
w
+
y
1
K
⟨
x
i
,
x
1
⟩
α
2
n
e
w
+
b
n
e
w
这样
u
i
−
y
i
=
y
1
K
⟨
x
i
,
x
1
⟩
α
1
+
y
1
K
⟨
x
i
,
x
1
⟩
α
2
+
b
−
y
1
K
⟨
x
i
,
x
1
⟩
α
1
n
e
w
−
y
1
K
⟨
x
i
,
x
1
⟩
α
2
n
e
w
−
b
n
e
w
  
⟺
  
b
n
e
w
=
y
i
−
u
i
+
y
1
(
α
1
−
α
1
n
e
w
)
K
⟨
x
i
,
x
1
⟩
+
y
1
(
α
2
−
α
2
n
e
w
)
K
⟨
x
i
,
x
1
⟩
  
⟺
  
b
n
e
w
=
−
E
i
+
y
1
(
α
1
−
α
1
n
e
w
)
K
⟨
x
i
,
x
1
⟩
+
y
1
(
α
2
−
α
2
n
e
w
)
K
⟨
x
i
,
x
1
⟩
由于我们是同时更新一对
α
i
\alpha_i
αi,这里是
α
1
\alpha_1
α1和
α
2
\alpha_2
α2,因而为了迎合
u
1
n
e
w
=
y
1
u_1^{new}=y_1
u1new=y1和
u
2
n
e
w
=
y
2
u_2^{new}=y_2
u2new=y2,我们就会得到两个
b
n
e
w
b^{new}
bnew值,
b
1
n
e
w
b_1^{new}
b1new和
b
2
n
e
w
b_2^{new}
b2new,但
b
n
e
w
b^{new}
bnew不可能同时取两个值,我们必须选择一个最佳的。
由KKT条件知当
α
i
\alpha_i
αi在界内时需要满足的是等式约束,而
α
i
\alpha_i
αi在界上时需要满足的是不等式约束,等式约束更难达到,b的更新应该优先满足等式约束。
下面说明b更新时不同取值的几种情况:
(1)、
α
1
\alpha_1
α1在界内,
优先满足
α
1
\alpha_1
α1的约束,此时应该取
b
n
e
w
=
b
1
n
e
w
b^{new}=b_1^{new}
bnew=b1new
(2)、
α
2
\alpha_2
α2在界内,
优先满足
α
2
\alpha_2
α2的约束,此时应该取
b
n
e
w
=
b
2
n
e
w
b^{new}=b_2^{new}
bnew=b2new
(3)、
α
1
\alpha_1
α1和
α
2
\alpha_2
α2均在界内,
此时应该取
b
n
e
w
=
b
1
n
e
w
=
b
2
n
e
w
b^{new}=b_1^{new}=b_2^{new}
bnew=b1new=b2new,
b
1
n
e
w
=
b
2
n
e
w
b_1^{new}=b_2^{new}
b1new=b2new,这个应该是可以推导出来的,这里我们可以直觉地感到,
α
1
\alpha_1
α1和
α
2
\alpha_2
α2的意义,求解方法,求值范围都是完全一样,因而两者对应的约束解
b
n
e
w
b^{new}
bnew也应该是一样的。好像在物理里还是数学里有一个这样的关于对称性的定理。
(4)、
α
1
\alpha_1
α1和
α
2
\alpha_2
α2均在界内
b
1
n
e
w
b_1^{new}
b1new和
b
2
n
e
w
b_2^{new}
b2new之间的任何数都满足KKT条件,都可以作为b的更新值,一般取
b
n
e
w
=
b
1
n
e
w
+
b
2
n
e
w
2
b^{new}=\frac{b_1^{new}+b_2^{new}}{2}
bnew=2b1new+b2new;
这里可以这样理解,
b
1
n
e
w
b_1^{new}
b1new可以使得
α
1
\alpha_1
α1满足不等式约束,
b
2
n
e
w
b_2^{new}
b2new可以使得
α
2
\alpha_2
α2满足不等式约束,两者均比较容易满足,各方面的情况也是一样的,直觉是取两者的平均值更容易同时满足两个不等式约束。
其实利用这种对称性可以把(3)(4)两种情况合为一种情况。(3)里也可以认为是取了两者的均值。
这样全部参数的更新公式都已经介绍完毕。
前面我们拿了
α
1
\alpha_1
α1和
α
2
\alpha_2
α2来做演示,表示同时更新一对
α
i
\alpha_i
αi,但具体先更新哪对
α
i
\alpha_i
αi呢?
当然,随机的选择,最终也会逐步迭代出结果,但如果有一种方法能够选择出好的
α
i
\alpha_i
αi对,使得收敛速度加快,则会更好。启发式选择方法就是用来解决这个问题的。
所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C的
α
i
\alpha_i
αi作优化(论文中称为无界样例),因为在界上(
α
i
\alpha_i
αi为0或C)的样例对应的系数一般不会更改。
这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的
α
2
\alpha_2
α2。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个
α
i
\alpha_i
αi中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C的
α
i
\alpha_i
αi,在界上也有可能会违背。是的,因此在给定初始值
α
i
=
0
\alpha_i=0
αi=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新(迭代的过程就是使得不断满足KKT条件的过程),这里的满足KKT条件其中一种情况是
y
i
u
i
=
1
y_iu_i=1
yiui=1并且
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C,也就是
y
i
E
i
=
0
y_iE_i=0
yiEi=0并且
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C,由于采用迭代的方法,在一定误差范围内就认为等于0,这里可以设置一个最小误差。等这轮过后,如果没有收敛,第二轮就只针对
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C的样例进行迭代更新。
在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于
∣
E
1
−
E
2
∣
|E_1-E_2|
∣E1−E2∣,选择第二个乘子使
∣
E
1
−
E
2
∣
|E_1-E_2|
∣E1−E2∣最大。即
E
1
E_1
E1当为正时选择负的绝对值最大的
E
2
E_2
E2,反之,选择正值最大的
E
2
E_2
E2。
最后的收敛条件是在界内(
0
<
α
i
<
C
0 < \alpha_i < C
0<αi<C)的样例都能够遵循KKT条件,且其对应的
α
i
\alpha_i
αi只在极小的范围内变动。
SMO算法基础版
程序是网上下载的,做了些注释和简单的更改,找不到原网址了,如有侵权实非故意。
#coding=utf-8 """ 这一段SVM算法实现了最基本的功能,在更新alpha的时候没有采用启发式方法,而是外层采用逐个样本扫描,内层随机抽取样本的方式更新; 没有引入核函数的概念; 计算的时候也不是采用内积的计算,而是使用矩阵对位相乘; """ import numpy as np from numpy import * import matplotlib import matplotlib.pyplot as plt from matplotlib.patches import Circle def loadDataSet(fileName): """ 加载数据集 :param fileName: :return: """ dataMat = []; labelMat = [] with open(fileName,encoding='UTF-8') as fr: for line in fr.readlines(): if line.startswith("\ufeff"):#在window保存文本文件为uft-8时默认是带BOM标记的,此时用java或python读入,第一行开头将是\ufeff,占一字字符的位置 line=line.replace("\ufeff","") lineArr = line.strip().split() dataMat.append([float(lineArr[0]), float(lineArr[1])]) labelMat.append(float(lineArr[2])) return dataMat,labelMat def selectJrand(i,m): """ 随机从0到m挑选一个不等于i的数 :param i: :param m: :return: """ j=i #排除i while (j==i): j = int(random.uniform(0,m)) return j def clipAlpha(aj,H,L): """ 将aj剪裁到L(ow)和H(igh)之间 :param aj: :param H: :param L: :return: """ if aj > H: aj = H if L > aj: aj = L return aj def calcWs(alphas,dataArr,classLabels): """ 根据支持向量计算分离超平面(w,b)的w参数 :param alphas:拉格朗日乘子向量 :param dataArr:数据集x :param classLabels:数据集y :return: w=∑alphas_i*y_i*x_i """ X = mat(dataArr); labelMat = mat(classLabels).transpose() m,n = shape(X) w = zeros((n,1)) for i in range(m): w += multiply(alphas[i]*labelMat[i],X[i,:].T) return w def plotSVM(dataArr, labelArr, w, b, svList): """ 可视化函数 """ xcord0 = [] ycord0 = [] xcord1 = [] ycord1 = [] markers =[] colors =[] min_x=1000000 max_x=-1000000 min_y=1000000 max_y=-1000000 for i in range(len(labelArr)):#用来提取两类样本 xPt = dataArr[i][0] yPt = dataArr[i][1] if xPt<min_x :min_x=xPt if xPt>max_x :max_x=xPt if yPt<min_y :min_y=yPt if yPt>max_y :max_y=yPt label = labelArr[i] if (label == -1): xcord0.append(xPt) ycord0.append(yPt) else: xcord1.append(xPt) ycord1.append(yPt) fig = plt.figure() ax = fig.add_subplot(111) # 画数据散点图 ax.scatter(xcord0,ycord0, marker='s', s=90) ax.scatter(xcord1,ycord1, marker='o', s=50, c='red') plt.title('Support Vectors Circled') # 画支持向量,用圆圈圈出 for sv in svList:# circle = Circle((dataArr[sv][0], dataArr[sv][1]), 0.2, facecolor='none', edgecolor=(0,0.8,0.8), linewidth=3, alpha=0.5) ax.add_patch(circle) w0=w[0][0]; w1=w[1][0]; b=float(b) x = arange(min_x-0.5, max_x+0.5, 0.1) y = (-w0*x - b)/w1#画分界线,SVM与LSR是一样的方法 ax.plot(x,y) ax.axis([min_x-0.5,max_x+0.5,min_y-0.5,max_y+0.5]) plt.show() def smoSimple(dataMatIn, classLabels, C, toler, maxIter): """ 简化版SMO算法 :param dataMatIn: X :param classLabels: Y :param C: 惩罚参数,也就是alpha_i允许的最大值 :param toler: 容错率(小于这个值就认为等于0) :param maxIter: 最大循环次数 :return: """ dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose() b = 0#初始化b为0 m,n = shape(dataMatrix) # m:=训练实例的个数;n:=每个样本的特征数目 alphas = mat(zeros((m,1)))#初始化所有样本的拉格朗日乘子为0 iter = 0 while (iter < maxIter):#进行maxIter轮的迭代优化,每一轮里面,虽然是逐个样本更新alpha,但并不是尝试完所有样本就算一轮,而是尝试到alpha不再优化算一轮。 alphaPairsChanged = 0 #alpha是否已经进行了优化 for i in range(m): # w = alpha * y * x; f(x_i) = w^T * x_i + b fXi = float(multiply(alphas,labelMat).T*dataMatrix*dataMatrix[i,:].T) + b # 预测的类别 Ei = fXi - float(labelMat[i]) #得到误差,如果误差太大,检查是否可能被优化 if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): #必须满足约束 j = selectJrand(i,m)#随机挑选了另一个样本与前一个样本配对 fXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b Ej = fXj - float(labelMat[j]) alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy() # 教材中的α_1^old和α_2^old if (labelMat[i] != labelMat[j]): # 两者所在的对角线段端点的界 L = max(0, alphas[j] - alphas[i]) H = min(C, C + alphas[j] - alphas[i]) else: L = max(0, alphas[j] + alphas[i] - C) H = min(C, alphas[j] + alphas[i]) if L==H: print("L==H"); continue#则该对拉格朗日乘子不需要优化 # Eta = -(2 * K12 - K11 - K22),且Eta非负,此处eta = -Eta则非正 eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T if eta >= 0: print("eta>=0"); continue#eta出现特殊值,这里直接跳过这种情况,实际上是需要考虑特殊情况的。 alphas[j] -= labelMat[j]*(Ei - Ej)/eta #print(alphas[j]) alphas[j] = clipAlpha(alphas[j],H,L)#将alpha值限定在矩形框内 #print(alphas[j]) #如果内层循环通过以上方法选择的α_2不能使目标函数有足够的下降,那么放弃α_1 if (abs(alphas[j] - alphaJold) < 0.00001): print("j not moving enough"); continue alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j]) b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T if (0 < alphas[i]) and (C > alphas[i]): b = b1 elif (0 < alphas[j]) and (C > alphas[j]): b = b2 else: b = (b1 + b2)/2.0 alphaPairsChanged += 1 print("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)) if (alphaPairsChanged == 0): iter += 1 #print(alphas,b) else: iter = 0 print("iteration number: %d" % iter) return b,alphas # 该数据集中共有100行,3列,即88个样本,前两列为特征,最后一列为类别标签,共两类用-1,1来表示 dataArr, labelArr = loadDataSet('testSet.txt') b,alphas = smoSimple(dataArr, labelArr, 0.6, 0.001, 40) print(b) print(alphas) print(alphas[alphas > 0]) for i in range(len(alphas)):#将支持向量打印出来 if alphas[i] > 0.0 : print(dataArr[i], labelArr[i]) w = calcWs(alphas, dataArr, labelArr) print(w) svList = [] for i in range(len(alphas)):#获取支持向量 if abs(alphas[i]) > 0.0000001 : print(dataArr[i], labelArr[i]) svList.append(i) plotSVM(dataArr, labelArr, w, b, svList)
程序运行结果如下:
这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。
对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。
之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了
w
w
w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。
另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。
来源:
SVM本身是一个二值分类器,SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。 目前,构造SVM多类分类器的方法主要有两类,直接法、间接法。
直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;
主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
假如我有四类要划分(也就是4个Label),他们是A、B、C、D。
于是我在抽取训练集的时候,分别抽取
使用这四个训练集分别进行训练,然后的得到四个训练结果文件。
在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。
最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。
于是最终的结果便是这四个值中最大的一个作为分类结果。
评价
**优点:**训练k个分类器,个数较少,其分类速度相对较快。
缺点:
①每个分类器的训练都是将全部的样本作为训练样本,这样在求解二次规划问题时,训练速度会随着训练样本的数量的增加而急剧减慢;
②同时由于负类样本的数据要远远大于正类样本的数据,从而出现了样本不对称的情况,且这种情况随着训练数据的增加而趋向严重。解决不对称的问题可以引入不同的惩罚因子,对样本点来说较少的正类采用较大的惩罚因子C;
③还有就是当有新的类别加进来时,需要对所有的模型进行重新训练。
**从“一对多”的方法又衍生出基于决策树的分类: **
首先将所有类别分为两个类别,再将子类进一步划分为两个次级子类,如此循环下去,直到所有的节点都只包含一个单独的类别为止,此节点也是二叉树树种的叶子。该分类将原有的分类问题同样分解成了一系列的两类分类问题,其中两个子类间的分类函数采用SVM。下图引用出自于王正海《基于决策树多分类支持向量机岩性波谱分类》
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM
。
当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
Libsvm中的多类分类就是根据这个方法实现的。
假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。
投票是这样的:
评价:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。
评价:
**优点:**不需要重新训练所有的SVM,只需要重新训练和增加语音样本相关的分类器。在训练单个模型时,相对速度较快。
**缺点:**所需构造和测试的二值分类器的数量关于k成二次函数增长,总训练时间和测试时间相对较慢。
从“一对一”的方式出发,出现了有向无环图(DirectedAcyclic Graph)的分类方法。
淘宝双11数据分析与预测课程案例—步骤四:利用Spark预测回头客行为
来源:
思路:还是在y(w,x)=w^tx+b
然后利用支持向量机的思路来求w和b。与支持向量机用于分类不同。回归模型,没有类别。其实类别是隐含了一个超平面(粗略的理解就是两个类别中间),然后支持向量到超平面的几何距离要尽可能大,其他样本点要在支持向量之外。在回归中假如已经拟合了一条回归曲线,那么我们也要让回归曲线穿过这些样本点,并让样本点分布曲线两侧,相当于就是一个超平面。当然我们还要人为归定样本点到拟合曲线的距离不能太大(这个与分类中的很不一样)。依此我们可以构建与分类问题中相似的目标函数和约束条件。
m
i
n
1
2
∣
∣
w
∣
∣
2
2
s
.
t
∣
y
i
−
w
∙
ϕ
(
x
i
)
−
b
∣
≤
ϵ
(
i
=
1
,
2
,
.
.
.
m
)
min \frac{1}{2}||w||_2^2 ~\\ s.t ~|y_i−w∙ϕ(x_i)−b|≤ϵ(i=1,2,...m)
min21∣∣w∣∣22 s.t ∣yi−w∙ϕ(xi)−b∣≤ϵ(i=1,2,...m)
然后就可以利用可以利用广义拉格朗日乘法和KKT条件进行推导,得到目标函数只关于拉格朗日乘数的函数,并利用SMO算法求解
α
\alpha
α,进而得到
b
b
b和
w
w
w。
代入到y(w,x)=w^tx+b的表达式即可得到测试样本的回归值,应该还是用内积的算法。
关于调试SVM的一点心得
各位大侠来说说用SVM的经验?
关于统计学习的一篇好的心得感受!
SVM一样,没有L2-norm regularization,实践中的性能就会变得很差
对SVM的个人理解—浅显易懂
SVM调参经验
使用SVM模型进行分类预测时的参数调整技巧
使用svm的一个常见错误
支持向量机之使用核SVM解决非线性分类问题
支持向量机(SVM)是否适合大规模数据?
其他资料
手把手教你实现SVM算法(一)
手把手教你实现SVM算法(二)
支持向量机通俗导论(理解SVM的三层境界)
SVM理论
支持向量机:里面有代码
机器学习之支持向量机SVM:里面有代码和案例
机器学习中的算法(2)-支持向量机(SVM)基础
Sequential Minimal Optimization - A Fast Algorithm for Training Support Vector Machines
SVM notation
理解SVM(二)——线性不可分的情况
采用线性SVM对线性不可分的数据进行分类(含matlab实现)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。