这是我在机器学习课程上的作业,用matlab实现的SMO,记录一下体会。
我实现了简化版SMO代码,网络上流传的大部分也都是这种思路的代码,主要参考了Peter《机器学习实战》中关于SMO算法的部分。感谢yqx老师。
我自己编写的简化版代码:

function [alpha,bias] = my_seqminoptSimple(training,groupIndex,C,maxIter,tol)% init
[sampleNum,featuerNum]=size(training);
alpha=zeros(sampleNum,1);
bias=0;
iteratorTimes=0;K=training*training';
while iteratorTimes<maxIter%iteratorTimes=iteratorTimes+1;alphaPairsChanged=0;% calculate predict value%K=training*training';%g=(alpha.*groupIndex)'*K+repmat(bias,1,sampleNum);%g=g';% calculate error%E=g-groupIndex;% find alpha1for i=1:sampleNumg1=(alpha.*groupIndex)'*(training*training(i,:)')+bias;E1=g1-groupIndex(i,1);% choose i: avoid KKT conditionsif(((E1*groupIndex(i,1)<-tol)&&alpha(i,1)<C)||((E1*groupIndex(i,1)>tol)&&alpha(i,1)>0))% choose j: different from i j=i;while j==ij=randi(sampleNum);endalpha1=i;alpha2=j;% updata alpha1 and alpha2alpha1Old=alpha(alpha1,1);alpha2Old=alpha(alpha2,1);y1=groupIndex(alpha1,1);y2=groupIndex(alpha2,1);g2=(alpha.*groupIndex)'*(training*training(j,:)')+bias;E2=g2-groupIndex(j,1);if y1~=y2L=max(0,alpha2Old-alpha1Old);H=min(C,C+alpha2Old-alpha1Old);elseL=max(0,alpha2Old+alpha1Old-C);H=min(C,alpha2Old+alpha1Old);endif L==Hfprintf('H==L\n');continue;endparameter=K(alpha1,alpha1)+K(alpha2,alpha2)-2*K(alpha1,alpha2);if parameter<=0fprintf('parameter<=0\n');continue;endalpha2New=alpha2Old+y2*(E1-E2)/parameter;if alpha2New>Halpha2New=H;endif alpha2New<Lalpha2New=L;endif abs(alpha2New-alpha2Old)<=0.0001fprintf('change small\n');continue;endalpha1New=alpha1Old+y1*y2*(alpha2Old-alpha2New);% updata biasbias1=-E1-y1*K(alpha1,alpha1)*(alpha1New-alpha1Old)-y2*K(alpha2,alpha1)*(alpha2New-alpha2Old)+bias;bias2=-E2-y1*K(alpha1,alpha2)*(alpha1New-alpha1Old)-y2*K(alpha2,alpha2)*(alpha2New-alpha2Old)+bias;if alpha1New>0&&alpha1New<Cbias=bias1;elseif alpha2New>0&&alpha2New<Cbias=bias2;elsebias=(bias2+bias1)/2;endalpha(alpha1,1)=alpha1New;alpha(alpha2,1)=alpha2New;alphaPairsChanged=alphaPairsChanged+1;end  endif alphaPairsChanged==0iteratorTimes=iteratorTimes+1;elseiteratorTimes=0;endfprintf('iteratorTimes=%d\n',iteratorTimes);end

《机器学习实战》部分简化版SMO代码,感谢Peter的代码。

'''
Created on Nov 4, 2010
Chapter 5 source file for Machine Learing in Action
@author: Peter
'''
from numpy import *
from time import sleepdef loadDataSet(fileName):dataMat = []; labelMat = []fr = open(fileName)for line in fr.readlines():lineArr = line.strip().split('\t')dataMat.append([float(lineArr[0]), float(lineArr[1])])labelMat.append(float(lineArr[2]))return dataMat,labelMatdef selectJrand(i,m):j=i #we want to select any J not equal to iwhile (j==i):j = int(random.uniform(0,m))return jdef clipAlpha(aj,H,L):if aj > H: aj = Hif L > aj:aj = Lreturn ajdef smoSimple(dataMatIn, classLabels, C, toler, maxIter):dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose()b = 0; m,n = shape(dataMatrix)alphas = mat(zeros((m,1)))iter = 0while (iter < maxIter):alphaPairsChanged = 0for i in range(m):fXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + bEi = fXi - float(labelMat[i])#if checks if an example violates KKT conditionsif ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)):j = selectJrand(i,m)fXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + bEj = fXj - float(labelMat[j])alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy();if (labelMat[i] != labelMat[j]):L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])if L==H: print "L==H"; continueeta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].Tif eta >= 0: print "eta>=0"; continuealphas[j] -= labelMat[j]*(Ei - Ej)/etaalphas[j] = clipAlpha(alphas[j],H,L)if (abs(alphas[j] - alphaJold) < 0.00001): print "j not moving enough"; continuealphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])#update i by the same amount as j#the update is in the oppostie directionb1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].Tb2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].Tif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0alphaPairsChanged += 1print "iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)if (alphaPairsChanged == 0): iter += 1else: iter = 0print "iteration number: %d" % iterreturn b,alphasdataArr,labelArr=loadDataSet('testSet.txt')
b,alphas=smoSimple(dataArr, labelArr, 0.6, 0.001, 40)

SMO算法的基本思想就是对于还有大量变量的优化问题不好求解,我们就采用比较简单的思路:每次只更新两个变量的值,找到一个较好的解。
SMO理论不再重复,需要的可以参考传送门,这是一个去年选了这门课的一个师兄总结的,感谢。

我这里主要讨论一下我对SMO的体会吧。简化版SMO和原始SMO主要的区别在于两个更新变量选取。

  • 思路一
    选取违反KKT最大的变量α1,再选择更新值|E1-E2|最大的α2。但是简单的这么操作更新几次后就卡死了,看来SMO并没有如此简单。

  • 思路二
    选取违反KKT最严重的α1,再随机选一个α2。

  • 思路三
    遍历的选一个α1,再随机选一个α2。
    这种简化的SMO就是选择思路三,而且必须加上很多的限制项,防止陷入一对选取的值然后就卡死不动了。具体的限制请参考SMO代码。

对于高级用户来说,想要实现完整版的SMO,请参考《机器学习实战》第6章的内容。

基于matlab的SMO实现相关推荐

  1. matlab数字量转电气量,基于MATLAB的数字PID直流电机调速系统.doc

    电力拖动课程设计 作 者 段发鑫 系 (院) 信息工程学院 专 业 电气工程及其自动化 年 级 2010级 学 号 K031041513 指导教师 耿东山 日 期 2013.5.5 基于MATLAB的 ...

  2. 图像有损压缩matlab程序,基于Matlab的灰度图像DCT与RLE的混合有损压缩

    人工智能及识别技术本栏目责任编辑:唐一东第5卷第21期(2009年7月)基于Matlab 的灰度图像DCT 与RLE 的混合有损压缩 朱玲芳,刘任任 (湘潭大学信息工程学院,湖南湘潭411105) 摘 ...

  3. 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷

    第 44 卷 第 7 期 2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7 Jul. ...

  4. matlab求解外弹道,基于MATLAB∕Simulink的通用质点外弹道程序设计.pdf

    2017.01 设计与研发 基于 MATLAB/Simulink 的通用质点外弹道程序设计 崔 瀚 (沈阳工学院兵器类虚拟仿真实验教学中心, 辽宁抚顺 ,113122 ) 摘要:本文以弹丸质点外弹道学 ...

  5. 码分复用的matlab仿真,基于matlab的多路时分复用仿真.doc

    基于matlab的多路时分复用仿真 通信系统原理综设实验报告 多路时分复用matlab仿真系统 教师评语: 引言 在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上传输 ...

  6. 电机测试matlab,基于MATLAB的电机故障诊断模型训练与测试平台

    基于MATLAB的电机故障诊断模型训练与测试平台 于际河 [期刊名称]<计算机光盘软件与应用> [年(卷),期]2014(000)005 [摘要]基于MATLAB的可视化编程技术,设计电机 ...

  7. matlab方波假频现象分析,基于MATLAB 的信号时域采样及频率混叠现象分析

    龙源期刊网 http://www.doczj.com/doc/7d04774eae45b307e87101f69e3143323968f58a.html 基于MATLAB 的信号时域采样及频率混叠现象 ...

  8. 基于matlab fdma传输系统设计,基于MATLAB的LTE系统仿真研究

    摘  要: 根据LTE系统的原理和模块构成,分析并建立了一个基于MATLAB的系统级仿真平台.针对LTE系统中被广泛认可的轮询.比例公平和最大载干比三种经典调度算法,利用仿真平台产生的数据对三者的性能 ...

  9. matlab的dft谱分析,数字信号处理基于matlab(用DFT作谱分析,窗函数的设计)

    数字信号处理基于matlab(用DFT作谱分析,窗函数的设计) 1实验一用DFT作谱分析X11111X212344321N108X3COSN1PI/4N208X4SINN2PI/8FIGURESUBP ...

最新文章

  1. python 在windows 中文显示
  2. python编程100例头条-python爬虫演示:以爬取今日头条为例
  3. 深入浅出SharePoint——数据库维护
  4. 动态二级下拉菜单html,js实现简洁大方的二级下拉菜单效果代码
  5. DL之PSPNet:PSPNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  6. MySQL常用数据类型小结
  7. layui 自定义排序_thinkphp5+layui异步修改排序
  8. 列表根据下标取值_Python基础知识点——list(列表)讲解
  9. cefSharp通过js操控页面,含跨域操控
  10. 网络知识:分享几个路由器设置小技巧,欢迎收藏!
  11. media jquery 适配ios不同手机
  12. 沿环形路径创建渐变画笔
  13. 转 SPI和API的区别
  14. Loadrunner11 下载、安装与破解
  15. 8188gu驱动和su realtek_Realtek瑞昱RTL8192SU/RTL8188SU/RTL8192GU无线网卡驱动怎么样
  16. Pyton入门的歪路
  17. 1.19.5.3.时态表、关联一张版本表、关联一张普通表、时态表、声明版本表、声明版本视图、声明普通表、时态表函数等
  18. [学习][笔记]C++/WinRT入门 01Hello world
  19. 2018年暑假 纪中培训总结
  20. 深度学习_目标检测_SPP(Spatial Pyramid Pooling)详解

热门文章

  1. loadrunner Error code:10053
  2. SM4加密算法原理和简单实现(java)
  3. linux基础 linux命令跟踪 strace命令
  4. 自适应模糊PID控制算法
  5. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本
  6. 随机变量的期望和方差
  7. 汉诺塔问题的递归和非递归算法
  8. ppt如何删除所有特效?
  9. pandas dataframe删除空行或者空列dropna,一般删除指定行或者列drop
  10. Visual C++ Redistributable for VS2005/VS2008/VS2010/VS2012/VS2013/VS2015/VS2017/VS2019 下载地址