【Spark机器学习速成宝典】模型篇08支持向量机【SVM】(Python版)
目录
什么是支持向量机(SVM)
线性可分数据集的分类
线性可分数据集的分类(对偶形式)
线性近似可分数据集的分类
线性近似可分数据集的分类(对偶形式)
非线性数据集的分类
SMO算法
合页损失函数
Python代码(sklearn库)
什么是支持向量机(SVM) |
引例
假定有训练数据集,其中,x是向量,y=+1或-1。试学习一个SVM模型。
分析:将线性可分数据集区分开的超平面有无数个,但是SVM要做的是求解一个最优的超平面,最优意味着模型的泛化能力越强,具体做法就是选择使间隔最大的超平面。在图中可以看出黑色超平面优于红色超平面。红色圈内的样本就是支持向量,仅依靠支持向量就可以确定分割平面的位置。
李航《统计学习方法》中的定义
SVM是一种二类分类模型.它的基支持向量机(support vector machines,本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机; 支持向量机还包括核技巧,这使它成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划(convexquadratic programming) 的问题,也等价于正则化的合页损失函数的最小化问题.支持向量机的学习算法是求解凸二次规划的最优化算法。
线性可分数据集的分类 |
给定训练数据集其中,x是向量,y=+1或-1。再假设训练数据集是线性可分的。试学习一个SVM模型。
第一步:
假设超平面为
第二步:
构造并求解线性可分情况的最优化问题:
可转化成:
求解这个凸二次规划问题,可以得到唯一的
第三步:
得到分离超平面:
第四步:
得到分类决策函数:
通过一个例子展示求解过程:(摘自李航《统计学习方法》)
线性可分数据集的分类(对偶形式) |
以上是求解原始形式的最优化问题,其实,还有一种对偶形式,使用对偶形式求解具有的优点是:
一、对偶形式更容易求解;
二、自然引入核函数,进而推广到非线性分类问题。
最优化问题转化到对偶形式的主要步骤是:构建拉格朗日函数然后求极值。
第一步:
假设超平面为
第二步:
将线性可分的最优化问题:
转化成线性可分的最优化问题的对偶形式:
对于这种带约束求极值的问题,可以使用拉格朗日乘子法,可以求得,其中
对应于训练集中的实例点就是支持向量。
第三步:
得到分离超平面:
其中是唯一的,任取一个作为支持向量的实例点
,则可以算出
第四步:
得到分类决策函数:
通过一个例子展示求解过程:(摘自李航《统计学习方法》)
线性近似可分数据集的分类 |
给定训练数据集其中,x是向量,y=+1或-1。再假设训练数据集是线性近似可分的。试学习一个SVM模型。
分析:线性近似可分意味着某些样本点不能满足。
为了解决这个问题,可以对每个样本点引进一个松弛变量
,使所有样本点满足
那么,如何求解这个间隔最大的超平面呢?
第一步:
假设超平面为
第二步:
将线性可分情况下的最优化问题:
转化为线性近似可分情况下的最优化问题:
这个目标函数的含义:使间隔尽量大,同时使误分类的个数尽量小。C是一个惩罚参数,是调和二者的系数。C越大,分类器将力图通过分割超平面对所有的样例都正确分类。
求解这个凸二次规划问题,可以得到,可以证明
是唯一的,而
存在于一个区间。
第三步:
得到分离超平面:
第四步:
得到分类决策函数:
线性近似可分数据集的分类(对偶形式) |
第一步:
假设超平面为
第二步:
将线性近似可分情况下的最优化问题:
转化为线性近似可分情况下的最优化问题的对偶形式:
对于这种带约束求极值的问题,可以使用拉格朗日乘子法,可以求得,其中
对应于训练集中的实例点就是落在间隔边界上的支持向量。
第三步:
得到分离超平面:
其中是不唯一的,一般求它的方法是:取每一个间隔边界上的支持向量实例点
,算出
后取均值。
第四步:
得到分类决策函数:
非线性数据集的分类 |
给定训练数据集其中,x是向量,y=+1或-1。再假设训练数据集是非线性的。试学习一个SVM模型。
对于线性不可分的数据集,无法在原始空间上找到分离平面,所以要将原始数据映射到更高的维度,并找到一个间隔最大的超平面。
那么,如何求解这个间隔最大的超平面呢?
其实求解的关键就在于将数据映射到高维的空间,然后在高维的空间寻找最优分割超平面。
第一步:
假设超平面为
第二步:
将线性近似可分情况下的最优化问题的对偶形式:
中的维度增加(将原始的维度空间映射到高维空间):
比如:在原始空间上样本的特征是d+1维的,映射到高维空间 (d*d+1维)变成:
(思想:既然我在原始空间找不到超平面,不妨去高维空间寻找)
在高维空间使用线性支持向量机求间隔最大的分离超平面。这样做可以成功,但是计算复杂度会急增,因为增加了训练的难度。如何解决呢?
这里引入核函数,核函数的作用就是:通过一种“偷吃步”的技巧,让我们能够在高维空间求解,而且还能将计算复杂度降下来。下面看一下核函数是如何工作的。
对于这种带约束求极值的问题,可以使用拉格朗日乘子法,可以求得,其中
对应于训练集中的实例点就是落在间隔边界上的支持向量。
第三步:
得到分离超平面(求解过程与线性近似可分的情况相同,Ns是支持向量个数):
第四步:
得到分类决策函数:
有了核函数,就无需人为的去定义了,那么核函数的选择有哪些讲究呢? 其实,在实际应用中,往往依赖领域知识选择核函数,核函数的选择的有效性需要通过实验验证。 下面介绍常用的核函数,以及他们的优缺点。
SMO算法 |
支持向量机的学习关键在于求解凸二次规划,这样的凸二次规划问题具有全局最优解。但是当训练样本很多时,需要一种高效的实现算法,SMO算法就是一种主流的高效的算法。 SMO算法要解决如下凸二次规划的对偶问题:
在这个问题里,变量是拉格朗日乘子,一个变量对应一个样本点;变量的总数等于训练样本容量N。SMO的特点是不断地将原二次规划问题分解为只有两个变量的二次规划子问题,并对子问题进行解析求解,也就是每一步确定2个
直到求完所有
为止。子问题求解是快速的,即使有很多这样的子问题,SMO的求解也是高效的。
合页损失函数 |
对于线性支持向量机学习来说,其模型为分离超平面及决策函数
,其学习策略为软间隔最大化,学习算法为凸二次规划。
线性支持向量机还有另一种解释,就是最小化以下目标函数:
目标函数的第1项是经验损失,函数称为合页损失函数。下标“+”表示若值非正就为0;若为正就为其本身。这就是说,当样本点
被正确分类且函数间隔(确定度)
大于1时,损失是0,否则是
。
目标函数的第2项是系数为的
的L2范数,是正则化项,防止过拟合的。
定理:线性支持向量机原始最优化问题:
等价于最优化问题:
证明(摘自李航《统计学习方法》):
合页损失函数的图形为:
Python代码(sklearn库) |
待续...
【Spark机器学习速成宝典】模型篇08支持向量机【SVM】(Python版)的更多相关文章
- 【Spark机器学习速成宝典】模型篇01支持向量机【SVM】(Python版)
目录 支持向量机原理 支持向量机代码(Spark Python) 支持向量机原理 详见博文:http://www.cnblogs.com/itmorn/p/8011587.html 返回目录 支持向量 ...
- 【Spark机器学习速成宝典】模型篇08保序回归【Isotonic Regression】(Python版)
目录 保序回归原理 保序回归代码(Spark Python) 保序回归原理 待续... 返回目录 保序回归代码(Spark Python) 代码里数据:https://pan.baidu.com/s/ ...
- 【Spark机器学习速成宝典】模型篇07梯度提升树【Gradient-Boosted Trees】(Python版)
目录 梯度提升树原理 梯度提升树代码(Spark Python) 梯度提升树原理 待续... 返回目录 梯度提升树代码(Spark Python) 代码里数据:https://pan.baidu.co ...
- 【Spark机器学习速成宝典】模型篇06随机森林【Random Forests】(Python版)
目录 随机森林原理 随机森林代码(Spark Python) 随机森林原理 参考:http://www.cnblogs.com/itmorn/p/8269334.html 返回目录 随机森林代码(Sp ...
- 【Spark机器学习速成宝典】模型篇05决策树【Decision Tree】(Python版)
目录 决策树原理 决策树代码(Spark Python) 决策树原理 详见博文:http://www.cnblogs.com/itmorn/p/7918797.html 返回目录 决策树代码(Spar ...
- 【Spark机器学习速成宝典】模型篇04朴素贝叶斯【Naive Bayes】(Python版)
目录 朴素贝叶斯原理 朴素贝叶斯代码(Spark Python) 朴素贝叶斯原理 详见博文:http://www.cnblogs.com/itmorn/p/7905975.html 返回目录 朴素贝叶 ...
- 【Spark机器学习速成宝典】模型篇03线性回归【LR】(Python版)
目录 线性回归原理 线性回归代码(Spark Python) 线性回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7873083.html 返回目录 线性回归代码( ...
- 【Spark机器学习速成宝典】模型篇02逻辑斯谛回归【Logistic回归】(Python版)
目录 Logistic回归原理 Logistic回归代码(Spark Python) Logistic回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7890468 ...
- 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)
注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...
随机推荐
- Charles学习(二)之使用Map local代理本地静态资源以及配置网页代理在Mac浏览器上调试移动端
前言 我们在开发的过程肯定是一边写代码,一边查看自己的代码写的是否存在问题,那么问题来了,有两种情况 情况一:我们可以本地起服务,那么我们就可以在本地检查自己的代码,查看运行结果 情况二:本地无法起服 ...
- 【lucene】一个简单的招聘网站的建立
1.建立索引库: 核心代码如下 package com.tabchanj.job.index; import java.util.ArrayList; import java.util.HashMap ...
- 第95:PCA
输入数据矩阵->计算每条记录的平均值和标准差->计算协方差矩阵->得到协方差矩阵的所有特征值和特征向量->对特征值进行从大到小的排序,并且得到与之对应的特征向量 PCA是无监督 ...
- 【版本控制工具】 Git基础
一.Git简介 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.于是Git 成了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. (Git目前使用率非常 ...
- Alpha阶段评审
组别 项目名称 学生互评 助教评分 点评建议 第1组 校园物资共享平台 7.97 6.17 界面较为简洁美观,实现物品信息发布,登录注册和个人信息等功能,交易功能待完善: 博客内容比较完善,有alp ...
- Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历
package com.example.demo; public class BTree { public int data; public BTree left; public BTree rigt ...
- Oracle DBA 学习总结
对于学习Oracle 数据库,应该先要了解Oracle 的框架.它有物理结构(由控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件组成) ,逻辑结构(表空间.段.区.块),内存分配( SG ...
- 神经网络优化算法:梯度下降法、Momentum、RMSprop和Adam
最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识.关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结.吴恩达的深度 ...
- 从一道索引数据结构面试题看B树、B+树
题目1: Mysql数据库用过吧?l里面的索引是基于什么数据结构. 答:主要是基于Hash表和B+树 题目2: 很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如 ...
- 文件I/O简述
什么是I/O 宏观上讲,I/O是信息处理系统(例如计算机)与外部世界(可能是人或其他信息处理系统)之间的通信.输入(Input)是系统接收的信号或数据,输出(Output)是从其发送的信号或数据.另一 ...