支持向量机(Support Vector Machines)
在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法 A 还是学习算法 B,而更重要的是,
应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的水平。
比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。
还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。
与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。
与Logistics回归成本函数的不同:
1、删去常量 1/m ;
2、Logistic:A+λ×B,SVM: C×A+B。如果给定λ一个非常大的值,意味着给予 B 更大的权重。而这里,就对应于将 C 设定为非常小的值,那么,相应的将会给 B 比给 A 更大的权重。因此,这只是一种不同的方式来控制这种权衡或者一种不同的方法, 即用参数来决定是更关心第一项的优化, 还是更关心第二项的优化。当然你也可以把这里的参数 C 考虑成 1/λ,同 1/λ 所扮演的角色相同。
3、Logistic输出概率,SVM直接预测y的值为0还是1。
成本函数:
接下来会考虑一个特例:将常数 C 设置成一个非常大的值。
比如假设 C 的值为100000 或者其它非常大的数,然后来观察支持向量机会给出什么结果?
如果 C 非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为 0 的最优解。即不希望出现分错的点,相当于过拟合。
此时,两类点完全分类正确。黑线有更大的距离,这个距离叫做间距 (margin)。
当画出这两条额外的蓝线,看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距, 而这是支持向量机具有鲁棒性的原因, 因为它努力用一个最大间距来分离样本。 因此支持向量机有时被称为大间距分类器,。
将这个大间距分类器中的正则化因子常数 C 设置的非常大,我记得我将其设置为了 100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。 那么在让代价函数最小化的过程中,我们希望找出在 y=1 和 y=0 两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这 样的参数,则我们的最小化问题便转变成:
事实上, 支持向量机现在要比这个大间距分类器所体现得更成熟。
尤其是当你使用大间距分类器的时候,你的学习算法会受异常点 (outlier) 的影响。
在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到这条粉色的线,仅仅基于一个异常值就将决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数 C,设置的非常大,这事实上正是支持向量机将会做的。
但是如果 C 设置的小一点,则你最终会得到这条黑线。
因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数 C 非常大的情形,同时,要提醒你 C 的作用类似于 1/λ,λ是我们之前使用过的正则化参数。这只是C 非常大的情形,或者等价地λ非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候,当 C 不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
回顾 C=1/λ,因此:
C 较大时,相当于 λ 较小,可能会导致过拟合,高方差。
C 较小时,相当于 λ 较大,可能会导致低拟合,高偏差。
这节课给出了一些关于为什么支持向量机被看做大间距分类器的直观理解。它用最大间距将样本区分开,尽管从技术上讲,这只有当参数 C 是非常大的时候是真的,但是它对于理解支持向量机是有益的。
—————————————————————————————————————————————————————————
Mathematics Behind Large Margin Classification
—————————————————————————————————————————————————————————————————————————————
核函数
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
为了获得上图所示的判定边界,我们的模型可能是:
可以用一系列的新的特征 f 来替换模型中的每一项。例如令:
得到 hθ(x)=f1+f2+...+fn。
然而,除了对原有的特征进行组合以外,有没有更好的方法来构造 f1,f2,f3?
可以利用核函数来计算出新的特征。
这里是一个高斯核函数(Gaussian Kernel)。
注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。
如果使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。
另外, 支持向量机也可以不使用核函数, 不使用核函数又称为线性核函数 (linear kernel)。
当不采用非常复杂的函数, 或者训练集特征非常多而实例非常少的时候, 可以采用这种不带核函数的支持向量机。
支持向量机的两个参数 C 和 σ 的影响:
C 较大时,相当于 λ 较小,可能会导致过拟合,高方差;
C 较小时,相当于 λ 较大,可能会导致低拟合,高偏差;
σ 较大时,导致高方差;
σ 较小时,导致高偏差。
—————————————————————————————————————————————————————————
使用支持向量机
强烈建议使用高优化软件库中的一个, 而不是尝试自己落实一些数据。
有许多好的软件库,我正好用得最多的两个是 liblinear 和 libsvm。
在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等...
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征。
这些核函数需要满足 Mercer's 定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。 如果一共有 k 个类, 则我们需要 k 个模型,以及 k 个参数向量 θ。我们同样也可以训练 k 个支持向量机来解决多类分类问题。 但是大多数支持向量机软件包都有内置的多类分类功能, 我们只要直接使用即可。
尽管你不去写你自己的 SVM(支持向量机)的优化软件,但是你也需要做几件事:
1、是提出参数 C 的选择。即误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。
Logistics和SVM该如何选择:
下面是一些普遍使用的准则:
m 为训练样本数,n 为特征数。
(1)如果相较于 m 而言,n 要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果 n 较小,而且 m 大小中等,例如 n 在 1-1000 之间,而 m 在 10-10000 之间,使用高斯核函数的支持向量机。
(3)如果 n 较小,而 m 较大,例如 n 在 1-1000 之间,而 m 大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
逻辑回归和不带核函数的支持向量机它们都是非常相似的算法, 不管是逻辑回归还是不带核函数的 SVM,通常都会做相似的事情,并给出相似的结果。
值得一提的是, 神经网络在以上三种情况下都可能会有较好的表现, 但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
通常更加重要的是:你有多少数据,你有多熟练是否擅长做误差分析和排除学习算法, 指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是 SVM 这方面更加重要。