支持向量机SMO算法求解过程分析

1.SVM对偶函数最后的优化问题

2. 对核函数进行缓存

由于该矩阵是对称矩阵,因此在内存中的占用空间可以为m(m+1)/2

映射关系为:

[cpp] view plain copy

  1. #define OFFSET(x, y)    ((x) > (y) ? (((x)+1)*(x) >> 1) + (y) : (((y)+1)*(y) >> 1) + (x))
  2. //...
  3. for (unsigned i = 0; i < count; ++i)
  4. for (unsigned j = 0; j <= i; ++j)
  5. cache[OFFSET(i, j)] = y[i] * y[j] * kernel(x[i], x[j], DIMISION);
  6. //...

3. 求解梯度

既然α值是变量,因此对α值进行求导,后面根据梯度选取α值进行优化。

梯度:

[cpp] view plain copy

  1. for (unsigned i = 0; i < count; ++i)
  2. {
  3. gradient[i] = -1;
  4. for (unsigned j = 0; j < count; ++j)
  5. gradient[i] += cache[OFFSET(i, j)] * alpha[j];
  6. }

若使W最大,则当α减少时,G越大越好。反之,G越小越好。

4. 序列最小化法(SMO)的约束条件

每次选取2个α值进行优化,其它α值视为常数,根据约束条件得:

进行优化之后:

5. 制定选取规则

由于α的范围在区间[0,C],所以△α受α约束

若选取的异号,即λ=-1,则增减性相同

假设

,则,此时应选取

上述命题可化为(注:等价)

若选取的同号,即λ=1,则增减性相异

,则,此时应选取,

上述命题可化为(注:等价)

将上述结论进行整理,可得(为了简便此处只选取G前的符号与y的符号相异的情况)

[cpp] view plain copy

  1. unsigned x0 = 0, x1 = 1;
  2. //根据梯度选取进行优化的alpha值
  3. {
  4. double gmax = -DBL_MAX, gmin = DBL_MAX;
  5. for (unsigned i = 0; i < count; ++i)
  6. {
  7. if ((alpha[i] < C && y[i] == POS || alpha[i] > 0 && y[i] == NEG) && -y[i] * gradient[i] > gmax)
  8. {
  9. gmax = -y[i] * gradient[i];
  10. x0 = i;
  11. }
  12. else if ((alpha[i] < C && y[i] == NEG || alpha[i] > 0 && y[i] == POS) && -y[i] * gradient[i] < gmin)
  13. {
  14. gmin = -y[i] * gradient[i];
  15. x1 = i;
  16. }
  17. }
  18. }

6. 开始进行求解

alpha要求在区间[0,C]内,对不符合条件的alpha值进行调整,调整规则如下。

分2种情况,若λ=-1,即:

代入后得:

[cpp] view plain copy

  1. if (y[x0] != y[x1])
  2. {
  3. double coef = cache[OFFSET(x0, x0)] + cache[OFFSET(x1, x1)] + 2 * cache[OFFSET(x0, x1)];
  4. if (coef <= 0) coef = DBL_MIN;
  5. double delta = (- gradient[x0] - gradient[x1]) / coef;
  6. double diff = alpha[x0] - alpha[x1];
  7. alpha[x0] += delta;
  8. alpha[x1] += delta;
  9. unsigned max = x0, min = x1;
  10. if (diff < 0)
  11. {
  12. max = x1;
  13. min = x0;
  14. diff = -diff;
  15. }
  16. if (alpha[max] > C)
  17. {
  18. alpha[max] = C;
  19. alpha[min] = C - diff;
  20. }
  21. if (alpha[min] < 0)
  22. {
  23. alpha[min] = 0;
  24. alpha[max] = diff;
  25. }
  26. }

若λ=1,即:

[cpp] view plain copy

  1. else
  2. {
  3. double coef = cache[OFFSET(x0, x0)] + cache[OFFSET(x1, x1)] - 2 * cache[OFFSET(x0, x1)];
  4. if (coef <= 0) coef = DBL_MIN;
  5. double delta = (-gradient[x0] + gradient[x1]) / coef;
  6. double sum = alpha[x0] + alpha[x1];
  7. alpha[x0] += delta;
  8. alpha[x1] -= delta;
  9. unsigned max = x0, min = x1;
  10. if (alpha[x0] < alpha[x1])
  11. {
  12. max = x1;
  13. min = x0;
  14. }
  15. if (alpha[max] > C)
  16. {
  17. alpha[max] = C;
  18. alpha[min] = sum - C;
  19. }
  20. if (alpha[min] < 0)
  21. {
  22. alpha[min] = 0;
  23. alpha[max] = sum;
  24. }
  25. }

然后进行梯度调整,调整公式如下:

[cpp] view plain copy

  1. for (unsigned i = 0; i < count; ++i)
  2. gradient[i] += cache[OFFSET(i, x0)] * delta0 + cache[OFFSET(i, x1)] * delta1;

7.进行权重的计算

计算公式如下:

[cpp] view plain copy

  1. double maxneg = -DBL_MAX, minpos = DBL_MAX;
  2. SVM *svm = &bundle->svm;
  3. for (unsigned i = 0; i < count; ++i)
  4. {
  5. double wx = kernel(svm->weight, data[i], DIMISION);
  6. if (y[i] == POS && minpos > wx)
  7. minpos = wx;
  8. else if (y[i] == NEG && maxneg < wx)
  9. maxneg = wx;
  10. }
  11. svm->bias = -(minpos + maxneg) / 2;

代码地址:http://git.oschina.net/fanwenjie/SVM-iris/

时间: 2024-10-20 10:25:39

支持向量机SMO算法求解过程分析的相关文章

支持向量机(SVM)(五)-- SMO算法详解

一.我们先回顾下SVM问题. A.线性可分问题 1.SVM基本原理: SVM使用一种非线性映射,把原训练            数据映射到较高的维.在新的维上,搜索最佳分离超平面,两个类的数据总可以被超平面分开. 2.问题的提出: 3.如何选取最优的划分直线f(x)呢? 4.求解:凸二次规划 建立拉格朗日函数: 求偏导数: B.线性不可分问题 1.核函数 如下图:横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类. 设: g(x)转化为f(y)=<a,y> g(x)=

支持向量机原理(四)SMO算法原理

支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五)线性支持回归(待填坑) 在SVM的前三篇里,我们优化的目标函数最终都是一个关于\alpha向量的函数.而怎么极小化这个函数,求出对应的\alpha向量,进而求出分离超平面我们没有讲.本篇就对优化这个关于\alpha向量的函数的SMO算法做一个总结. 1. 回顾SVM优化目标函数 我们首先回顾下我们的

理解支持向量机(三)SMO算法

在支持向量机模型的求解中,我们用到了SMO算法来求解向量α. 那么什么是SMO算法?在讲SMO算法之前.我们须要先了解下面坐标上升法. 1.坐标上升法 如果有优化问题: W是α向量的函数.利用坐标上升法(当然,求目标函数的最小时即为坐标下降法)求解问题最优的步骤例如以下: 算法的思想为:每次仅仅考虑一个变量进行优化,将其它变量固定.这时整个函数能够看作仅仅关于该变量的函数,能够对其直接求导计算. 然后继续求其它分变量的值,整个内循环下来就得到了α的一组值,若该组值满足条件.即为我们求的值,否则继

【转载】支持向量机(五)SMO算法

支持向量机(五)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>了. 我拜

【机器学习算法-python实现】svm支持向量机(2)—简化版SMO算法

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 通过上一节我们通过引入拉格朗日乗子得到支持向量机变形公式.详细变法可以参考这位大神的博客--地址 参照拉格朗日公式F(x1,x2,...λ)=f(x1,x2,...)-λg(x1,x2...).我们把上面的式子变型为: 约束条件就变成了: 下面就根据最小优化算法SMO(Sequential Minimal Optimization).找出距离分隔面最近的点,也就是支持向量集.如下图的蓝色点所示.

[笔记]关于支持向量机(SVM)中 SMO算法的学习(一)理论总结

1. 前言 最近又重新复习了一遍支持向量机(SVM).其实个人感觉SVM整体可以分成三个部分: 1. SVM理论本身:包括最大间隔超平面(Maximum Margin Classifier),拉格朗日对偶(Lagrange Duality),支持向量(Support Vector),核函数(Kernel)的引入,松弛变量的软间隔优化(Outliers),最小序列优化(Sequential Minimal Optimization)等. 2. 核方法(Kernel):其实核方法的发展是可以独立于S

SMO算法总结

1.概述 SMO(Sequentil Minimal Optimization)算法在支持向量机中用来求解对偶问题,即 min 12∑Ni=1∑Nj=1αiαjyiyjK(xi,xj)?∑Ni=1αi s.t.∑αiyi=0 0?αiyi?C 在这个问题中,变量是拉格朗日乘子α,一个αi对应一个样本点(xi,yi),变量总数等于样本数量N. SMO算法是一个启发式的算法,它的基本思路是:如果所有变量的解都满足KKT条件,即: ?????????????????αi≥0yif(xi)?1+ξ≥0α

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

smo算法matlab实现

看完CSDN上结构之法,算法之道的支持向量机通俗导论(理解SVM的三层境界) http://blog.csdn.net/v_july_v/article/details/7624837 参考了台湾的林智仁教授写了一个封装SVM算法的libsvm库,下载地址: http://www.csie.ntu.edu.tw/~cjlin/libsvm/,此外下载了一份libsvm的注释文档,下载地址: http://www.pami.sjtu.edu.cn/people/gpliu/document/lib