• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

smo算法matlab实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

看完CSDN上结构之法,算法之道的支持向量机通俗导论(理解SVM的三层境界)

    参考了 台@@湾 的林智仁教授写了一个封装SVM算法的libsvm库,下载地址:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/,此外下载了一份libsvm的注释文档,下载地址:
 
    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实现的代码
 
    下面给出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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi的实数计算结果中只保留2位小数发布时间:2022-07-18
下一篇:
delphi中用socket解析域名获得IP地址发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap