支持向量机matlab代码程序_机器学习实战项目-支持向量机

支持向量机 概述

支持向量机(Support Vector Machines, SVM):是一种机器学习算法。

  • 支持向量(Support Vector)就是离分隔超平面最近的那些点。
  • 机(Machine)就是表示一种算法,而不是表示机器。

支持向量机 场景

  • 要给左右两边的点进行分类
  • 明显发现:选择D会比B、C分隔的效果要好很多。
a0f393bf875ff6af418edf26532d43b8.png

支持向量机 原理

SVM 工作原理

4eb0c0950bd2e164ebb98f3fa6bcd07c.png

对于上述的苹果和香蕉,我们想象为2种水果类型的炸弹。(保证距离最近的炸弹,距离它们最远)

  1. 寻找最大分类间距
  2. 转而通过拉格朗日函数求优化的问题
  • 数据可以通过画一条直线就可以将它们完全分开,这组数据叫线性可分(linearly separable)数据,而这条分隔直线称为分隔超平面(separating hyperplane)。
  • 如果数据集上升到1024维呢?那么需要1023维来分隔数据集,也就说需要N-1维的对象来分隔,这个对象叫做超平面(hyperlane),也就是分类的决策边界。
dde0b3d4c4bd664c69503f64a8d018ac.png

寻找最大间隔

为什么寻找最大间隔

摘录地址:http://slideplayer.com/slide/8610144 (第12条信息)Support Vector Machines: Slide 12 Copyright © 2001, 2003, Andrew W. Moore Why Maximum Margin? denotes +1 denotes -1 f(x,w,b) = sign(w. x - b) The maximum margin linear classifier is the linear classifier with the, um, maximum margin. This is the simplest kind of SVM (Called an LSVM) Support Vectors are those datapoints that the margin pushes up against 1.Intuitively this feels safest. 2.If we’ve made a small error in the location of the boundary (it’s been jolted in its perpendicular direction) this gives us least chance of causing a misclassification. 3.CV is easy since the model is immune to removal of any non-support-vector datapoints. 4.There’s some theory that this is a good thing. 5.Empirically it works very very well. * * *1. 直觉上是安全的2. 如果我们在边界的位置发生了一个小错误(它在垂直方向上被颠倒),这给我们最小的错误分类机会。3. CV(Computer Vision 计算机视觉 - 这缩写看着可怕)很容易,因为该模型对任何非支持向量数据点的去除是免疫的。4. 有一些理论,这是一件好事。5. 通常它的工作非常好。

怎么寻找最大间隔

点到超平面的距离

  • min关于w,bL(w,b,α)=12∗||w||2+∑i=1nαi∗[1−label∗(wTx+b)]
  • 就是求L(w,b,a)关于[w, b]的偏导数, 得到w和b的值,并化简为:L和a的方程。
  • 参考: 如果公式推导还是不懂,也可以参考《统计学习方法》李航-P103
735871becb47197a14795cfbab1b7d24.png

松弛变量(slack variable)

参考地址:http://blog.csdn.net/wusecaiyun/article/details/49659183

150d268e543470c8ee417b1caa4d7d11.png
  • 我们知道几乎所有的数据都不那么干净, 通过引入松弛变量来 允许数据点可以处于分隔面错误的一侧。
  • 约束条件: C>=a>=0
  • C>=a>=0 并且 ∑
  • m
  • i=1
  • a
  • i
  • ⋅label
  • i
  • =0
  • ∑i=1mai·labeli=0
  • 总的来说:
1fec8a0c1d19c5468161d7a80e517c76.png
  • 表示 松弛变量
  • 常量C是 惩罚因子, 表示离群点的权重(用于控制“最大化间隔”和“保证大部分点的函数间隔小于1.0” )
  • label∗(w
  • T
  • x+b)>1
  • label∗(wTx+b)>1 and alpha = 0 (在边界外,就是非支持向量)
  • label∗(w
  • T
  • x+b)=1
  • label∗(wTx+b)=1 and 0< alpha < C (在分割超平面上,就支持向量)
  • label∗(w
  • T
  • x+b)<1
  • label∗(wTx+b)<1 and alpha = C (在分割超平面内,是误差点 -> C表示它该受到的惩罚因子程度)
  • 参考地址:https://www.zhihu.com/question/48351234/answer/110486455
  • C值越大,表示离群点影响越大,就越容易过度拟合;反之有可能欠拟合。
  • 我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。
  • 例如:正类有10000个样本,而负类只给了100个(C越大表示100个负样本的影响越大,就会出现过度拟合,所以C决定了负样本对模型拟合程度的影响!,C就是一个非常关键的优化点!)
  • 这一结论十分直接,SVM中的主要工作就是要求解 alpha.

SMO 高效优化算法

  • SVM有很多种实现,最流行的一种实现是: 序列最小优化(Sequential Minimal Optimization, SMO)算法。
  • 下面还会介绍一种称为 核函数(kernel) 的方式将SVM扩展到更多数据集上。
  • 注意:SVM几何含义比较直观,但其算法实现较复杂,牵扯大量数学公式的推导。

序列最小优化(Sequential Minimal Optimization, SMO)

  • 创建作者:John Platt
  • 创建时间:1996年
  • SMO用途:用于训练 SVM
  • SMO目标:求出一系列 alpha 和 b,一旦求出 alpha,就很容易计算出权重向量 w 并得到分隔超平面。
  • SMO思想:是将大优化问题分解为多个小优化问题来求解的。
  • SMO原理:每次循环选择两个 alpha 进行优化处理,一旦找出一对合适的 alpha,那么就增大一个同时减少一个。
  • 这里指的合适必须要符合一定的条件
  1. 这两个 alpha 必须要在间隔边界之外
  2. 这两个 alpha 还没有进行过区间化处理或者不在边界上。
  • ∑i=1mai·labeli=0;如果只是修改一个 alpha,很可能导致约束条件失效。

SMO 伪代码大致如下:

创建一个 alpha 向量并将其初始化为0向量当迭代次数小于最大迭代次数时(外循环) 对数据集中的每个数据向量(内循环): 如果该数据向量可以被优化 随机选择另外一个数据向量 同时优化这两个向量 如果两个向量都不能被优化,退出内循环 如果所有向量都没被优化,增加迭代数目,继续下一次循环

SVM 开发流程

收集数据:可以使用任意方法。准备数据:需要数值型数据。分析数据:有助于可视化分隔超平面。训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优。测试算法:十分简单的计算过程就可以实现。使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器,对多类问题应用SVM需要对代码做一些修改。

SVM 算法特点

优点:泛化(由具体的、个别的扩大为一般的,就是说:模型训练完后的新样本)错误率低,计算开销不大,结果易理解。缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适合于处理二分类问题。使用数据类型:数值型和标称型数据。

课本案例(无核函数)

项目概述

对小规模数据点进行分类

开发流程

收集数据

文本文件格式:

3.5424851.977398-13.0188962.556416-17.551510-1.58003012.114999-0.004466-18.1271131.2743721

准备数据

def loadDataSet(fileName): """ 对文件进行逐行解析,从而得到第行的类标签和整个特征矩阵 Args: fileName 文件名 Returns: dataMat 特征矩阵 labelMat 类标签 """ dataMat = [] labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr = line.strip().split('') dataMat.append([float(lineArr[0]), float(lineArr[1])]) labelMat.append(float(lineArr[2])) return dataMat, labelMat

分析数据: 无

训练算法

def smoSimple(dataMatIn, classLabels, C, toler, maxIter): """smoSimple Args: dataMatIn 特征集合 classLabels 类别标签 C 松弛变量(常量值),允许有些数据点可以处于分隔面的错误一侧。 控制最大化间隔和保证大部分的函数间隔小于1.0这两个目标的权重。 可以通过调节该参数达到不同的结果。 toler 容错率(是指在某个体系中能减小一些因素或选择对某个系统产生不稳定的概率。) maxIter 退出前最大的循环次数 Returns: b 模型的常量值 alphas 拉格朗日乘子 """ dataMatrix = mat(dataMatIn) # 矩阵转置 和 .T 一样的功能 labelMat = mat(classLabels).transpose() m, n = shape(dataMatrix) # 初始化 b和alphas(alpha有点类似权重值。) b = 0 alphas = mat(zeros((m, 1))) # 没有任何alpha改变的情况下遍历数据的次数 iter = 0 while (iter < maxIter): # w = calcWs(alphas, dataMatIn, classLabels) # print("w:
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值