smv(五)smo算法

2023-10-29 18:40
文章标签 算法 smo smv

本文主要是介绍smv(五)smo算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

11 SMO优化算法(Sequential minimal optimization)

SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》了。

我拜读了一下,下面先说讲义上对此方法的总结。

首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:

clip_image001

要解决的是在参数clip_image003上求最大值W的问题,至于clip_image005clip_image007都是已知数。C由我们预先设定,也是已知数。

按照坐标上升的思路,我们首先固定除clip_image009以外的所有参数,然后在clip_image009[1]上求极值。等一下,这个思路有问题,因为如果固定clip_image009[2]以外的所有参数,那么clip_image009[3]将不再是变量(可以由其他值推出),因为问题中规定了

clip_image010

因此,我们需要一次选取两个参数做优化,比如clip_image009[4]clip_image012,此时clip_image012[1]可以由clip_image009[5]和其他参数表示出来。这样回带到W中,W就只是关于clip_image009[6]的函数了,可解。

这样,SMO的主要步骤如下:

clip_image013

意思是,第一步选取一对clip_image015clip_image017,选取方法使用启发式方法(后面讲)。第二步,固定除clip_image015[1]clip_image017[1]之外的其他参数,确定W极值条件下的clip_image015[2]clip_image017[2]clip_image015[3]表示。

SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。

下面讨论具体方法:

假设我们选取了初始值clip_image003[1]满足了问题中的约束条件。接下来,我们固定clip_image019,这样W就是clip_image009[7]clip_image012[2]的函数。并且clip_image009[8]clip_image012[3]满足条件:

clip_image020

由于clip_image019[1]都是已知固定值,因此为了方面,可将等式右边标记成实数值clip_image022

clip_image023

clip_image025clip_image027异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1。如下图:

image

横轴是clip_image009[9],纵轴是clip_image012[4]clip_image009[10]clip_image012[5]既要在矩形方框内,也要在直线上,因此

clip_image044clip_image046

同理,当clip_image025[1]clip_image027[1]同号时,

clip_image048clip_image050

然后我们打算将clip_image009[11]clip_image012[6]表示:

clip_image051

然后反代入W中,得

clip_image052

展开后W可以表示成clip_image054。其中a,b,c是固定值。这样,通过对W进行求导可以得到clip_image012[7],然而要保证clip_image012[8]满足clip_image056,我们使用clip_image058表示求导求出来的clip_image012[9],然而最后的clip_image012[10],要根据下面情况得到:

clip_image059

这样得到clip_image061后,我们可以得到clip_image009[12]的新值clip_image063

下面进入Platt的文章,来找到启发式搜索的方法和求b值的公式。

这边文章使用的符号表示有点不太一样,不过实质是一样的,先来熟悉一下文章中符号的表示。

文章中定义特征到结果的输出函数为

clip_image064

与我们之前的clip_image066实质是一致的。

原始的优化问题为:

clip_image067

求导得到:

clip_image068

经过对偶后为:

clip_image069

s.t. clip_image070

clip_image071

这里与W函数是一样的,只是符号求反后,变成求最小值了。clip_image073clip_image075是一样的,都表示第i个样本的输出结果(1或-1)。

经过加入松弛变量clip_image077后,模型修改为:

clip_image078

clip_image079

由公式(7)代入(1)中可知,

clip_image080

这个过程和之前对偶过程一样。

重新整理我们要求的问题为:

clip_image081

与之对应的KKT条件为:

clip_image082

这个KKT条件说明,在两条间隔线外面的点,对应前面的系数clip_image084为0,在两条间隔线里面的对应clip_image084[1]为C,在两条间隔线上的对应的系数clip_image084[2]在0和C之间。

将我们之前得到L和H重新拿过来:

clip_image085

clip_image086

之前我们将问题进行到这里,然后说将clip_image009[13]clip_image012[11]表示后代入W中,这里将代入clip_image088中,得

clip_image090

其中

clip_image091

这里的clip_image093clip_image095代表某次迭代前的原始值,因此是常数,而clip_image009[14]clip_image012[12]是变量,待求。公式(24)中的最后一项是常数。

由于clip_image009[15]clip_image012[13]满足以下公式

clip_image097

因为clip_image099的值是固定值,在迭代前后不会变。

那么用s表示clip_image101,上式两边乘以clip_image103时,变为:

clip_image104

其中

clip_image106

代入(24)中,得

clip_image107

这时候只有clip_image012[14]是变量了,求导

clip_image109

如果clip_image088[1]的二阶导数大于0(凹函数),那么一阶导数为0时,就是极小值了。

假设其二阶导数为0(一般成立),那么上式化简为:

clip_image110

将w和v代入后,继续化简推导,得(推导了六七行推出来了)

clip_image112

我们使用clip_image114来表示:

clip_image115

通常情况下目标函数是正定的,也就是说,能够在直线约束方向上求得最小值,并且clip_image117

那么我们在(30)两边都除以clip_image114[1]可以得到

clip_image118

这里我们使用clip_image061[1]表示优化后的值,clip_image012[15]是迭代前的值,clip_image120

与之前提到的一样clip_image061[2]不是最终迭代后的值,需要进行约束:

clip_image121

那么

clip_image122

在特殊情况下,clip_image114[2]可能不为正,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,clip_image114[3]可能出现负值。即使K是有效的核函数,如果训练样本中出现相同的特征x,那么clip_image114[4]仍有可能为0。SMO算法在clip_image114[5]不为正值的情况下仍有效。为保证有效性,我们可以推导出clip_image114[6]就是clip_image088[2]的二阶导数,clip_image124clip_image088[3]没有极小值,最小值在边缘处取到(类比clip_image126),clip_image128时更是单调函数了,最小值也在边缘处取得,而clip_image012[16]的边缘就是L和H。这样将clip_image130clip_image132分别代入clip_image088[4]中即可求得clip_image088[5]的最小值,相应的clip_image130[1]还是clip_image132[1]也可以知道了。具体计算公式如下:

clip_image134

至此,迭代关系式出了b的推导式以外,都已经推出。

b每一步都要更新,因为前面的KKT条件指出了clip_image084[3]clip_image136的关系,而clip_image138和b有关,在每一步计算出clip_image084[4]后,根据KKT条件来调整b。

b的更新有几种情况:

clip_image140

来自罗林开的ppt

这里的界内指clip_image142,界上就是等于0或者C了。

前面两个的公式推导可以根据clip_image144

和对于clip_image142[1]clip_image146的KKT条件推出。

这样全部参数的更新公式都已经介绍完毕,附加一点,如果使用的是线性核函数,我们就可以继续使用w了,这样不用扫描整个样本库来作内积了。

w值的更新方法为:

clip_image147

根据前面的

clip_image068[1]

公式推导出。

12 SMO中拉格朗日乘子的启发式选择方法

终于到了最后一个问题了,所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数clip_image142[2]clip_image084[5]作优化(论文中称为无界样例),因为在界上(clip_image084[6]为0或C)的样例对应的系数clip_image084[7]一般不会更改。

这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的clip_image012[17]。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个clip_image084[8]中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表clip_image142[3],在界上也有可能会违背。是的,因此在给定初始值clip_image084[9]=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对clip_image142[4]的样例进行迭代更新。

在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于clip_image149,选择第二个乘子能够最大化clip_image149[1]。即当clip_image151为正时选择负的绝对值最大的clip_image153,反之,选择正值最大的clip_image153[1]

最后的收敛条件是在界内(clip_image142[5])的样例都能够遵循KKT条件,且其对应的clip_image084[10]只在极小的范围内变动。

至于如何写具体的程序,请参考John C. Platt在论文中给出的伪代码。

13 总结

这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。

对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。

之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。

另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。

这篇关于smv(五)smo算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302595

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/