支持向量机

SMO高效优化算法
接下来,我们根据6.2.1节中的后两个式子进行优化,其中一个是小化的目标函数,一个 是在优化过程中必须遵循的约束条件。不久之前,人们还在使用二次规划求解工具(quadratic solver)来求解上述优化问题,这种工具是一种用于在线性约束下优化具有多个变量的二次目 标函数的软件。而这些二次规划求解工具则需要强大的计算能力支撑,另外在实现上也十分复杂。 所有需要做的围绕优化的事情就是训练分类器,一旦得到alpha的优值,我们就得到了分隔超平 面(2维平面中就是直线)并能够将之用于数据分类。 下面我们就开始讨论SMO算法,然后给出一个简化的版本,以便读者能够正确理解它的工作 流程。后一节将会给出SMO算法的完整版,它比简化版的运行速度要快很多。

Platt的 SMO算法 1996年,John Platt发布了一个称为SMO①的强大算法,用于训练SVM。SMO表示序列最小优 化(Sequential Minimal Optimization)。Platt的SMO算法是将大优化问题分解为多个小优化问题来 求解的。这些小优化问题往往很容易求解,并且对它们进行顺序求解的结果与将它们作为整体来 求解的结果是完全一致的。在结果完全相同的同时,SMO算法的求解时间短很多。 SMO算法的目标是求出一系列alpha和b,一旦求出了这些alpha,就很容易计算出权重向量w 并得到分隔超平面。 SMO算法的工作原理是:每次循环中选择两个alpha进行优化处理。一旦找到一对合适的 alpha,那么就增大其中一个同时减小另一个。这里所谓的“合适”就是指两个alpha必须要符合 一定的条件,条件之一就是这两个alpha必须要在间隔边界之外,而其第二个条件则是这两个alpha 还没有进行过区间化处理或者不在边界上。
6.3.2 应用简化版 SMO算法处理小规模数据集 Platt SMO算法的完整实现需要大量代码。在接下来的第一个例子中,我们将会对算法进行 简化处理,以便了解算法的基本工作思路,之后再基于简化版给出完整版。简化版代码虽然量少 但执行速度慢。Platt SMO算法中的外循环确定要优化的佳alpha对。而简化版却会跳过这一部 分,首先在数据集上遍历每一个alpha,然后在剩下的alpha集合中随机选择另一个alpha,从而构 建alpha对。这里有一点相当重要,就是我们要同时改变两个alpha。之所以这样做是因为我们有 一个约束条件:

利用完整 Platt SMO算法加速优化
在几百个点组成的小规模数据集上,简化版SMO算法的运行是没有什么问题的,但是在更大 的数据集上的运行速度就会变慢。刚才已经讨论了简化版SMO算法,下面我们就讨论完整版的 Platt SMO算法。在这两个版本中,实现alpha的更改和代数运算的优化环节一模一样。在优化过 程中,唯一的不同就是选择alpha的方式。完整版的Platt SMO算法应用了一些能够提速的启发方 法。或许读者已经意识到,上一节的例子在执行时存在一定的时间提升空间。 Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之 间进行交替:一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描。而所谓非边界alpha指的就是那些不等于边界0或C的alpha值。对整个数据集的扫描相当 容易,而实现非边界alpha值的扫描时,首先需要建立这些alpha值的列表,然后再对这个表进行 遍历。同时,该步骤会跳过那些已知的不会改变的alpha值。 在选择第一个alpha值后,算法会通过一个内循环来选择第二个alpha值。在优化过程中,会 通过最大化步长的方式来获得第二个alpha值。在简化版SMO算法中,我们会在选择j之后计算错 误率Ej。但在这里,我们会建立一个全局的缓存用于保存误差值,并从中选择使得步长或者说 Ei-Ej大的alpha值
首要的事情就是建立一个数据结构来保存所有的重要值,而这个过程可以通过一个对象来完 成。这里使用对象的目的并不是为了面向对象的编程,而只是作为一个数据结构来使用对象。在 将值传给函数时,我们可以通过将所有数据移到一个结构中来实现,这样就可以省掉手工输入的 麻烦了。而此时,数据就可以通过一个对象来进行传递。实际上,当完成其实现时,可以很容易 通过Python的字典来完成。但是在访问对象成员变量时,这样做会有更多的手工输入操作,对比 一下myObject.X和myObject[‘X’]就可以知道这一点。为达到这个目的,需要构建一个仅包含 init方法的optStruct类。该方法可以实现其成员变量的填充。除了增加了一个m×2的矩阵成 员变量eCache之外 ,这些做法和简化版SMO一模一样。eCache的第一列给出的是eCache是 否有效的标志位,而第二列给出的是实际的E值。 对于给定的alpha值,第一个辅助函数calcEk()能够计算E值并返回。以前,该过程是采用内嵌 的方式来完成的,但是由于该过程在这个版本的SMO算法中出现频繁,这里必须要将其单独拎出来。 下一个函数selectJ()用于选择第二个alpha或者说内循环的alpha值 。回想一下,这里的 目标是选择合适的第二个alpha值以保证在每次优化中采用大步长。该函数的误差值与第一个 alpha值Ei和下标i有关。首先将输入值Ei在缓存中设置成为有效的。这里的有效(valid)意味着 它已经计算好了。在eCache中,代码nonzero(oS.eCache[:,0].A)[0]构建出了一个非零表。 NumPy函数nonzero()返回了一个列表,而这个列表中包含以输入列表为目录的列表值,当然 读者可以猜得到,这里的值并非零。nonzero()语句返回的是非零E值所对应的alpha值,而不是 E值本身。程序会在所有的值上进行循环并选择其中使得改变大的那个值 。如果这是第一次 循环的话,那么就随机选择一个alpha值。当然,也存在有许多更复杂的方式来处理第一次循环的 情况,而上述做法就能够满足我们的目的。 程序清单6-3的后一个辅助函数是updateEk(),它会计算误差值并存入缓存当中。在对 alpha值进行优化之后会用到这个值。 程序清单6-3中的代码本身的作用并不大,但是当和优化过程及外循环组合在一起时,就能 组成强大的SMO算法。 接下来将简单介绍一下用于寻找决策边界的优化例程。打开文本编辑器,添加下列清单中的 代码。在前面,读者已经看到过下列代码的另外一种形式。

利用核函数将数据映射到高维空间 数据点处于一个圆中,人类的大脑能够意识到这一点。然而,对于分类器而言, 它只能识别分类器的结果是大于0还是小于0。如果只在x和y轴构成的坐标系中插入直线进行分类 的话,我们并不会得到理想的结果。我们或许可以对圆中的数据进行某种形式的转换,从而得到 某些新的变量来表示数据。在这种表示情况下,我们就更容易得到大于0或者小于0的测试结果。 在这个例子中,我们将数据从一个特征空间转换到另一个特征空间。在新空间下,我们可以很容 易利用已有的工具对数据进行处理。数学家们喜欢将这个过程称之为从一个特征空间到另一个特 征空间的映射。在通常情况下,这种映射会将低维特征空间映射到高维空间。 这种从某个特征空间到另一个特征空间的映射是通过核函数来实现的。读者可以把核函数想 象成一个包装器(wrapper)或者是接口(interface),它能把数据从某个很难处理的形式转换成 为另一个较容易处理的形式。如果上述特征空间映射的说法听起来很让人迷糊的话,那么可以将 它想象成为另外一种距离计算的方法。前面我们提到过距离计算的方法。距离计算的方法有很多 种,不久我们也将看到,核函数一样具有多种类型。经过空间转换之后,我们可以在高维空间中 解决线性问题,这也就等价于在低维空间中解决非线性问题。 SVM优化中一个特别好的地方就是,所有的运算都可以写成内积(inner product,也称点积) 的形式。向量的内积指的是两个向量相乘,之后得到单个标量或者数值。我们可以把内积运算替 换成核函数,而不必做简化处理。将内积替换成核函数的方式被称为核技巧(kernel trick)或者 核“变电”(kernel substation)。 核函数并不仅仅应用于支持向量机,很多其他的机器学习算法也都用到核函数。接下来,我 们将要来介绍一个流行的核函数,那就是径向基核函数。 6.5.2 径向基核函数 径向基函数是SVM中常用的一个核函数。径向基函数是一个采用向量作为自变量的函数,能 够基于向量距离运算输出一个标量。这个距离可以是从<0,0>向量或者其他向量开始计算的距离。 接下来,我们将会使用到径向基函数的高斯版本,
其中 是用户定义的用于确定到达率(reach)或者说函数值跌落到0的速度参数。 上述高斯核函数将数据从其特征空间映射到更高维的空间,具体来说这里是映射到一个无穷 维的空间。关于无穷维空间,读者目前不需要太担心。高斯核函数只是一个常用的核函数,使用 者并不需要确切地理解数据到底是如何表现的,而且使用高斯核函数还会得到一个理想的结果。 在上面的例子中,数据点基本上都在一个圆内。对于这个例子,我们可以直接检查原始数据,并 意识到只要度量数据点到圆心的距离即可。
然而,如果碰到了一个不是这种形式的新数据集,那 么我们就会陷入困境。在该数据集上,使用高斯核函数可以得到很好的结果。当然,该函数也可 以用于许多其他的数据集,并且也能得到低错误率的结果。

6.7 本章小结
支持向量机是一种分类器。之所以称为“机”是因为它会产生一个二值决策结果,即它是一种 决策“机”。支持向量机的泛化错误率较低,也就是说它具有良好的学习能力,且学到的结果具有 很好的推广性。这些优点使得支持向量机十分流行,有些人认为它是监督学习中好的定式算法。
支持向量机试图通过求解一个二次优化问题来大化分类间隔。在过去,训练支持向量机常 采用非常复杂并且低效的二次规划求解方法。John Platt引入了SMO算法,此算法可以通过每次只 优化2个alpha值来加快SVM的训练速度。本章首先讨论了一个简化版本所实现的SMO优化过程,接着给出了完整的Platt SMO算法。相对于简化版而言,完整版算法不仅大大地提高了优化的速 度,还使其存在一些进一步提高运行速度的空间。有关这方面的工作,一个经常被引用的参考文 献就是“Improvements to Platt’s SMO Algorithm for SVM Classifier Design”①。 核方法或者说核技巧会将数据(有时是非线性数据)从一个低维空间映射到一个高维空间, 可以将一个在低维空间中的非线性问题转换成高维空间下的线性问题来求解。核方法不止在SVM 中适用,还可以用于其他算法中。而其中的径向基函数是一个常用的度量两个向量距离的核函数。 支持向量机是一个二类分类器。当用其解决多类问题时,则需要额外的方法对其进行扩展。 SVM的效果也对优化参数和所用核函数中的参数敏感。 下一章将通过介绍一个称为boosting的方法来结束我们有关分类的介绍。读者不久就会看到, 在boosting和SVM之间存在着许多相似之处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值