机器学习——支持向量机(SVM)

支持向量机(Support Vector Machine)广泛地应用于分类问题,回归问题和异常检测问题。支持向量机一个很好的性质是其与凸优化问题相对应,局部最优解就是全局最优解。

本来打算大致写一下思想的。结果发现了已经有大神写的超级棒了。链接如下,看懂后来做笔记,http://blog.csdn.net/v_july_v/article/details/7624837

线性可分模型

如上图所示,两组数据中间存在一条直线,使得两组数据分别在线的两侧。这就是最简单的线性可分模型。其中,这条直线在高维空间叫做分离超平面。
分离超平面的位置只由两组数据分离侧边界上的点决定,即,位于两组数据边界点所在平面构成的二面角的平分面上。(这个形容可能不太贴切)。
这个分离超平面用以下方程表示:
\[f(x)=w^Tx+b=0\]

已知点到超平面的距离为\(\frac{|f(x)|}{||w||}\)。
为了使分离效果更好,我们的目标是让数据边界点距离分离超平面。即
\[ \max \limits_w \min \limits_x \frac{f(x)}{||w||} \]

等价于
\[ \max \limits_w \frac{|f(x_0)|}{||w||} \]
\[ s.t. \frac{|f(x_i)|}{||w||} \ge \frac{|f(x_0)|}{||w||},i=1,2,\ldots,n\]

通过调整\(w:=|f(x_0)|w\),上式可以简化为
\[ \max \limits_w \frac{1}{||w||} \]
\[ s.t. |f(x_i)| \ge 1 ,i=1,2,\ldots,n\]
ps.相应边界线变为\(w^Tx+b=1和w^Tx+b=-1\)
进一步地,
\[ \min \limits_w \frac{1}{2}||w||^2 \]
\[ s.t. f(x_i)sign(f(x_i))\ge 1 ,i=1,2,\ldots,n\]

对偶问题

\[ \min \limits_w \frac{1}{2}||w||^2 \to quadratic function\]
\[ s.t. f(x_i)sign(f(x_i)) \ge 1 ,i=1,2,\ldots,n \to linear function\]
这个问题是凸优化里典型的QP(二次型)问题, 因为约束条件是仿射的,所以满足Slater条件,对偶问题的解和原问题的解一致。所以可以使用求对偶问题的方法求解原问题的最优解。
设拉格朗日函数为:
\[L(x,\lambda,w,b)=\frac{1}{2}||w||^2-\sum \limits_{i=1}^{n}\lambda_i ((sign(f(x_i))w^Tx_i+b)-1),\lambda_i \ge 0\]
设拉格朗日对偶函数为
\[g(x,\lambda)=\inf \limits_{w,b}L(x,\lambda,w,b)\]
为了求解上式,需要对\(L\)求偏导,消去\(w,b\),

\[{{\partial L} \over {\partial w}} = 0 \Rightarrow w_i = \sum \limits_{i = 1}^n \lambda_i sign(f({x_i})){x_i} \]
\[{{\partial L} \over {\partial b}} = 0 \Rightarrow \sum \limits_{i = 1}^n \lambda_i sign(f({x_i}))=0 \]

那么,带入\(g(x,\lambda)\),求得

\[ g(x,\lambda)=\sum\limits_{i = 1}^n \lambda_i - {1 \over 2} \sum \limits_{i,j = 1}^n \lambda_i \lambda_j sign(f(x_i)) sign(f(x_j)) x_i^T x_j\]

对偶问题变成:

\[\max \limits_\lambda \sum\limits_{i = 1}^n \lambda_i - {1 \over 2} \sum \limits_{i,j = 1}^n \lambda_i \lambda_j sign(f(x_i)) sign(f(x_j)) \left\langle {x_i,x_j} \right\rangle\]
\[s.t. \sum \limits_{i = 1}^n \lambda_i sign(f({x_i}))=0,\lambda_i \ge 0,i=1,2,\ldots,n\]

线性不可分模型

SVM只能处理线性可分模型,对于线性不可分模型,可以在高维空间建立线性可分模型。如下图所示,

那么,怎么扩展到高维空间呢?方法很简单,就是将原来的低维变量变成高维的多项式。例如\(X_1,X_2\)构成的二维变量变成\(X_1,X_2,X_1^2,X_2^2,X_1X_2\)构成的五维空间。
但是,随着变量的增加,高维空间的维数会爆炸性的增长,超出我们的处理范围。等价的,我们可以使用核函数来代替。

具体做法是将\(\left\langle {x_i,x_j} \right\rangle\)换成对应的核函数\(K(x_i,x_j)\)。核函数的意义在于在把低维空间的特征扩展到高维空间时,是先在低维空间进行操作,然后把结果展示在高维空间,这样大大降低了计算得复杂度。

常用的核函数

  • 多项式核\(K(x_1,x_2)=(\left\langle {x_i,x_j} \right\rangle+R)^d\) 上面那个问题对应的是取\(R=1,d=2\)
  • 高斯核 \(K(x_1,x_2)=exp(-||x_1-x_2||^2/{2\sigma^2})\) 这个核是将原问题映射到无穷维空间,但是主要成分在\([-3\sigma,3\sigma]\)之间。
  • 线性核 \(K(x_1,x_2)=\left\langle {x_i,x_j} \right\rangle\)

异常点的处理——松弛


如上图所示,异常数据的出现导致不能分开两组数据。这时我们需要做的就是减弱少数的异常值带来的影响,在原问题后面加入松弛变量\(\xi _i\)。

将约束条件变为

\[sign(f(x_i))f(x_i) \ge 1-\xi _i\]

同时要限制\(\xi _i\)总和的大小。所以原问题变为:

\[\min {1 \over 2}||w||^2+C \sum \limits_{i=1}^{n}\xi_i\]

\[s.t. sign(f(x_i))(w^Tx_i+b) \ge 1-\xi _i,i=1,\ldots,n\]

\[\xi _i \ge 0,i=1,\ldots,n\]

经计算,对偶问题变为:

\[\max \limits_\lambda \sum\limits_{i = 1}^n \lambda_i - {1 \over 2} \sum \limits_{i,j = 1}^n \lambda_i \lambda_j sign(f(x_i)) sign(f(x_j)) \left\langle {x_i,x_j} \right\rangle\]

\[s.t. \sum \limits_{i = 1}^n \lambda_i sign(f({x_i}))=0, 0 \le \lambda_i \le C,i=1,2,\ldots,n\]

SMO(Sequential minimal optimization)算法

求解以上对偶问题的算法称为SMO算法。此不不错讨论,有兴趣的请查看JerryLead的笔记

LIBSVM算法包

LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。

可以去http://www.csie.ntu.edu.tw/~cjlin/下载这个算法包。
由于前人已经对SVM做了大量的优化,包括算法上和计算机方面的优化,所以不建议自己编程。个人认为只要懂得原理,知道怎么修改参数即可。

机器学习——支持向量机(SVM)的更多相关文章

  1. 机器学习——支持向量机SVM

    前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...

  2. 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...

  3. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  4. coursera机器学习-支持向量机SVM

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  5. 机器学习-支持向量机SVM

    简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...

  6. 机器学习——支持向量机(SVM)

    支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...

  7. 机器学习支持向量机SVM笔记

    SVM简述: SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机.SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后 ...

  8. 机器学习——支持向量机(SVM)之核函数(kernel)

    对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...

  9. 机器学习——支持向量机(SVM)之Platt SMO算法

    Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...

  10. 机器学习:Python中如何使用支持向量机(SVM)算法

    (简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...

随机推荐

  1. SpringCloud系列一:微服务理解

    1. 单体架构 一个归档包(例如war格式)包含所有功能的应用程序,通常称为单体应用. > 复杂性高:模块多,模块的边界模糊,依赖关系不清楚,代码质量参差不齐. > 技术债务:随着时间推移 ...

  2. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 启动hibernate测试案例时报错如下: 2.解决方案: 2.1 第一次解决:MySQL驱动版本太高.使用的hibernate版本为5 ...

  3. RabbitMQ集群安装配置+HAproxy+Keepalived高可用

    RabbitMQ集群安装配置+HAproxy+Keepalived高可用 转自:https://www.linuxidc.com/Linux/2016-10/136492.htm rabbitmq 集 ...

  4. 解决:Adb connection Error:远程主机强迫关闭了一个现有的连接

    最近刚入手了一台G12,用它来调试程序的时候,eclipse的console总是出现如下的错误“Adb connection Error:远程主机强迫关闭了一个现有的连接” 问题出现的原因:这是ddm ...

  5. windows svchost.exe 引起的出现的莫名其妙的窗口失去焦点

    我不知道你们遇到没,反正我是遇到了,现在我就把解决方法给你们,当然都是从网上整理下来的 这个失去焦点可以分为两种,一种是病毒,一种是系统自带的问题 首先你得知道自己的窗口被什么给挤掉了焦点 先看看这篇 ...

  6. mybatis介绍安装

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单 ...

  7. mysql海量数据条件删除

    1. 问题描述:现在存在两个表,具体表结构及记录数如下所示: mysql> desc user_mapping; +------------+------------------+------+ ...

  8. windows中wamp环境composer使用中openssl问题解决

    今天在windows下学习lavaral,使用composer update命令报如下错误: [Composer\Exception\NoSslException] The openssl exten ...

  9. C语言中的编译时分配内存

    1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放 ...

  10. idangerous swiper

    最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...