第十三章 支持向量机

该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。

本章含盖

  • 13.1 优化目标
  • 13.2 直观上对大间隔的理解
  • 13.3 大间隔分类器的数学原理
  • 13.4 核函数1
  • 13.5 核函数2
  • 13.6 使用SVM

到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所使用的数据量。这就体现你使用这些算法时的技巧了,比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。

还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

为了描述支持向量机,事实上,我将会从逻辑回归开始展示我们如何做一点点修改来得到一个支持向量机。

如果你观察logistic回归的代价函数,你会发现每个样本(x, y)都会为总的代价函数增加?这样一项

因此对于总的代价函数,我们通常会对所有的训练样本从第1项到第m项进行求和

  • y = 1 的时候

新的代价函数,从 z = 1 开始,右边都是平的(紫色的线),然后再画一条和logistic回归幅度相似的一条直线,但是它是一条直线。 不要太在意左边这条线的斜率,这并不是很重要。这就是当 y = 1 时,我们要使用的新的代价函数。新的代价函数会使支持向量机有计算上的优势,并使得之后的优化问题变得简单。 新的函数叫 cost_1(z)。这个下标 1 表示,y = 1.

  • 当 y = 0 时,我们取 z = -1 开始,左边都是平的

新的函数叫 cost_0(z)。这个下标 0 表示,y = 0.

按照惯例,对于支持向量机来说,一些东西的写法略有不同。比如,代价函数的参数会稍微有些不同。 首先,我们要除去1/m这一项。这是因为,在使用‘支持向量机’和‘logistic回归’的时候,人们遵循的惯例略有不同。我的意思是,我们仅仅是去除 1/m 这一项,这样同样能得到 θ 的最优值。因为 1/m 只是一个常数项,因此在解决这个最小化问题的时候,前面无论是否有 1/m 这一项,我最后都能得到相同的 θ 最优值。

第二个符号上的变化,同样只是相比于logistic回归,这样的表达在SVM中更常用。 在logistic回归中,我们的目标函数有两项。

a)训练样本的代价函数

b)正则化项

因此,对于逻辑回归,在目标函数中,我们有两项:第一个是训练样本的代价,第二个是我们的正则化项,我们不得不去用这一项来平衡。这就相当于我们想要最小化A加上正则化参数λ,然后乘以其他项B对吧?这里的A表示这里的第一项,同时我用B表示第二项,但不包括λ,我们不是优化这里的A+λ×B。我们所做的是通过设置不同正则参数λ达到优化目的。这样,我们就能够权衡对应的项,以使得训练样本拟合的更好,即最小化A。还是保证正则参数足够小,也即更多的关注B项。

对于SVM而言,按照惯例,我们会用一个不同的参数,我们不再用这里的 λ 来控制第一项与第二项的相对权重。而是用一个不同的参数 C,同时改为优化目标为:C×A+B。

在逻辑回归中,如果给定 λ,一个非常大的值,意味着给予B更大的权重。而这里,就对应于将 C 设定为非常小的值,那么,相应的将会给B比给A更大的权重。因此,这只是一种不同的方式来控制这种权衡或者一种不同的方法,即用参数来决定是更关心第一项的优化,还是更关心第二项的优化。

当然你也可以把这里的参数C 想象成是 1/λ。但并不是说,?这两个表达式是相等的。不是说 C = 1/λ,并不是这样。而是说明,如果 C = 1/λ,那么这两个优化目标应该得到相同的值,也就是相同的最优值 θ。

支持向量机的总体优化目标

最后,与logistic回归不同的是,支持向量机并不会输出概率。相对的,我们得到的是,通过优化这个代价函数得到一个参数 θ,而支持向量机的假设函数会直接输出预测结果是 1 或 0. 所以,如果 θ 的转置乘以 X 大于等于 0,那么假设函数就会输出1。反之,输出 0 。

13.2 直观上对大间隔的理解

有时候,“支持向量机”又被称为“大间距分类器”

事实上,如果你有一个正样本y=1,则其实我们仅仅要求 θ^T * X 大于等于0,就能将该样本恰当分出,这是因为如果 θ^T * X>0 大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要 θ^T * X<=0 就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 θ^T * X>0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。

当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。具体而言,我接下来会考虑一个特例。我们将这个常数C设置成一个非常大的值。比如我们假设C的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?

如果 C非常大,则最小化代价函数的时候,我们迫切希望能找到一个值,使得第一项等于 0。让我们试着在这种情况下,理解优化问题。也就是,要怎么做才能使第一项等于0,当我们把C的值设置成非常大的常数。这个例子能够更直观的让我们感受到,支持向量机模型的直观地理解支持向量机学习得到的假设模型是什么样的。

因此,让我们尝试在代价项的第一项为0的情形下理解该优化问题。

我们的代码函数会为:

它的限制条件为:

当 y^(i) = 1 时,Θ^T * x^(i) >= 1 当 y^(i) = 0 时,Θ^T * x^(i) <= -1 这样当你求解这个优化问题的时候,当你最小化这个关于变量θ的函数的时候,你会得到一个非常有趣的决策边界。

比如,这就是一个决策边界(绿色)可以把正样本和负样本分开。但是多多少少这个看起来并不是非常自然是么? 或者我们可以画一条更差的决策界,这是另一条决策边界(粉色),可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。

数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。 然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,而这其实是求解上一页幻灯片上优化问题的结果。 下一节视频会讲到,为什么?这样的优化能得到这条更大间距的黑线。

在本节课中关于大间距分类器,我想讲最后一点:我们将这个大间距分类器中的正则化因子常数C设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。

事实上,支持向量机现在要比这个大间距分类器所体现得更加复杂,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。(粉色线) 在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数C,设置的非常大,那么SVM就会将决策边界从黑线变成这条紫红线。

但如果,你不把C设得那么大,那么最后你得到的还是这条黑线。

当然数据如果不是线性可分的,则支持向量机也会将它们恰当分开。

因此,大间距分类器的描述,只有在正则化参数C非常大的情形,才能让你直观的理解。大间距分类器的作用,同时也提醒你C的作用类似于1/λ,λ是我们之前使用过的正则化参数。这只是C非常大的情形,或者等价地 λ 非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候,当C不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。 回顾 C=1/λ,因此: C 较大时,相当于 λ 较小,可能会导致过拟合,高方差。 C 较小时,相当于 λ 较大,可能会导致低拟合,高偏差。

13.3 大间隔分类器的数学原理

复习:向量内积的性质

『 ||u|| 』:u的范数,或长度(即,这个向量的长度):

||u||表示u的范数,即u的长度,即向量u的欧几里得长度。根据毕达哥拉斯定理,||u||=√(u_1^2 + u_2^2 ),这是向量u的长度,它是一个实数。

现在让我们来看看如何计算u和v之间的内积。这就是具体做法,我们将向量v投影到向量u上,我们做一个直角投影,或者说一个90度投影将其投影到u上,接下来我度量这条红线的长度。我称这条红线的长度为p,因此p就是长度,或者说是向量v投影到向量u上的量(即,p是v投影到向量u上的长度)。

因此可以将u^T * v=p⬝||u||,或者说u的长度。这是计算内积的一种方法。

如果,你弄清楚了p的几何意义。以及u的范数的几何意义,就可以用另一种方法计算出相同的答案。而另一种算法公式是: u^T * v = u_1×v_1+u_2×v_2

u^T * v :将 v 投影到 u 上。 v^T * u :将 u 投影到 v 上。 得到的结果是一样的。 申明一点,在这个等式中u的范数是一个实数,p也是一个实数,因此u^T v就是两个实数正常相乘。

最后一点,需要注意的就是p值,p事实上是有符号的,即它可能是正值,也可能是负值。 u和v之间的夹角大于90度,则如果将v投影到u上,会得到?这样的一个投影,这是p的长度,在这个情形下我们仍然有u^T v是等于p乘以u的范数。唯一一点不同的是p在这里是负的。 在内积计算中,如果u和v之间的夹角小于90度,那么那条红线的长度p是正值。然而如果这个夹角大于90度,则p将会是负的。

我们接下来将会使用这些关于向量内积的性质试图来理解支持向量机中的目标函数。

为了讲解方便,我做一点简化,令θ_0=0;将特征数n置为2,因此我们仅有两个特征x_1,x_2。

当我们仅有两个特征,即n=2时,这个式子可以写作:

我们只有两个参数θ_1,θ_2。你可能注意到括号里面的这一项是向量θ的范数,或者说是向量θ的长度。 当然你可以将其写作θ_0,θ_1,θ_2,如果θ_0=0,那就是θ_1,θ_2的长度。在这里我将忽略θ_0,这样来写θ的范数,它仅仅和θ_1,θ_2有关。但是,数学上不管你是否包含,其实并没有差别,因此在我们接下来的推导中去掉θ_0不会有影响这意味着我们的目标函数是等于 1/2 * ||θ||^2。因此支持向量机做的全部事情,就是极小化参数向量θ范数的平方,或者说长度的平方。

现在,考虑一下这些项 θ^T * x^(i),然后深入理解一下它们的作用

我们考察一个单一的训练样本,我有一个正样本在这里,用一个叉来表示这个样本x^(i), 意思是在水平轴上取值为x_1^(i), 在竖直轴上取值为x_2^(i)。 我将它称为p^(i)用来表示这是第 i 个训练样本在参数向量θ上的投影。

这里表达的意思是:这个 θ^T * x^(i) >= 1 或者 θ^T * x^(i) <= -1 的,约束是可以被 p^(i) * x >= 1 这个约束所代替的。因为 θ^T * x^(i) = p^(i) * ||θ||

需要提醒一点,我们之前曾讲过这个优化目标函数可以被写成等于 1/2 * ||θ||^2

现在,继续使用之前的简化,即θ_0=0,我们来看一下为什么支持向量机不会选择它。 对于?这样选择的参数θ,可以看到参数向量θ事实上是和决策界是90度正交的。

因为:夹角大于90度时,内积为整数;夹角小于于90度时,内积为负数;那么,夹角等于90度时,内积为0。这样,代价函数也会为0。 顺便提一句θ_0=0的简化仅仅意味着决策界必须通过原点(0,0)。

现在让我们看一下这对于优化目标函数意味着什么。

我们假设它是我的第一个样本x^(1), 如果我考察这个样本到参数θ的投影,投影是这个短的红线段,就等于p^(1), 它非常短。类似地,这个样本如果它恰好是x^(2), 我的第二个训练样本,则它到θ的投影在这里。我将它画成粉色,这个短的粉色线段是p^(2), 即第二个样本到我的参数向量θ的投影。因此,这个投影非常短。p^(2) 事实上是一个负值,p^(2) 是在相反的方向,这个向量和参数向量θ的夹角大于90度,p^(2)的值小于0。

我们会发现这些p^(i)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要 p^(i) * ||θ|| >=1 ,但是如果 p^(i)在这里非常小,那就意味着我们需要θ的范数非常大。类似地,对于负样本而言我们需要 p^(i) * ||θ|| <= -1 ,p^(2)会是一个非常小的数,因此唯一的办法就是θ的范数变大。 但是我们的目标函数是希望找到一个参数θ,它的范数是小的。因此,这看起来不像是一个好的参数向量θ的选择。

相反的,来看一个不同的决策边界。比如说,支持向量机选择了这个决策界,现在状况会有很大不同。

垂直线(绿色)是决策界

现在如果你考察你的数据在横轴x上的投影,你会注意到现在p^(1) 和p^(2)这些投影长度是长多了。如果我们仍然要满足这些约束, p^(i) * ||θ|| >=1 ,则因为p^(1)变大了,θ的范数就可以变小了。因此这意味着通过选择这个的决策界,而不是前面的那个,支持向量机可以使参数θ的范数变小很多。 因此,如果我们想令θ的范数变小,从而令θ范数的平方变小,就能让支持向量机选择右边的决策界。这就是支持向量机如何能有效地产生大间距分类的原因。

总结一下,看这条绿线,这个绿色的决策界。我们希望正样本和负样本投影到θ的值足够大。要做到这一点的唯一方式,就是使这条绿线周围保持大间距(这是正样本和负样本之间的间隔)。这个间隔的值就是p^(1), p^(2), p^(3) 等等的值。因此,通过让间距变大,使p^(1), p^(2), p^(3) 的值变大。支持向量机最终可以找到一个较小的θ范数。这正是支持向量机中最小化目标函数的目的。这也就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些p^(i)的范数,它们是训练样本到决策边界的距离。

最后一点,我们的推导自始至终使用了这个简化假设,就是参数θ_0=0。

就像我之前提到的。这个的作用是:θ_0=0的意思是我们让决策界通过原点。如果你令θ_0不是0的话,含义就是你希望决策界不通过原点。我将不会做全部的推导。实际上,支持向量机产生大间距分类器的结论,会被证明同样成立,证明方式是非常类似的,是我们刚刚做的证明的推广。

之前视频中说过,即便θ_0不等于0,支持向量机要做的事情都是优化这个目标函数对应着C值非常大的情况,但是可以说明的是,即便θ_0不等于0,支持向量机仍然会找到正样本和负样本之间的大间距分隔。

当C非常大的情况下,为了最小化 SVM 的目标函数:

我们假设,第一项为0,则,需要的限制条件就是: 当 y^(i) = 1 时,Θ^T * x^(i) >= 1 当 y^(i) = 0 时,Θ^T * x^(i) <= -1

而,同时,我们就能将,次情况下 SVM 的代价函数看做是:

13.4 核函数1

概述: 改造支持向量机方法,来构造复杂的非线性分类器。主要的技术就是称之为核的东西。

非线性分界问题:

一种方法:使用高级数的多项式模型。 另一种方式:我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令: f_1=x_1,f_2=x_2,f_3=x_1 x_2,f_4=x_12,f_5=x_22 ...得到h_θ (x)=f_1+f_2+...+f_n。一种方法:使用高级数的多项式模型。 另一种方式:我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令: f_1=x_1,f_2=x_2,f_3=x_1 x_2,f_4=x_12,f_5=x_22 ...得到h_θ (x)=f_1+f_2+...+f_n。

然而,除了对原有的特征进行组合以外,有没有更好的方法来构造f_1,f_2,f_3?我们可以利用核函数来计算出新的特征。 我们之前看到的这些高阶项是一种得到更多特征的方式。但问题是,我们可以有很多不同的特征选择,或者可能存在比这些高阶多项式更好的特征。因为,我们并不完全清楚这些高阶多项式,是不是我们真正需要的。所以,是否有更好的或不同的特征选择可以放到假设函数中了?

有一个可以构造新特征f_1,f_2,f_3的方法:

假设,只有三个特征,同时我们截取x_0(即,x_0 总是等于 1)

给定一个训练实例x,将 f_1 定义为一种相似度的度量,即,度量训练样本 x 与 第一个标志位 l^(1) 的相似度:

『 ||x - l^(i) ||^2 』:点 x 与标记 l^(i) 之间的欧式距离。

相似度函数就是,用数学家的术语来说就是,一个核函数。这里用的核函数,实际上是高斯核函数。 PS:我们是可以有不同的相识度度量函数的。 然后,我们一般不这么写 ? similarity(x,l(1))。而是用这个记号表示核函数:k(x, l(i))

我们看下核函数到底做了什么?

我们来看第一个标记 l^(1)

这些地标的作用是什么?

如果一个训练实例x与地标L之间的距离近似于0,则新特征 f 近似于?^(−0)=1;即,f 近似于 1. 如果训练实例?与地标?之间距离较远,则?近似于?−(一个较大的数)=0。即,f 近似于 0.

因此,这些特征做的是衡量 x 到标记 l 的相似度。如果 x 非常接近于标记,那么特征 f 非常接近于 1;如果 x 离标记非常远,那么特征 f 非常接近于 0。

我们利用x的各个特征与我们预先选定的地标(landmarks) l(1),l(2),l^(3)的近似程度来选取新的特征f_1,f_2,f_3。

假设,我们有两个特征变量 x_1 和 x_2,σ^2 = 1 f_1 是图中的纵坐标。给定一个特定的样本 x(红色)。在这个高度上可以看到f_1相应的值。即 x 到 l^(1) 的距离。 l^(1) 即,图中的峰值。 ?的3D曲线图,即为 给定样本 x 到 l^(1) 的距离。因此,当 x =[3;5]的时候,它就处于峰值,纵坐标的值就为1,即,f_1 = 1 当它离 [3;5] 越远时,值也就约解决 0。即,f_1 = 0.

这就是特征 f_1 : 它衡量了 x 到第一个标记有多近。这个值在 0 到 1 之间。

我们还要讲的内容是:我们可以看到改变 σ^2 的值能产生多大的影响。

σ^2 是高斯函数的参数。当你改变它,你会得到略微不同的结果。 假设,σ^2 = 0.5 ,你会发现 曲线图还是类似的,只是这个突起的宽度变窄了。因此,当 σ^2 变小时,我们从峰值开始往周围移动,特征 f_1 下降到 0 的速度会变得更快;与此相反,当你增大 σ^2 的值的时候,那么我们从 峰值 开始往周围移动,特征 f_1 下降到 0 的速度会变慢。

因此,讲完特征的定义,我们看看,能得到什么样的预测函数。 给出一个样本 x ,我们准备计算出三个特征变量。同时假设,我们已经知道 θ 参数的值。

紫红色 样本 得到的 预测结果是 1;蓝色 样本 得到的 预测结果是 0 实际上,如果你观察这个决策边界,我们会发现,对于接近 l^(1) 和 l^(2) 的点,我们的预测值是1,反之为0. 最终,我们会得到这个预测函数的判别边界(红线)。这就是我们如何定义 标记点 和 核函数,来训练出非常复杂的非线性决策边界的方法。(我们通过 标记点 和 核函数 来定义新的特征变量,从而训练复杂的非线性边界),我们可以将通过此得到的新的特征变量 f 用在支持向量机中。

13.5 核函数2

选择标记点:

在实际应用时,在给定学习问题中,怎么选取标记点? 我们的数据集中,有一些正样本和一些负样本。我们通常是根据训练集的数量选择地标的数量,即如果训练集中有m个实例,则我们选取m个地标,并且令:l^(1) = x^(1), l^(2) = x^(2), ....., l^(m) = x^(m)。这样做的好处在于:这说明特征函数基本上是在描述每一个样本距离到样本集中其他样本的距离。

给定样本 x ,可以属于 交叉验证集 或者属于 测试集。

现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:

那么 f 向量,就是用于描述训练样本的特征向量。 每个 特征 f 都是一个向量,向量维度就是 m + 1。

当给定核函数(相识度函数)后,我们如何使用简单的支持向量机?

f ∈ R^(m+1) : f 是 m+1 维向量。因为,我们有 m 个样本,再加上一个 f_0. Θ ∈ R^(m+1) : 参数向量为 m+1维。是因为,我们有 m 个 特征变量变量 f。 以上就是,已知参数 θ 时,怎么做出预测的过程。

但是,怎么得到参数 θ 了? 当你使用 SVM 学习算法,尤其是,当你解决?这个最小化问题的时候,你已经最小化了参数 θ 。在 C 倍的该代价函数中。

现在,我们先不使用“ θ^T * x^(i) ”和 “原始特征”,而是用“ θ^T * f^(i) ”代替 来做预测。

那么通过解决?这个最小化问题,你就得到了支持向量机的参数。最后的细节就是,因为这个优化问题,我们有 n 个特征,我们实际上有效的特征量就是 f 维度的数量。因此 n = m。 如果,f 并不是新特征变量,那么 n = m + 1。 这个 +1 来自于 截距。同时,正则化项,并不对 θ_0 进行惩罚,因为 θ_0 始终为 1 。所以,j 从 1 开始。

但是,在支持向量机算法上,我们做?这样的 修改:

,如果我们忽略 θ_0 的话。

同时,大多数支持向量机在实现的时候,我们使用 θ^T * M * θ 替换 θ^T * θ,其中M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。 θ^T * M * θ :这其实是另一种略有区别的距离度量方法。 我们使用这个略有区别的度量方法来取代 θ 模的平方( θ^T * θ = || θ ||^2 )。 这意味着,我们最小化了一种类似的度量,这个参数 θ 的缩放版本,并取决于核函数。 ?这个数学细节(即,θ^T * M * θ ),使得支持向量机能够更有效率的运行。

那,为什么支持向量机做这种修改,可以使它应用更大的训练集? 因为,比如,当你的训练集有 10000 个样本时,那么我们将会有 10000 个标记点。θ 也就是 10000 维向量。或许,这时这么做还行,但是,当 m 非常非常非常大时,那么求解这么多参数,对于支持向量机的优化程序而言。这时求解这些参数的最小化问题的代价会非常高。而 “M*θ” ,实际上细微改变了最后一项,使得最终的优化目标 与 直接最小化 θ模的平方 略有区别。 你可以认为,这个具体的实现细节尽管略微的改变了优化目标,但它主要是为了计算效率

btw,你可能会想为什么我们不将核函数的这个想法应用到其他算法,比如逻辑回归上。事实证明,如果你愿意的话,确实可以将核函数这个想法应用于定义特征向量,将标记点之类的技术用于逻辑回归算法。 但是用于支持向量机的计算技巧不能较好的推广到其他算法,诸如逻辑回归上。 所以,将核函数应用于逻辑回归时会变得非常慢。相比之下,这些计算技巧(比如,具体化技术 θ^T * M * θ 对这些细节的修改以及支持向量软件的实现细节,使得支持向量机可以和核函数相得益彰。而逻辑回归和核函数则运行得十分缓慢。更何况它们还不稳定,使用那些高级优化技巧,因为这些技巧是人们专门为使用核函数的支持向量机开发的。

如,前面所说,我不建议自己写矩阵求逆函数,或者平方根函数,以及最小化代价函数的代码。而应该使用人们开发的成熟的软件包。

另一个值得说明的问题是,在你使用支持向量机时,怎么选择支持向量机中的参数(C)??

C=1/λ

C 较大时,相当于λ较小,可能会导致过拟合,高方差; C 较小时,相当于λ较大,可能会导致低拟合,高偏差;

以及,高斯函数中 σ^2 参数的选择:

σ较大时,可能会导致低方差,高偏差; (曲线更平滑) σ较小时,可能会导致低偏差,高方差。 (曲线更陡)

13.6 使用SVM

推荐的高优化软件库:liblinear 和 libsvm

尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事: 1、参数C的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。 2、你也需要选择内核参数(如果使用核函数的话)或你想要使用的相似函数(核函数),其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)。

如果相较于m而言,n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。

目前,“高斯核函数”和“线性核函数”是两个最常用的核函数

一个实现函数的注意事项,如果你有大小很不一样的特征变量。很重要的一件事就是,在使用高斯函数之前,将这些特征变量的大小按比例归一化。 比如,特征1(x_1)是房屋价格,特征2(x_2)是房间数。如果,你直接这么使用的话,那么在这个式子中 || x-l ||^2 的距离将几乎都是由房子的大小来决定的,从而忽略了卧室的数量。 因为,为了避免这个情况,就需要进一步的缩放比例。这将会保证SVM能考虑到所有不同的特征变量。

目前,“高斯核函数”和“线性核函数”是两个最常用的核函数。这里有一个警告,不是所有你可能提出来的相似函数都是有效的核函数。高斯函数和线性核函数,以及你有时可能会用到的核函数。这些函数都需要满足一个技术条件,它叫作“Mercer”定理,需要满足这个条件的原因是:因为支持向量机算法或者SVM的实现函数有许多熟练的数值优化技巧。为了有效地求解参数 θ,在最初的设想里,这些决策都用以将我们的注意力仅仅限制在可以满足“Mercer”定理的核函数上。这个定理所做的是,确保所有的SVM包,所有的SVM软件包能够用大类的优化方法并从而迅速得到参数 θ 。因此,大部分人要做的就是用线性核函数或者高斯核函数。但是也有其他的几个核函数也是满足“Mercer”定理。

在高斯核函数之外我们还有其他一些选择,如:

多项式核函数(Polynomial Kernel) : k(x, l) = ( x ^T * l)^2 ? 这是多项式核函数的一种形式;上面是 x 与 l 的相识度的估量。如果,x 和 l 相互之间很接近,那么这个内积会很大。 k(x, l) = ( x ^T * l)^3 k(x, l) = ( x ^T * l + 1)^3 k(x, l) = ( x ^T * l + 5)^4 ? 这是多项式核函数的其他形式; 多项式内核函数实际上有2个参数。 一个是 “+”的参数;一个是 “次方数” 它的一般形式:k(x, l) = ( x ^T * l + constant)^degree "多项式核函数”通常情况下效果都比较差,与高斯核函数相比,使用的不多。它通常用在,当数据 x 和 l 都是严格的非负数时。这样以保证,内积永远不会是负数

字符串核函数(String kernel) 卡方核函数( chi-square kernel) 直方图交集核函数(histogram intersection kernel) 等等... 这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer's定理,才能被支持向量机的优化软件正确处理。

多类分类问题

假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有k个类,则我们需要k个模型,以及k个参数向量θ。我们同样也可以训练k个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。 尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事: 1、参数C的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。 2、你也需要选择内核参数(如果使用核函数的话)或你想要使用的相似函数(核函数),其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)。

逻辑回归 vs SVM

从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢? 下面是一些普遍使用的准则: n为特征数,m为训练样本数。 (1)如果相较于m而言,n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。 (2)如果n较小,而且m大小中等,例如n在 1-1000 之间,而m在10-10000之间,使用高斯核函数的支持向量机。 (3)如果n较小,而m较大,例如n在1-1000之间,而m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。 今天的SVM包会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集,特别是在使用高斯核函数是在这种情况下。因此,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。如果你看到这个幻灯片,看到了逻辑回归,或者不带核函数的支持向量机。在这个两个地方,我把它们放在一起是有原因的。原因是:逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核函数的SVM,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的SVM另一个也很有可能很有效。但是随着SVM的复杂度增加,当你使用不同的内核函数来学习复杂的非线性函数时,这个体系,你知道的,当你有多达1万(10,000)的样本时,也可能是5万(50,000),你的特征变量的数量这是相当大的。那是一个非常常见的体系,也许在这个体系里,不带核函数的支持向量机就会表现得相当突出。你可以做比这困难得多需要逻辑回归的事情。 最后,神经网络使用于什么时候呢? 对于所有的这些问题,对于所有的这些不同体系一个设计得很好的神经网络也很有可能会非常有效。有一个缺点是,或者说是有时可能不会使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果你有一个非常好的SVM实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此之前没有展示,但是事实证明,SVM具有的优化问题,是一种凸优化问题。因此,好的SVM优化软件包总是会找到全局最小值,或者接近它的值。对于SVM你不需要担心局部最优。在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用SVM的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比SVM慢,尤其是在这样一个体系中,至于这里给出的参考,看上去有些模糊,如果你在考虑一些问题,这些参考会有一些模糊,但是我仍然不能完全确定,我是该用这个算法还是改用那个算法,这个没有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是就如在之前的视频中看到的算法确实很重要。但是通常更加重要的是:你有多少数据,你有多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是SVM这方面更加重要。但是,已经说过了,SVM仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含了什么时候一个有效的方法去学习复杂的非线性函数。因此,实际上与逻辑回归、神经网络、SVM一起使用这些方法来提高学习算法,我认为你会很好地建立很有技术的状态。(编者注:当时GPU计算比较慢,神经网络还不流行。)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券