此系列为 Coursera 网站Andrew Ng机器学习课程个人学习笔记(仅供参考)
课程网址:https://www.coursera.org/learn/machine-learning
支持向量机(Support Vector Machine,SVM)是一个广泛应于在工业界和学术界的分类算法。与逻辑回归和神经网络相比,它在学习非线性复杂方程上提供了一种更加清晰、更加有效的思路。这一部分我们就来介绍这一算法。
为了描述支持向量机,我们会先从逻辑回归开始讲起,再一点一点修正得到最后的支持向量机。
在逻辑回归中,我们已经熟悉了如下所示的假设函数 hθ(x) 和逻辑函数曲线:
(1)如果 y=1,上式中只有第一项起作用,第二项为 0。此时,画出函数图像:
(2)如果 y=0,上式中只有第二项起作用,第一项为 0,此时代价随 z的变化曲线如下图所示:
此时,我们也可以用两条线段代替如上曲线,作为新的代价函数 cost0(z) ,如下图桃红色部分:
我们接下来就通过 cost1(z)、 cost0(z) 构建支持向量机。
由于无论是否有 1/m 都不会影响最小化的结果,在使用支持向量机时,我们常常忽略 1/m。
对于逻辑回归正则化代价函数,我们可以用 A+λB 来表示,其中A 表示训练样本的代价,B 表示正则化项,通过设置λ的值来控制 A和B之间的平衡 ,使拟合效果更好。
而支持向量机则采用另一个参数 C来控制 A和B之间的平衡,优化目标为:CA+B。
有时,人们会将支持向量机称为最大间距分类器,这一部分会给大家解释其中原因,这样我们对SVM的假设得到一个更直观的理解。
上面的式子是SVM的优化目标(代价函数),中间左图是 cost1(z) 的图像,右侧是 cost0(z) 的图像。
我们来看怎样使得上面的代价函数最小:
现在再来考虑我们的优化问题,我们可以选择一个参数使得 A=0,SVM的优化目标就转化为:
SVM的这个要求会对决策边界有什么影响呢?
以一个线性可分数据集为例,有多条直线可以把正样本与负样本分开,如下图:
SVM会趋于以黑色决策边界来分离正、负样本,因为黑色线与训练样本之间有更大的最短距离,在分离正负样本上的表现会更好。而粉色线和绿色线离样本比较近,在分离样本时表现就会比较差。SVM总是努力用最大间距(margin)来分离样本,这也是它为什么被称为大间距分类器,同时这也是SVM具有鲁棒性的原因。
事实上,SVM比大间距分类器表现得更成熟,比如异常点的影响,如图:
参数C 控制着对误分类的训练样本的惩罚,当我们将参数 C 设置的较大时,优化过程会努力使所有训练数据被正确分类,这会导致仅仅因为一个异常点决策边界就能从黑色线变成粉色线,这是不明智的。SVM可以通过将参数 C 设置得不太大而忽略掉一些异常的影响,这样以来,对于这个例子,我们仍然会得到黑线代表的决策边界。即使训练样本不是如上图那样线性可分,SVM也能将它们恰当地分开。这里,C 的作用类似于 1λ。
这一部分内容涉及到向量内积部分的知识,可以自行复习一下。
我们来看对于下面的数据集,SVM会选择哪种决策边界(假设 θ0=0)。
(1)小间距决策边界
如图,绿色直线为决策边界,这个决策边界离样本的距离很近。根据前面所说,SVM不会选择小间距决策边界,我们来看看为什么。
由于这种小间距决策边界的选择与SVM的优化目标不符,故SVM不会选择这种决策边界。
(2)大间距决策边界
如果选用下图绿色线作为决策边界:
反过来看,通过在优化目标里让 ∥θ∥ 不断变小,SVM就可以选择出上图所示的大间距决策边界。这也是SVM可以产生大间距分类器的原因。
以上我们都是假设 θ0=0,这会让决策边界通过原点,幸运的是即使 θ0≠0,SVM会产生大间距分类仍然是成立的,但这里我们不做证明。
例如假设函数:
之前在多项式回归中也提到,加入这些高阶项,我们可以得到更多的特征变量,但是我们并不知道这些高阶项是否是我们真正想要的,在计算机视觉中,输入是很多像素,如果用这些高阶项作为特征变量,运算量将会变得非常大。那么,对于SVM,有没有比这些高阶项更好的特征项?
给定 x,我们可以提前手动选取一些标记点,然后根据与这些标记点的接近程度来计算新的特征项。如下图手动选择了3个标记点 l(1),l(2),l(3),如下图:
这种相似度,用数学术语来说,就是核函数(Kernels)。核函数有不同的种类,其中常用的就是我们上述这种高斯核函数。
在具体实现时,我们不需要自己编写代码来最优化参数 θ,而是使用SVM软件包(如:liblinear,libsvm等)来最优化参数 θ。
当然了,在使用这些软件包时,我们需要自己选择参数 C 以及选择使用哪种核函数。
例如:选用线性核函数(即,没有使用核函数),若 θ0+θ1f1+θ2f2+θ3f3⩾0,则 hθ(x)=1。最终这会产生一个线性分类器。liblinear就是使用线性核函数。
如果特征数 n 很大,而训练样本数 m 很小,使用线性核函数产生一个线性分类器就较为适合,不容易过拟合。
如果特征数 n 很小,而训练样本数 m 很大,就适合用一个核函数去实现一个非线性分类器,高斯核函数是个不错的选择。
核函数还有一些其他选择,需要注意的是,不是所有的相似度函数都是有效的核函数,要成为有效的核函数,需要满足默塞尔定理(Mercer’s Theorem)这个技术条件。
还有一些其他核函数如:多项式核函数,字符串核函数、卡方核函数等等,但大多数时候我们用的还是高斯核函数。
我们如何选择使用SVM还是逻辑回归来解决分类问题?
①如果特征数 n 相对于训练样本数 m 来说很大:
则应该使用逻辑回归或者线性核函数(无核)的SVM。 m 较小时,使用线性分类器效果就挺不错了,并且也没有足够的数据去拟合出复杂的非线性分类器。
②如果特征数 n 很小,训练样本数 m 中等大小:
则应该使用高斯核函数SVM。
③如果特征数 n 很小,训练样本数 m 很大:则高斯核函数的SVM运行会很慢。这时候应该创建更多的特征变量,然后再使用逻辑回归或者线性核函数(无核)的SVM。
对于以上这些情况,神经网络很可能做得很好,但是训练会比较慢。实际上SVM的优化问题是一种凸优化问题,好的SVM优化软件包总是能找到全局最小值或者是接近全局最小的值。