构建支持向量机
1.替换逻辑回归函数
在逻辑回归中使用的代价函数J(θ):
对于支持向量机而言,实际上,我们要将
- 上面式子中的这一项:
(−loghθ(x(i)))
替换为:
cost1(z)
,即:
cost1(θTx(i))
- 同样,这一项:
((−log(1−hθ(x(i)))))
替换为:
cost0(z)
,即:
cost0(θTx(i))
所以对于支持向量机的最小化代价函数问题,代价函数的形式如下:
minθ1m[∑i=1my(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+λ2m∑j=1nθ2j
2.去除多余的常数项 1/m
现在按照支持向量机的惯例,我们去除
1m
这一项,因为这一项是个常数项,即使去掉我们也可以得出相同的θ最优值:
minθ∑i=1m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+λ2∑j=1nθ2j
3.正则化项系数的处理
在逻辑回归的目标函数中,正则化项优化形式:
A+λB
在支持向量机的目标函数中,正则化项优化形式:
CA+B
因此,在逻辑回归中,如果给λ一个很大的值,那么就意味着给与B了一个很大的权重,而在支持向量机中,就相当于对C设定了一个非常小的值,这样一来就相当于对B给了比A更大的权重。
在支持向量机中的我们的整个优化目标函数:
minθC∑i=1m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+12∑j=1nθ2j
最后有别于逻辑回归的一点,对于支持向量机假设函数的形式如下:
hθ(x)=1 if θTx≥0
hθ(x)=0 if θTx<0
而不是逻辑回归中的S型曲线:
hθ(x)=11+e−x
大间距分类器
如果你有一个正样本,即
y=1
时,那么代价函数
cost1(z)
的图像如下:
可以看出,只有在
z≥1
(即
θTx≥1
)时(不仅仅是≥0),代价函数
cost1(z)
的值才等于0。
反之,如果你有一个负样本,即
y=0
时,那么代价函数
cost0(z)
的图像如下:
可以看出,只有在
z≤−1
(即
θTx≤−1
)时(不仅仅是<0),代价函数
cost0(z)
的值才等于0。
这就相当于在支持向量机中嵌入了一个额外的安全因子(或者说是安全距离因子)。
SVM决策边界
下面这个既有正样本又有负样本的数据集,可以看出有很多直线都可以把正负样本区分开,支持向量机会选择黑色的这一条直线,因为它看起来更加稳健。在数学上来讲就是这条直线拥有相对于训练数据更大的最短距离,这个所谓的距离就是指间距(margin):
这就是支持向量机拥有鲁棒性的原因。因为它一直努力用一个最大间距来分离样本。因此支持向量机分类器有时又被称为大间距分类器。
大间距分类器中的异常值
- 当有一个异常值产生时,我们的算法会受到异常值的影响。
- 如果我们将支持向量机中的正则化因子C设置的非常大,则会得到一条粉色的决策边界。
- 如果我们适当的减小C的值,最终还是会得到那条黑色的决策边界的。如果数据是线性不可分的话,支持向量机也可以恰当的将它们分开。
值得提醒的是C的作用其实等同于
1λ
,λ就是我们之前用到的正则化参数。在支持向量机中,C不是很大的时候,可以对包含异常数据、以及线性不可分的数据有比较好的处理效果。
SVM的数学原理
向量内积
假设我们有两个二维向量:
u=[u1u2] v=[v1v2]
我们把
uTv
的计算结果称作向量u和v之间的内积。
其中我们用
||u||
来表示u的范数(即u的长度),因此
||u||
的计算公式如下:
||u||=u21+u22−−−−−−√
将向量v投影到向量u上,如下图我们对向量v做一个相对于向量u的直角投影:
投影之后的长度就是图中红线p的长度:
p=向量v投影到向量u上的长度
同时也有另外一种计算内积的方式:
uTv=p⋅||u||
通过这种方式计算出来的内积,答案和之前也是一样的。事实上,如果你想要使用将u投影到v上来用这种方式来计算内积,得到的答案也是相同的。
在向量的内积问题中,如果两个向量的夹角小于90°,那么p的符号就是为正;如果两个向量的夹角大于90°,那么p的符号就为负。
决策边界
考虑下面这里的训练样本:
- 其中假设截距为0,即θ0=0,也就意味着决策边界是过原点的。假设有这样一条绿色的决策边界
- 由于决策边界和参数向量是正交的(斜率相乘结果为-1),我们可以绘制出对应的参数向量θ
- 对于训练样本
x(1)
,可以画出这个样本向量到θ的投影
p(1)
- 类似的,我们也可以画出第二个样本
x(2)
向量到θ的投影
p(2)
- 我们会发现,这些
p(i)
将会是一些非常小的数。
因此当我们考察优化目标函数的时候:
- 对于正样本(
y(i)=1
,即图中的”x”样本)而言,我们需要
p(i)⋅||θ||≥1
,由于
p(i)
非常小,也就意味着
||θ||
需要非常大。
- 对于负样本(
y(i)=−1
,即图中的”o”样本)而言,我们需要
p(i)⋅||θ||≤−1
,由于
p(i)
非常小,也就意味着||θ||需要非常大。
- 但我们的实际目标是希望找到一个参数
θ
,使得它的范数
||θ||
是尽可能小的,因此这并不是一个好的决策边界,因为我们的
||θ||
比较大。
对于下面这个决策边界来说,情况就会有很大的不同:
因为投影p的长度变大了,随之
θ
的范数
||θ||
也相应的变小了。这就意味着通过选择第二种远离样本的决策边界,支持向量机可以使参数
θ
的范数
||θ||
变小很多。
这就是为什么支持向量机可以产生大间距分类的原因。
怎么寻找最大间隔
点到超平面的距离
点到超平面的函数间距:
y(x)=wTx+b
分类的结果:
f(x)=sign(wTx+b)
(其中:sign表示>0为1,<0为-1,=0为0)
点到超平面的几何间距:
d(x)=(wTx+b)||w||
(||w||表示w矩阵的二范数=>
wT∗w−−−−−−√
, 点到超平面的距离也是类似的)
现在我们可以通过几何间隔来描述最优直线的条件,设
g
是数据集中离直线最近的点到直线的几何间隔,
gi
表示某个数据点到直线的几何间隔,则问题描述为:
maxg,s.t.,gi≥g
即最大化数据集中最小的几何间隔。
拉格朗日乘子法
- 类别标签用-1、1是为了后期方便
label∗(wTx+b)
的标识和距离计算;如果
label∗(wTx+b)>0
表示预测正确,否则预测错误。
现在目标很明确,就是要找到w和b,因此我们必须要找到最小间隔的数据点,也就是前面所说的支持向量。
目标函数:
arg:max关于w,b(min[label∗(wTx+b)]∗1||w||)
令
label∗(wTx+b)>=1
因为0~1之间,得到的点是存在误判的可能性,所以要保障
min[label∗(wTx+b)]=1
,才能更好降低噪音数据影响。
- 所以本质上是求
arg:max关于w,b1||w||
也就说,我们约束(前提)条件是:
label∗(wTx+b)=1
新的目标函数求解:
arg:max关于w,b1||w||
通过拉格朗日乘子法,求二次优化问题
假设需要求极值的目标函数 (objective function) 为 f(x,y),限制条件为
φ(x,y)=M
其中
M=1
设
g(x,y)=M−φ(x,y)
临时
φ(x,y)
表示下文中
label∗(wTx+b)
定义一个新函数:
F(x,y,λ)=f(x,y)+λg(x,y)
α为λ(α>=0)
,代表要引入的拉格朗日乘子(Lagrange multiplier)
那么:
L(w,b,α)=12∗||w||2+∑i=1nαi∗[1−label∗(wTx+b)]
因为:
label∗(wTx+b)>=1,α>=0
所以
α∗[1−label∗(wTx+b)]<=0
∑i=1nαi∗[1−label∗(wTx+b)]<=0
当
label∗(wTx+b)>1
则
α=0
,表示该点为非支持向量
相当于求解:
max关于αL(w,b,α)=12∗||w||2
如果求:
min关于w,b12∗||w||2
也就是要求:
min关于w,b(max关于αL(w,b,α))
现在转化到对偶问题的求解
现在分2步
先求:
min关于w,bL(w,b,α)=12∗||w||2+∑i=1nαi∗[1−label∗(wTx+b)]
就是求L(w,b,a)关于[w, b]的偏导数, 得到w和b的值,并化简为:L和a的方程。
终于得到公式:
max关于α(∑i=1mαi−12∑i,j=1mlabeli⋅labelj⋅αi⋅αj⋅<xi,xj>)
约束条件:
α>=0
并且
∑mi=1αi⋅labeli=0
kernels(核函数)
如果你有一个像这个样的训练集:
首先我们定义三个新的特征变量(但是对于实际问题而言,我们可以定义非常多的特征变量):
将这三个点标记为
l(1)
、
l(2)
、
l(3)
f1=similarity(x,l(1))=exp(−||x−l(1)||22σ2)
这里
similarite(x,l(1))
是一种相似度的度量,度量样本x与第一个标记
l(1)
的相似度。
因此,我们可以依次写出特征
f1
、
f2
、
f3
:
f1=similarity(x,l(1))=exp(−||x−l(1)||22σ2)
f2=similarity(x,l(2))=exp(−||x−l(2)||22σ2)
f3=similarity(x,l(3))=exp(−||x−l(3)||22σ2)
这里的
similarite(x,l)
函数,就被称为核函数(Kernels)。在这里,我们的例子中所说的核函数,实际上是高斯核函数,在后面我们还会见到不同的核函数。
核函数我们通常不写作
similarity(x,l(i))
,而是写作:
k(x,l(i))
首先让我们来看看第一个标记:
f1=similarity(x,l(1))=exp(−||x−l(1)||22σ2)=exp(−∑nj=1(xj−l(1)j)22σ2)
假设,
x≈l(1)
,即x与其中一个标记点非常接近,那么这个欧氏距离
||x−l(1)||
就会接近0,则:
f1≈exp(−022σ2)≈1
相反的,如果x离
l(1)
很远,那么会有:
f1≈exp(−(large number)22σ2)≈0
也就是说,给出一个训练样本x,我们就能基于我们之前给出的标记点
l(1)
、
l(2)
、
l(3)
来计算出三个新的特征变量
f1
、
f2
、
f3
。
核函数的图形
假设我们有两个特征x1和x2,假设我们第一个标记点是
l(1)
:
l(1)=[35]
假设:
σ2=1
则:
f1=k(x,l(1))=exp(−||x−l(1)||22σ2)
的图像为:
σ2
对
f
的值的影响:
σ2
=1 |
σ2
=0.5 |
σ2
=3 |
|
|
|
|
|
|
获取预测函数
- 给定一个训练样本x,我们要计算出三个特征变量
f1
、
f2
、
f3
- 如果
θ0+θ1f1+θ2f2+θ3f3≥0
,则预测函数的预测值为1,即
y=1
。
- 这就是一个我们如何通过标记点,以及核函数,来训练出非常复杂的非线性判别边界的方法。
选取标记点(landmark)
对于数据集的正样本和负样本,我们直接将训练样本作为标记点,最终能得到m个标记点:
l(1),l(2),…,l(m)
这说明,特征函数基本上是在描述每一个样本距离样本集中其他样本的距离。
最终我们能得到一个特征向量,我们将特征向量记为f,按照惯例,如果我们需要的话,可以添加额外的特征
f0,f0
的值始终为1:
f=⎡⎣⎢⎢⎢⎢⎢⎢f0f1f2…fm⎤⎦⎥⎥⎥⎥⎥⎥
当给定核函数和相似度函数后,我们按照这个方法来使用支持向量机。
使用SVM
支持向量机是一个特定的优化问题,我们只需要调用库函数来实现这些功能即可,常用的库有:liblinear和libsvm。
尽管你不需要自己去实现SVM,但你也需要做以下几件事:
核函数的选择
线性核函数(无核函数):
- 不用任何核函数(不用任何核函数也叫作线性核函数):
- 即对于预测结果y=1,满足
θTx≥0
。
- 它只是一个标准的线性分类器。
- 当特征数量n很大,但数据量m很小时,由于数据量不足,在这种情况下如果使用其他核函数,你可能会过拟合,因此,此时线性核函数是一个合理的选择。
高斯核函数:
fi=exp(−||x−l(i)||22σ2),
- 如果
σ2
很大,可能得到一个较高偏差、较低方差的分类器。
- 如果
σ2
很小,可能得到一个较低偏差、较高方差的分类器。
- 如果原来的特征变量x是n维的,而且n很小,样本数量m很大时,高斯核函数会是一个不错的选择。
逻辑回归 vs SVM vs 神经网络
假设n是特征变量的个数,m是训练样本数:
n>>m:使用逻辑回归,或者使用无核函数的SVM(线性核函数)。
比如你有一个文本分类的问题,特征数量n=10000,而且如果你的训练集大小为m=10,在这个问题中,你有10000个特征变量,对应10000个词,但是你只有10个训练样本。这种情况下就比较适合使用逻辑回归或者线性核函数的SVM了。
n较小,m中等大小:(例如n为1到1k之间的值,m为10到10k之间的值)那么使用高斯核函数的SVM效果好一些。
n很小,m很大:(例如n=1k,m=100k+),那么高斯核函数的SVM运行起来会很慢,这种情况下,需要尝试手动地创建更多的特征变量,然后使用逻辑回归或者无核函数的SVM(线性核函数)。
逻辑回归和不带核函数的SVM它们都是非常相似的算法,他们会做相似的事情,并且表现也相似,但是根据你实现的具体情况,其中一个可能会比另一个更加有效。
对于上面所有的情况,一个设计得很好的神经网络也很可能会非常有效,而不使用神经网络的原因是:神经网络训练起来可能会很慢。但是如果你有一个非常好的SVM实现包,它会运行得比较快,比神经网络快很多。
SVM的优化问题,实际上是一个凸优化问题。因此好的SVM优化软件包总是会找到全局最小值,或者接近它的值。
对于SVM,你不需要担心局部最优。在实际应用中,局部最优对神经网络来说不是非常大的问题,但是也不小。所以使用SVM,你不用考虑这部分问题。