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/libsvm_src.pdf

SVM的原理在三层境界里已经讲的很清楚了,然而SMO算法的实现却仍然困惑着很多人。机器学习课程中有个作业:

“1. 需要Matlab2010b以上版本的运行环境;

2. my_svm.m 与my_svmtrain.m 是两个与此作业相关的文件;

3. 请尝试设计一个序列最优化函数,替代原函数自带的seqminopt函数。my_svmtrain.m中对应的代码部分如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[alpha bias] = seqminopt(training, groupIndex, ...

boxconstraint, tmp_kfun, smo_opts);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

这个函数就是SMO算法源码。函数第一个输入参数的意义依次是分类数据,分类label,参数b(bias),核函数和smo参数(包括tol,MaxIter)。

要SMO算法,必须知道算法的流程,简单来说就是个二次规划问题。

for i=1:iter

a. 根据预先设定的规则,从所有样本中选出两个

b. 保持其他拉格朗日乘子不变,更新所选样本对应的拉格朗日乘子

end

下面解这个只有两个变量的二次规划问题:

步骤二计算二阶导数也可以写成


    按照算法的步骤,写下SMO算法的实现代码。之前有看到一份python实现的代码

http://www.tuicool.com/articles/RRZvYb

下面给出matlab代码,有错误请指正:

function [alphas offset] = my_seqminopt(data, targetLabels, boxConstraints, ...

kernelFunc, smoOptions)

%kernelFunc is not used because

%initialization

tol=smoOptions.TolKKT;

maxIter=smoOptions.MaxIter;

m=size(data,1);

alphas = zeros(size(data,1), 1);

itCount=1;

offset = 0;

%iteration

while itCount

for i=1:m

num_alpha_change=0;

gI=(alphas.*targetLabels)‘ *(data*data(i,:)‘)+offset;

%violate the KKT condition

eI=gI-targetLabels(i);

if ((targetLabels(i)*eI<-tol)&& (alphas(i)tol) && (alphas(i)>0) )

j=randi([i,m]);%select randomly

gJ=(alphas.*targetLabels)‘ *(data*data(j,:)‘)+offset;

eJ=gJ-targetLabels(j);

%oldAlphaI,oldAlphaJ

oldAlphaI=alphas(i);

oldAlphaJ=alphas(j);

if targetLabels(i)~=targetLabels(j)

L=max(0,alphas(j)-alphas(i));

H=min(boxConstraints(i),boxConstraints(i)+alphas(j)-alphas(i));

else

L=max(0,alphas(j)+alphas(i)-boxConstraints(i));

H=min(boxConstraints(i),alphas(j)+alphas(i));

end

eta=2.0*data(i,:)*data(j,:)‘-data(i,:)*data(i,:)‘-data(j,:)*data(j,:)‘;

if eta>=0

continue;

end

alphas(j)=alphas(j)-targetLabels(j)*(eI-eJ)/eta;

if alphas(j)

alphas(j)=L;

elseif alphas(j)>H

alphas(j)=H;

end

alphaChange=alphas(j)-oldAlphaJ;

if abs(alphaChange)<1e-5

continue;

end

alphas(i)=alphas(i)+targetLabels(j)*targetLabels(i)*(oldAlphaJ-alphas(j));

b1=boxConstraints(i)-eI-targetLabels(i)*(alphas(i)-oldAlphaI)*data(i,:)*data(i,:)‘-targetLabels(j)*(alphas(j)-oldAlphaJ)*data(i,:)*data(j,:)‘;

b2=boxConstraints(i)-eJ-targetLabels(i)*(alphas(i)-oldAlphaI)*data(i,:)*data(j,:)‘-targetLabels(j)*(alphas(j)-oldAlphaJ)*data(j,:)*data(j,:)‘;

if ((alphas(i)>0) && (alphas(i)

offset=b1;

elseif ((alphas(j)>0) && (alphas(j)

offset=b2;

else

offset=(b1+b2)/2.0;

end

num_alpha_change=num_alpha_change+1;

end

end

if num_alpha_change == 0

itCount=itCount+1;

else

itCount=0;

end

end

时间: 2024-10-10 05:24:35

smo算法matlab实现的相关文章

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

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

SVM之SMO算法(转)

支持向量机(Support Vector Machine)-----SVM之SMO算法(转) 此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法.SMO由微软研究院的约翰·普莱特(John Platt)发明于1998年,目前被广泛使用于SVM的训练过程中,并在通行的SVM库libsvm中得到实现. 1998年,SMO算法发表在SVM研究领域内引起了轰动,因为先前可用的S

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

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

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

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

&lt;转&gt;SVM实现之SMO算法

转自http://blog.csdn.net/zouxy09/article/details/17292011 终于到SVM的实现部分了.那么神奇和有效的东西还得回归到实现才可以展示其强大的功力.SVM有效而且存在很高效的训练算法,这也是工业界非常青睐SVM的原因. 前面讲到,SVM的学习问题可以转化为下面的对偶问题: 需要满足的KKT条件: 也就是说找到一组αi可以满足上面的这些条件的就是该目标的一个最优解.所以我们的优化目标是找到一组最优的αi*.一旦求出这些αi*,就很容易计算出权重向量w

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

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

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

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

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

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

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α