这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
本文为吴恩达机器学习课程的笔记系列第四篇,主要关于支持向量机(Support Vetor Machines)的算法介绍与推导。
代价函数
回顾逻辑回归中的代价函数中的 Cost(hθ(x),y):
Cost=y(i)log(hθ(x))+(1−y(i))log(1−hθ(x))=y(i)(−log(1+e−θTx1))+(1−y(i))(−log(1−1+e−θTx1))=−y(i)log(1+e−θTx1)−(1−y(i))log(1−1+e−θTx1)
先忽略 i ,当 y=1 时,我们希望代价最小,也就是希望 θTx≫0 ;当 y=0 时,我们希望代价最小,也就是希望 θTx≪0 ,图像如下:

观察图像,当 y=1 时,z 变大,代价变小,为了获得更高的预测精度,SVM 将曲线拉直成折线,取 z=1 为转折点,之前的逻辑回归是 z=θTx≫0 时,预测的结果接近 y=1 ,现在 SVM 改为z=θTx≫1 时,预测的结果接近 y=1 。当 y=0 时同理。我们将 y=1,y=0 时两个新的代价函数分别命名为 Cost1(z),Cost0(z),图像如下:

替换逻辑回归的代价函数中的 Cost ,我们可以得到支持向量机的代价函数:
J(θ)=m1i=1∑m[y(i)Cost1(θTx(i))+(1−y(i))Cost0(θTx(i))]+2mλj=1∑nθj2
最小化代价
SVM定义其最小化预测代价的过程为:
θminCi=1∑m[y(i)Cost1(θTx(i))+(1−y(i))Cost0(θTx(i))]+21j=1∑nθj2
可以看出 mλ 被提取出来,上述SVM的代价函数可以简单描述为:CA+B ,不难想出逻辑回归的代价函数同样也可以简单描述为:A+λB。
事实上,逻辑回归是通过λ 来调节权重,而 SVM 则变换了一下,通过C 来调节权重。实际上 C 可以认为等价于 λ1。
假设函数
当通过最小化得到参数 θ 后,可以代入下面的假设函数进行预测:
hθ(x)={10ifθTx⩾0otherwise
大间距分类器(Large Margin Intuition)
在前面 SVM 的代价函数中,我们了解到,当 y=1 时,SVM 希望 θTx≫1;而当 y=0 时,SVM 希望 θTx≪−1 。并且 C 用来调节权重。我们考虑一个特例,假设 C 设置为非常大,则在最小化代价函数的过程中,我们会希望中间的 A 也就是代价函数第一项为在 y=1,y=0 时都为0 ,这样便把最小化问题变成最小化第二项 B 的问题:
min21j=1∑nθj2s.t{θTx(i)⩾1θTx(i)⩽−1ify(i)=1ify(i)=0
下图的黑线便是 SVM 所做出的决策边界。可以看出黑色的边界与训练样本之间有更大的最短距离,这个距离叫做 SVM 的间距(margin),SVM 其实就是努力选最好的决策边界,因此支持向量机有时被称为大间距分类器。

数学推导
首先回顾向量内积的知识。假设有两个二维向量 u 和 v:
u=[u1u2],v=[v1v2]
我们作几何图来直观表示,且令 p 表示为 v 投影到 u 的长度,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZnPmNta-1628350970614)(/imgs/向量内积.PNG)]
则向量内积:(u,v)=uTv=p⋅∣∣u∣∣=u1v1+u2v2
其中,∣∣u∣∣=u12+u22 为u的范数,也称长度。需要注意的是,p 是一个有符号的数,当向量 u,v 夹角大于 90°时, p 为负数。
回到 SVM 中,我们假设有两个参数 θ ,即θ=[θ1θ2] ,且令 θ0=0,以忽略截距,使得向量 θ 过原点,则:
min21j=1∑nθj2=min21j=1∑n(θ12+θ12)=min21j=1∑n(θ12+θ12)2=min21j=1∑n∣∣θ∣∣
可以看出 SVM 所做的就是极小化参数向量θ 的范数(或长度)的平方。
另外,我们可以得到: θTx(i)=p(i)⋅∣∣θ∣∣ ,p(i) 就是为第 i个训练样本 x(i) 在参数向量 θ 上的投影。如下图:

对y(i)=1时,我们希望 p(i)⋅∣∣θ∣∣⩾1 ,如果 p(i) (此时 p(i)>0 )非常小,则 ∣∣θ∣∣ 会非常大;同样对y(i)=0时,我们希望 p(i)⋅∣∣θ∣∣⩽−1 ,如果 p(i) (此时 p(i)<0 )非常小,则 ∣∣θ∣∣ 也会非常大,而这都与我们最初想要最小化参数向量θ 的范数的平方相矛盾。所以,我们更希望 p(i) 足够大。
核函数(Kernel)
定义
首先,我们要了解线性可分与非线性可分,如下图,左图的数据集即线性可分,右图即非线性可分。

线性分类问题我们前面的内容其实已经讨论过,即用一条直线去划分数据集,并使之取得最大的决策边界。而对于非线性问题,回想之前逻辑回归的时候,我们是通过Feature mapping(特征组合)来增加一些特征,从而进行多项式拟合。对于 SVM,多项式回归所带来的高阶不一定起明显作用,因此 SVM 使用的是引入预先选定的地标(landmark),将样本 x 与地标 l(i) 的相似程度作为新的特征 fi:
fi=similarity(x,l(i))
距离度量的 similarity 函数就称为核函数。常见的有高斯核函数:fi=exp(−2σ2∣∣x−l(i)∣∣2)
- 当 x 与地标 l(i) 之间的距离近似于 0 时,fi≈1
- 当 x 与地标 l(i) 之间的距离足够远时,fi≈0
值得注意的是,在使用高斯核函数前,需要进行特征缩放(feature scaling)。
地标选择
通常是根据是训练集的样本数量对应确定地标的数量,且每个地标对应每个样本。这样做的好处在于:我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的。
即假设我们有 m 个样本,则 l(1)=x(1),l(2)=x(2),..,l(m)=x(m)。可得新的特征 f(i):
f(i)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡f0(i)=1f1(i)=similarity(x(i),l(1))...fi(i)=similarity(x(i),l(i))=1...fm(i)=similarity(x(i),l(m))⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
相应地,最终的 SVM 最小化代价过程:
θminCi=1∑m[y(i)Cost1(θTf(i))+(1−y(i))Cost0(θTf(i))]+21j=1∑n=mθj2
其它核函数
-
多项式核函数(Polynomial Kernel)
-
拉普拉斯核
-
字符串核函数(String kernel)
-
卡方核函数( chi-square kernel)
-
直方图交集核函数(histogram intersection kernel)
-
等等…
SVM应用建议
如今 sklearn 有很多非常完善的工具包可供直接调用,对于 SVM 的应用,一般参数 C 与核函数的选择是 SVM 应用最重要的两个参数。
对于 C 的调节,其实就是与正则化参数 λ 相反:
- 低偏差,高方差,即遇到了过拟合时:减小 C 值。
- 高偏差,低方差,即遇到了欠拟合时:增大 C 值。
另外,当 SVM 不适用核函数时,默认的称为线性核函数。当样本数较少而特征较多时一般采用不带核函数的 SVM。当然使用逻辑回归也可以。
当样本数较多而特征数较少时,就需要使用核函数。对于高斯核函数,不同的 σ取值影响也不同:
- σ 较大时,可能会导致低方差,高偏差;
- σ 较小时,可能会导致低偏差,高方差。
当面对多分类问题时,我们可以采用同逻辑回归时的 One Vs ALL 策略。
实际上,由于现在神经网络的计算性能已经得到很大的提升,所以当面对样本数较少特征数较多的情况时,除了使用 SVM 外,我们还可以使用神经网络。
附上课后作业代码实现: