这篇博客我们来理解一下SVM。其实,之前好多大牛的博客已经对SVM做了很好的理论描述。例如CSDN上july的那篇三层境界介绍SVM的博文,连接如下:

http://blog.csdn.net/v_july_v/article/details/7624837

那么我这里抛去一些复杂的公式推导,给出一些SVM核心思想,以及用Python实现代码,再加上我自己的理解注释。

1. SVM的核心思想

SVM的分类思想本质上和线性回归LR分类方法类似,就是求出一组权重系数,在线性表示之后可以分类。我们先使用一组trainging set来训练SVM中的权重系数,然后可以对testingset进行分类。

说的更加更大上一些:SVM就是先训练出一个分割超平面separation hyperplane, 然后该平面就是分类的决策边界,分在平面两边的就是两类。显然,经典的SVM算法只适用于两类分类问题,当然,经过改进之后,SVM也可以适用于多类分类问题。

我们希望找到离分隔超平面最近的点,确保它们离分隔面的距离尽可能远。这里点到分隔面的距离被称为间隔margin. 我们希望这个margin尽可能的大。支持向量support vector就是离分隔超平面最近的那些点,我们要最大化支持向量到分隔面的距离。

那么为了达到上面的目的,我们就要解决这样的一个问题:如何计算一个点到分隔面的距离?这里我们可以借鉴几何学中点到直线的距离,需要变动的是我们这里是点到超平面的距离。具体转换过程如下:

除了定义距离之外,我们还需要设定两类数据的类别标记分别为1和-1,这样做是因为我们将标记y和距离相乘,不管属于哪一类,乘积都是一个正数,这样有利于我们设计目标函数。

这样我们便可以定义我们SVM的目标函数:

求解这个问题需要经过一系列的转换。具体如下:

SMO算法的目标是求出一系列alpha和b,一旦求出了这些alpha,就很容易计算出权重向量w,并得到分隔超平面。SMO的工作远离是:每次循环中选择两个alpha进行优化处理,一旦找到一对合适的alpha,那么就增大其中一个,同时减小另一个。选择的alpha要满足在间隔边界之外的条件,而且还没有进行过区间化处理或者不再边界上。

《机器学习实战》中给出了利用Python实现SVM的代码,我加了一些注释便于理解,如下:

<span style="font-size:24px;">from numpy import *
import random def 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, labelMat def selectJrand(i, m):  #生成一个随机数j=i while(j==i): j=int(random.uniform(0, m))  #生成一个[0, m]的随机数,int转换为整数。注意,需要import randomreturn j def clipAlpha(aj, H, L):  #阈值函数if aj>H: aj=H if aj<L: aj=L return aj def 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=0 for i in range(m):  #在数据集上遍历每一个alpha#print alphas #print labelMatfXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b#fXi=float(np.multiply(alphas, labelMat).T*dataMatrix*dataMatrix[i, :].T)+b  #.T也是转置Ei=fXi-float(labelMat[i]) if((labelMat[i]*Ei<-toler) and (alphas[i]<C)) or ((labelMat[i]*Ei>toler) and (alphas[i]>0)): j=selectJrand(i, m)  #从m中选择一个随机数,第2个alpha jfXj=float(multiply(alphas, labelMat).T*dataMatrix*dataMatrix[j, :].T)+b Ej=fXj-float(labelMat[j]) alphaIold=alphas[i].copy()  #复制下来,便于比较alphaJold=alphas[j].copy() if(labelMat[i]!=labelMat[j]):  #开始计算L和HL=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' continue #eta是alphas[j]的最优修改量,如果eta为零,退出for当前循环eta=2.0*dataMatrix[i, :]*dataMatrix[j, :].T-\dataMatrix[i, :]*dataMatrix[i, :].T-\dataMatrix[j, :]*dataMatrix[j, :].T if eta>=0: print 'eta>=0' continue alphas[j]-=labelMat[j]*(Ei-Ej)/eta  #调整alphas[j] alphas[j]=clipAlpha(alphas[j], H, L)  if(abs(alphas[j]-alphaJold)<0.00001):  #如果alphas[j]没有调整print 'j not moving enough' continue alphas[i]+=labelMat[j]*labelMat[i]*(alphaJold-alphas[j])  #调整alphas[i]b1=b-Ei-labelMat[i]*(alphas[i]-alphaIold)*\dataMatrix[i, :]*dataMatrix[i, :].T-\labelMat[j]*(alphas[j]-alphaJold)*\dataMatrix[i, :]*dataMatrix[j, :].T b2=b-Ej-labelMat[i]*(alphas[i]-alphaIold)*\dataMatrix[i, :]*dataMatrix[j, :].T-\labelMat[j]*(alphas[j]-alphaJold)*\dataMatrix[j, :]*dataMatrix[j, :].T if(0<alphas[i]) and (C>alphas[i]): b=b1 elif(0<alphas[j]) and (C>alphas[j]): b=b2 else: b=(b1+b2)/2.0 alphaPairsChanged+=1 print 'iter: %d i: %d, pairs changed %d' %(iter, i, alphaPairsChanged) if(alphaPairsChanged==0): iter+=1 else: iter=0 print 'iteration number: %d' %iterreturn b, alphas if __name__=="__main__": dataArr, labelArr=loadDataSet('testSet.txt') b, alphas=smoSimple(dataArr, labelArr, 0.6, 0.001, 40)print b, alphas </span>

还有其他语言实现的SVM,可以在下面网站中找到,以及一些注释:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

http://www.pami.sjtu.edu.cn/people/gpliu/document/libsvm_src.pdf

理解SVM ——入门SVM和代码实现相关推荐

  1. SVM入门(一)至(三)(转)

    按:之前的文章重新汇编一下,修改了一些错误和不当的说法,一起复习,然后继续SVM之旅. (一)SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于 ...

  2. 简单粗暴理解支持向量机(SVM)及其MATLAB实例

    目录 SVM概述 SVM的改进:解决回归拟合问题的SVR 多分类的SVM QP求解 SVM的MATLAB实现:Libsvm [实例]用SVM分类 [实例]用SVM回归 SVM概述 SVM已经是非常流行 ...

  3. ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员

    ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员 目录 实验数据 设计思路​ 实现代码(部分代码) 实验数据 设计思路 实现代码(部分代码) /**js代码实 ...

  4. 机器学习:SVM的最朴素代码实现,第一个变量遍历样本获得,第二个变量随机选择

    文章目录 SVM的最朴素代码实现: 代码实现: 第一个变量遍历样本获得,主要步骤如下: 第二个变量随机选择: 计算w: 其他: SVM的最朴素代码实现: 算法简单步骤: 1.遍历样本作为第一个变量a1 ...

  5. SVM入门(八)松弛变量(转)

    转载地址:SVM入门(八)松弛变量 现在我们已经把一个本来线性不可分的文本分类问题,通过映射到高维空间而变成了线性可分的.就像下图这样: 圆形和方形的点各有成千上万个(毕竟,这就是我们训练集中文档的数 ...

  6. Python+OpenCV:理解支持向量机(SVM)

    Python+OpenCV:理解支持向量机(SVM) 理论 线性可分数据(Linearly Separable Data) Consider the image below which has two ...

  7. 麦子学院深度学习视频SVM人脸识别课程代码修改及实现

    1.麦子学院深度学习SVM人脸识别原代码对应修改 2.代码实现 1.麦子学院深度学习SVM人脸识别原代码对应修改 1.1 from sklearn.cross_validation import tr ...

  8. 详解支持向量机(SVM)算法与代码实现

    支持向量机(SVM)算法与代码实现 约束优化问题 硬间隔 SVM 软间隔 SVM 核方法介绍 SVM代码实现 自编函数实现 sklearn.svm.SVC 小结 支持向量机(SVM)算法在分类问题中有 ...

  9. 系统学习机器学习之SVM(四)--SVM算法总结

     这边文章介绍的相当浅显易懂,写的很好.算是SVM总结吧. 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 ...

最新文章

  1. 数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))
  2. hdu3342 拓扑序
  3. 开发日记-20190625 Linux系统管理技术手册(第二版) 第一章习题答案(个人版)
  4. 课程作业1:字符型强制转化为整型
  5. Docker 从Docker Hub 拉取镜像慢怎么办?
  6. 【期望】期望收益(金牌导航 期望-3)
  7. Apache ActiveMQ 5.9发布
  8. Python3.6 deep learning first step
  9. WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码
  10. android 滑动取值_Android-自定义ViewGroup-上下滑动整体实践下
  11. THUWC2017 随机二分图
  12. button是块级元素吗_前端面试必知必会的十点,你都知道吗?
  13. 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明
  14. NetAssist使用
  15. SPSS——随机抽样
  16. 计算机无法自动搜索更新驱动程序,Win10怎么设置自动搜索更新驱动软件
  17. 历程篇 之 我的 2019 (历时一年,只为记录美好生活~)
  18. 「CTS2019 | CTSC2019」氪金手游 解题报告
  19. java se和java_Java SE 9非常适合灵活,可扩展和无服务器的未来
  20. 英语论文格式修改(两栏)

热门文章

  1. kali初使用之zsh
  2. ergonomic计算机专业英语,[听单词] 计算机专业英语词汇音频52,计算机英语单词MP3...
  3. python markdown2 样式_Python markdown2.markdown方法代碼示例
  4. git 报错:remote: Not Found fatal: repository ‘http://xxx/xxx.git/‘ not found
  5. 深度学习中mAP的含义
  6. 一个用interproscan做基因注释的简易教程
  7. 黑客入侵自我保护手册
  8. matlab 错误使用*
  9. 什么软件可以测试sd卡,如何做SD卡测试和SD卡测试工具
  10. 软件测试的压力测试的性能指标,压力测试主要指标有哪些