概述
SVM,全称support vector machine,是一个非常经典的二分类算法,在神经网络流行之前,在机器学习领域占据着举足轻重的地位。
名词解释
- 决策边界:决策边界是SVM中用来划分不同分类的边界线,svm就是通过优化决策边界找到最优模型的。
- 支持向量:是决策边界的基础,决策边界求解过程,就是找到离不同分类的点距离最远的边界,依赖的点称之为支持向量。
- 普通向量:除支持向量之外的数据点,这些点与决策边界的计算无关。
- 鲁棒性:指健壮性。在机器学习中的含义有两个:
- 容错性:当样本中出现错误或误差时,算法能很好支持,不受其影响。
- 应对分布不均:当训练样本和测试样本分布不均匀时,能很好的应对。
- 对数:如 n = l o g a b n=log_ab n=logab,则 a n = b a^n=b an=b。
推演过程
先回忆一下逻辑回归的代价函数:
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
{
−
y
∗
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
h
θ
(
x
)
)
}
cost(h_θ(x), y)= \left\{ \begin{aligned} -y*log(h_θ(x)) -(1-y)log(1 - h_θ(x)) \end{aligned} \right\}
cost(hθ(x),y)={−y∗log(hθ(x))−(1−y)log(1−hθ(x))}
其中
h
θ
(
x
)
=
1
1
+
e
−
θ
T
X
h_\theta(x)=\frac{1}{1+e^{-θ^TX}}
hθ(x)=1+e−θTX1,为了书写方便,假设
−
θ
T
X
=
−
z
-\theta^TX=-z
−θTX=−z,则
h
θ
(
x
)
=
1
1
+
e
−
z
h_\theta(x)=\frac{1}{1+e^{-z}}
hθ(x)=1+e−z1,把该公式代入代价函数,则当y=0、y=1的情况下:
- y=0: c o s t ( 0 ) = { − l o g ( 1 − 1 1 + e − z ) } cost(0)= \left\{ \begin{aligned} -log(1 - \frac{1}{1+e^{-z}}) \end{aligned} \right\} cost(0)={−log(1−1+e−z1)}
- y=1: c o s t ( 1 ) = { − l o g ( 1 1 + e − z ) } cost(1)= \left\{ \begin{aligned} -log(\frac{1}{1+e^{-z}}) \end{aligned} \right\} cost(1)={−log(1+e−z1)}
分别画出代价函数的示意图形:
其中黑色的曲线代表的是逻辑回归的代价函数。
紫色的由两条直线组成的图形就是支持向量机的示意图形。
由上图可以看出,支持向量机图形的趋势与逻辑回归是一致的,区别在于逻辑回归的图形是曲线,而支持向量机的图形是两条直线组成的。
所以支持向量机比逻辑回归拥有更高的性能。
(可选内容)下面推演一下,当y=1的情况下,为什么随着z的增大,代价函数的值在变小:
- 随着z的增大,则 e − z e^{-z} e−z趋近于0。
- 则 1 1 + e − z \frac{1}{1+e^{-z}} 1+e−z1趋近于1.
- 则 l o g 1 1 + e − z log\frac{1}{1+e^{-z}} log1+e−z1趋近于0,因为 1 0 0 = 1 10^0=1 100=1
y=0的情况是一样的就不推了。
公式
逻辑回归带正则的代价函数为:
m
i
n
θ
1
m
[
∑
i
=
1
m
y
(
i
)
∗
(
−
l
o
g
(
h
θ
(
x
(
i
)
)
)
)
+
(
1
−
y
(
i
)
)
(
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
min_\theta\frac{1}{m} \left[ \begin{aligned} \sum_{i=1}^my^{(i)}*(-log(h_θ(x^{(i)}))) + (1-y^{(i)})(-log(1 - h_θ(x^{(i)})) ) \end{aligned} \right]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
minθm1[i=1∑my(i)∗(−log(hθ(x(i))))+(1−y(i))(−log(1−hθ(x(i))))]+2mλj=1∑nθj2
假设:
c
o
s
t
1
θ
T
X
(
i
)
=
−
l
o
g
(
h
θ
(
x
(
i
)
)
)
cost_1{\theta^TX^{(i)}}=-log(h_\theta(x^{(i)}))
cost1θTX(i)=−log(hθ(x(i)))
c
o
s
t
0
θ
T
X
(
i
)
=
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
cost_0{\theta^TX^{(i)}}=-log(1-h_\theta(x^{(i)}))
cost0θTX(i)=−log(1−hθ(x(i)))
并去掉分子m,则公式变成:
m
i
n
θ
[
∑
i
=
1
m
y
(
i
)
∗
(
c
o
s
t
1
θ
T
X
(
i
)
)
+
(
1
−
y
(
i
)
)
(
c
o
s
t
0
θ
T
X
(
i
)
)
)
]
+
λ
2
∑
j
=
1
n
θ
j
2
min_\theta \left[ \begin{aligned} \sum_{i=1}^my^{(i)}*(cost_1{\theta^TX^{(i)}}) + (1-y^{(i)})(cost_0{\theta^TX^{(i)}}) ) \end{aligned} \right]+\frac{\lambda}{2}\sum_{j=1}^n\theta_j^2
minθ[i=1∑my(i)∗(cost1θTX(i))+(1−y(i))(cost0θTX(i)))]+2λj=1∑nθj2
现在把公式看成两部分,前部分为A,后部分为
λ
B
\lambda B
λB,则公式简化为
A
+
λ
B
A+\lambda B
A+λB,支持向量机中更习惯的写法是把
λ
\lambda
λ参数写在A参数上并用C标识,所以该公式可以简化为
C
A
+
B
CA+B
CA+B,C相当于
1
λ
\frac{1}{\lambda}
λ1,当然仅仅是相当于,实际上肯定是不等的。
最终得到支持向量机的公式为:
m
i
n
θ
C
[
∑
i
=
1
m
y
(
i
)
∗
(
c
o
s
t
1
θ
T
X
(
i
)
)
+
(
1
−
y
(
i
)
)
(
c
o
s
t
0
θ
T
X
(
i
)
)
)
]
+
∑
j
=
1
n
θ
j
2
min_\theta C \left[ \begin{aligned} \sum_{i=1}^my^{(i)}*(cost_1{\theta^TX^{(i)}}) + (1-y^{(i)})(cost_0{\theta^TX^{(i)}}) ) \end{aligned} \right]+\sum_{j=1}^n\theta_j^2
minθC[i=1∑my(i)∗(cost1θTX(i))+(1−y(i))(cost0θTX(i)))]+j=1∑nθj2
基本原理
适合进行分类任务。如下图所示,要区分蓝绿颜色的点,可以在它们中间找到很多的边界线,这个线称为决策边界线。SVM的目的是从这么多的决策边界线中找到离各颜色的支持向量距离最大的决策边界。
上图有两个决策边界,都可以对两个类别的数据进行划分,但是显然右边的那条是最合适的,因为它离两边元素的距离最远,通俗的讲就是“路宽的优先选择”。
线性 VS 非线性
线性可分
线性可分指的就是通过线性函数,就能把数据进行正确分类,表现就是二维空间的一条直线,多维空间的一个平面(多维空间下可能就不是平面了,叫超平面)。
非线性可分
现实世界中,大多数情况下线性函数都不能进行有效的分类,比如下图所示的数据,内容交杂在一起,通过一个线性函数是不能进行有效划分的。
这种情况下,就要使用非线性的函数才能很好的分类,比如一条曲线:
实现思路是把低纬度数据通过转换形成高纬度数据,然后计算出最优的决策边界。当然,升维后数据计算的效率急剧下降,所以实现的时候只是模拟,并不会真正的去升维。能达到这个效果的函数有:
核函数
为了支持非线性的分类,我们需要生成新的特征来参与计算,比如多项式的方式 x 0 ∗ x 0 2 x_0*x_0^2 x0∗x02,特征的组合方式多种多样,选择哪个会更好呢?
核函数是支持向量机生成新特征的方式。
高斯函数
获取新特征
假设新特征用f标识,我们在坐标上手工标识3个点
l
(
1
)
l
(
2
)
l
(
3
)
l^{(1)} l^{(2)}l^{(3)}
l(1)l(2)l(3),则新特征
f
1
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
1
)
)
=
e
x
p
(
−
∣
∣
x
−
l
(
1
)
∣
∣
2
2
σ
2
)
f_1=similarity(x,l^{(1)})=exp(-\frac{||x-l^{(1)}||^2}{2\sigma^2})
f1=similarity(x,l(1))=exp(−2σ2∣∣x−l(1)∣∣2),是根据x生成出来的新特征。分子的含义代表的是x和
l
(
1
)
l^{(1)}
l(1)的距离。
同理,
f
2
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
2
)
)
=
e
x
p
(
−
∣
∣
x
−
l
(
2
)
∣
∣
2
2
σ
2
)
f_2=similarity(x,l^{(2)})=exp(-\frac{||x-l^{(2)}||^2}{2\sigma^2})
f2=similarity(x,l(2))=exp(−2σ2∣∣x−l(2)∣∣2)
f
3
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
3
)
)
=
e
x
p
(
−
∣
∣
x
−
l
(
3
)
∣
∣
2
2
σ
2
)
f_3=similarity(x,l^{(3)})=exp(-\frac{||x-l^{(3)}||^2}{2\sigma^2})
f3=similarity(x,l(3))=exp(−2σ2∣∣x−l(3)∣∣2)。
核函数简写为 k ( x , l ( i ) ) k(x,l^{(i)}) k(x,l(i))。
有了新特征,就可以代入到评估函数中进行计算了。
那坐标上手工标识的3个点 l ( 1 ) l ( 2 ) l ( 3 ) l^{(1)} l^{(2)}l^{(3)} l(1)l(2)l(3)是怎么来的,请看下节分析。
获取标记点
标记点一般直接采用训练样本,比如
x
(
i
)
x^{(i)}
x(i)生成的新特征为:
f
1
(
i
)
=
k
(
x
(
i
)
,
l
(
1
)
)
f_1^{(i)}=k(x^{(i)},l^{(1)})
f1(i)=k(x(i),l(1))
f
2
(
i
)
=
k
(
x
(
i
)
,
l
(
2
)
)
f_2^{(i)}=k(x^{(i)},l^{(2)})
f2(i)=k(x(i),l(2))
f
3
(
i
)
=
k
(
x
(
i
)
,
l
(
3
)
)
f_3^{(i)}=k(x^{(i)},l^{(3)})
f3(i)=k(x(i),l(3))
f
m
(
i
)
=
k
(
x
(
i
)
,
l
(
m
)
)
f_m^{(i)}=k(x^{(i)},l^{(m)})
fm(i)=k(x(i),l(m))
C参数
参数C相当于 1 λ \frac{1}{\lambda} λ1:
- C越大,则正则影响越小,则方差越大。
- C越小,则正则影响越大,则偏差越大。
代表模型的准确度,C越大,准确度越高。但是这个值并不是越大越好,因为过拟合的模型,在训练集上的表现肯定是最好的,但是由于缺乏泛化能力,在测试集上的效果可能会很差。所以C取什么值合适,还要看测试效果。
σ \sigma σ 参数
σ
\sigma
σ越大,则坡度越平滑,则偏差越大。
σ
\sigma
σ越小,则坡度越陡峭,则方差越大。
核函数的选择
使用n代表特征向量的大小,使用m代表样本的大小。
则当n远远大于m时,采用逻辑回归即可。
当m适中时,选择线性或高斯都可以。
当m非常大时,需要提升n的数量,然后使用线性核函数。
参考
SVM支持向量机入门及数学原理
支持向量机(SVM)从入门到放弃再到掌握
《统计学方法》李航著