支持向量机(Support Vector Machine)由V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等在1964年提出。序列最小优化算法(Sequential minimal optimization)是一种用于解决支持向量机训练过程中所产生优化问题的算法。由John C. Platt于1998年提出。

支持向量机的推导在西瓜书,各大网站已经有详细的介绍。本文主要依据John C. Platt发表的文章《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines》来实现SVM与SMO算法。

算法的流程:

import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt

定义需要的数据,包含数据样本,数据标签,偏置b,拉格朗日乘子α,容忍系数C等。

class Par:def __init__(self,n,D,C,eps,tol):self.X=datasets.make_blobs(n_samples=n,n_features=D,centers=2,cluster_std=1.0,shuffle=True,random_state=None)self.point=self.X[0]self.target=self.X[1]self.target[np.nonzero(self.target==0)[0]]=-1self.w=np.zeros((1,D))[0]self.b=0self.E=-self.targetself.alpha=np.zeros((1,n))[0]self.n=nself.C=Cself.eps=epsself.tol=tol

定义核函数,预测公式。

def kernel(x,y):return np.dot(x,y.T)def f(x):s=0for i in range(n):s+=P.alpha[i]*P.target[i]*kernel(P.point[i],x)return s-P.b

被选中的一对α更新细节:

def takeStep(i1,i2):if i1==i2:return 0alph2=P.alpha[i2]alph1=P.alpha[i1]y1=P.target[i1]y2=P.target[i2]s=y1*y2#Compute L,H via equations (13) and (14)if y1!=y2:L=max(0,alph2-alph1)H=min(P.C,P.C+alph2-alph1)else:L=max(0,alph2+alph1-P.C)H=min(P.C,alph2+alph1)if L==H:return 0k11=kernel(P.point[i1],P.point[i1])k12=kernel(P.point[i1],P.point[i2])k22=kernel(P.point[i2],P.point[i2])eta=k11+k22-2*k12if eta>0:a2=alph2+y2*(P.E[i1]-P.E[i2])/etaif a2<L:a2=Lelif a2>H:a2=Helse:f1=y1*(P.E[i1]+b)-alph1*k11-s*alph2*k12f2=y2*(P.E[i2]+b)-s*alph1*k12-alph2*k22L1=alph1+s*(alph2-L)H1=alph1+s*(alph2+H)psiL=L1*f1+L*f2+0.5*L1**2*k11+0.5*L**2*k22+s*L*L1*k12psiH=H1*f1+H*f2+0.5*H1**2*k11+0.5*H**2*k22+s*H*H1*k12Lobj = psiLHobj = psiHif Lobj<Hobj-eps:a2=Lelif Lobj>Hobj+eps:a2=Helse:a2=alph2if abs(a2-alph2)<P.eps*(a2+alph2+P.eps):return 0a1=alph1+s*(alph2-a2)#Update threshold to reflect change in Lagrange multipliersb1=P.E[i1]+y1*(a1-alph1)*k11+y2*(a2-alph2)*k12+P.bb2=P.E[i2]+y1*(a1-alph1)*k12+y2*(a2-alph2)*k22+P.bif a1>0 and a1<P.C:P.b=b1elif a2>0 and a2<P.C:P.b=b2else:P.b=(b1+b2)/2#Update weight vector to reflect change in a1 & a2, if SVM is linearP.w=P.w+y1*(a1-alph1)*P.point[i1]+y2*(a2-alph2)*P.point[i2]#Store a1 in the alpha arrayP.alpha[i1]=a1#Store a2 in the alpha arrayP.alpha[i2]=a2#Update error cache using new Lagrange multipliersP.E[i1]=f(P.point[i1])-P.target[i1]P.E[i2]=f(P.point[i2])-P.target[i2]return 1

内循环选择第二个α:

def examineExample(i2):global validalph2=P.alpha[i2]y2=P.target[i2]r2=P.E[i2]*y2if (r2<-P.tol and alph2<P.C) or (r2>P.tol and alph2>0):valid=np.where((P.alpha!=0) & (P.alpha!=C))[0]Long=len(valid)if Long > 1:#i1 = result of second choice heuristic (section 2.2)best=-1if len(valid)>1:for k in valid:deltaE=abs(P.E[i2]-P.E[k])if deltaE>best:best=deltaEi1=kif takeStep(i1,i2):return 1#loop over all non-zero and non-C alpha, starting at a random pointif Long>0:random_index=np.random.randint(0,Long)for i in np.hstack((valid[random_index:Long],valid[0:random_index])):i1=iif takeStep(i1,i2):return 1#loop over all possible i1, starting at a random pointrandom_index=np.random.randint(0,n)for i in np.hstack((np.arange(random_index,n),np.arange(0,random_index))):#i1=loop variablei1=iif takeStep(i1,i2):return 1return 0

外循环选择第一个α:

def SMO():global validnumChanged=0examineAll=1while numChanged>0 or examineAll:numChanged=0if examineAll:for i in range(n):numChanged+=examineExample(i)else:#loop I over examples where alpha is not 0 & not Cfor i in valid:numChanged+=examineExample(i)if examineAll==1:examineAll=0elif numChanged==0:examineAll=1

主函数入口:

if __name__ == '__main__':n=100       #样本个数C=10         eps=0.001  #停止精度tol=0.001   #分类容错率D=2            #样本维度P=Par(n,D,C,eps,tol) SMO()#绘制图像plt.scatter(P.point[:,0],P.point[:,1],c=P.target)x=np.arange(-10,10,0.1)y=(P.b-P.w[0]*x)/P.w[1]plt.plot(x,y)plt.show()Y=kernel(P.point,P.w)-P.bcount=0for i in range(n):if Y[i]*P.target[i]<0:count+=1print('Error Point num:',count)

单次测试结果:

支持向量机SVM序列最小优化算法SMO相关推荐

  1. 统计学习方法第七章作业:SVM非线性支持向量机之SMO序列最小优化算法代码实现

    SMO序列最小优化算法 import numpy as np import math from sklearn.metrics import accuracy_score from sklearn.m ...

  2. 一文看懂 序列最小最优化算法---SMO

    一.SMO的背景介绍 序列最小最优化算法(sequential minimal optimization,SMO)于1998年被John Platt发明,是一种用于解决支持向量机训练期间出现的二次规划 ...

  3. SMO(序列最小优化算法)解析

    什么是SVM SVM是Support Vector Machine(支持向量机)的英文缩写,是上世纪九十年代兴起的一种机器学习算法,在目前神经网络大行其道的情况下依然保持着生命力.有人说现在是神经网络 ...

  4. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译

  5. SMO(序列最小优化)算法论文及原理详述

    今日拜读了Platt的关于SMO的论文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Mac ...

  6. smo算法matlab实现,SVM之序列最小最优化算法(SMO算法)

    SVM回顾 支持向量机(SVM)的一大特点是最大化间距(max margin).对于如上图的二分类问题,虽然有很多线可以将左右两部分分开,但是只有中间的红线效果是最好的,因为它的可活动范围(margi ...

  7. 序列最小最优化算法(SMO算法)

    前面三篇我已经谈了谈我对支持向量机的理解,推到了各类支持向量机的对偶算法,我们有很多最优化算法来求解这个问题,但是样本容量很大时,这些算法会变得非常低效.人们就提出了很多快速实现算法,SMO算法就是其 ...

  8. 【cs229-Lecture8】顺序最小优化算法

    ref:    blog:http://zhihaozhang.github.io/2014/05/20/svm4/ <数据挖掘导论> 真正的大神是当采用的算法表现出不是非常好的性能的时候 ...

  9. 【项目实战】Python实现支持向量机SVM回归模型(SVR算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 支持向量机可以用于回归问题,即支持向量机回归,简称支持向量回归( ...

最新文章

  1. [转载]永远保持随时可以离开的能力(不仅仅是张泉灵)
  2. Linux中查看各文件夹大小(扫盘)
  3. 神经网络python实例分类_Python使用神经网络进行简单文本分类
  4. tf keras Dense源码解析
  5. 锁相放大器sr830_各位谁会用Stanford SR830啊,我都快被这个锁相放大器折腾死了!!!!-北京搜狐焦点...
  6. 四六级php,详解四六级查询API+网页
  7. Java的未来项目:巴拿马,织布机,琥珀和瓦尔哈拉
  8. 重学TCP协议(11)TFO(Tcp Fast Open)
  9. 下面是编写html语言的工具,thymeleaf是用于编写html模版的编程语言(工具语言)...
  10. CVPR 2022数据集汇总|包含目标检测、多模态等方向
  11. python筛选数据求均值_Python数据分析之从100万条数据中筛选出前100热门电影
  12. logstash zip linux安装,centos7.4安装测试logstash6.5.0
  13. java微信小程序毕业设计 java微信校园运动会报名小程序系统毕业设计毕设作品参考
  14. spring成神之路第十八篇:@ComponentScan、@ComponentScans 详解(bean 批量注册)
  15. flex 做的小相册+向上滚动字体
  16. k-d tree入门
  17. kind:Kubernetes in Docker,单机运行 Kubernetes 群集的最佳方案?
  18. 手机Flash主题动画制作
  19. 内核模式 vs 用户模式
  20. IT30:天行健--君子以自强不息(启航)

热门文章

  1. 2022-2028年中国手术室设备行业市场研究及前瞻分析报告
  2. c/c++ 如何输入带空格的字符串
  3. 【Spring】基于XML的IOC案例
  4. pycharm配置远程调试docker
  5. LeetCode简单题之合并两个链表
  6. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
  7. 空间点像素索引(三)
  8. 2021年大数据Flink(三十九):​​​​​​​Table与SQL ​​​​​​总结 Flink-SQL常用算子
  9. 小程序加载大图片 使用widthFix时,图片先拉伸然后才显示完全
  10. kvm虚拟机vnc配置