机器学习算法 --- SVM (Support Vector Machine)
一、SVM的简介
SVM(Support Vector Machine,中文名:支持向量机),是一种非常常用的机器学习分类算法,也是在传统机器学习(在以神经网络为主的深度学习出现以前)中一种非常牛X的分类算法。关于它的发展历史,直接引用Wikipedia中的,毕竟本文主要介绍它的推导过程,而不是历史发展。
The original SVM algorithm was invented by Vladimir N. Vapnik and Alexey Ya. Chervonenkis in 1963. In 1992, Bernhard E. Boser, Isabelle M. Guyon and Vladimir N. Vapnik suggested a way to create nonlinear classifiers by applying the kernel trick to maximum-margin hyperplanes. The current standard[according to whom?] incarnation (soft margin) was proposed by Corinna Cortes and Vapnik in 1993 and published in 1995.
接下来,就让我们回到过去,扮演它的发明者。(不要想太多,这个非常简单,只需基础的线性代数基础)
二、一个最简单的分类问题
有如下几条直线,哪条是黑白两种点的最佳分割线?

如果你看到了上面的那张图,你肯定会毫不犹豫的说是H3,因为H1明显没有满足要求,H2虽然分开了,但是给人的感觉没有那么好!如果现在在图中给你一个未知颜色的点,让你判断它是黑还是白,该如何判断?如果是我,我就会说如果这个未知点在H3左边的它就是黑色,如果他在H3的右边,他就是白色。
如果到这儿你都完全理解,那么距离明白SVM就已经非常接近了。使用计算机程序寻找H3的过程,我们管它叫做训练;使用H3对未知点进行分类的过程,我们管它叫做预测。
接下来,我们就需要知道计算机是如何找到H3这条线,和如何使用H3做出决策?(计算机不是人类,所以它不能靠感觉,而要编写计算机程序,则必须有一个严谨的算法过程。)
三、SVM推导
首先,我们将上面寻找H3的问题转换一下,

如上图,找到最佳的分割线,也就是让两条虚线之间的距离最大。
首先我们假设这条分割线的法向量为
,我们知道在直角坐标系中,任意一点都可以表示为一向量
,w · u则表示该向量在
上投影的长度,对于任意一个正样本(设黑为+,白为-) 有w · u ≥ C,设b = C,则将其整理一下即可写为w · u - b ≥ 0, 如果已知w和b,使用此公式,我们便可对未知点进行预测(或者叫分类)。
由上述,我们知道了决策过程,接下来,我们需要推导出训练过程,即怎样得到w和b?
首先对于训练集,在训练集中对于任意一点xi 我们知道它的标签yi(如果为正例yi = 1,如果为负例yi = -1),然后对于正负例我们假设
(假设当点刚好在边缘时等号成立), 不等式两边同乘以yi就可以得到
。
两条虚线之间的宽度求法如下:

即我们要做工作的是:

即我们需要在
的约束下(只需关注边界上的点),求
。(这个问题,相信对于学过大学高等数学的人来说是非常简单的)
使用拉格朗日乘数可以很容易的进行求解,
设
则:
, 
将w回带到L中,

化简得,

注意上式的末尾,要使L取极值(画出决策边界),结果只与训练集中已知点向量的点积有关,与其它量无关。
如果再将
带入到决策函数中,则
if 
result = +
else
result = -
综上所述,可以发现,要求得最大间隔与对一个未知点的分类预测只与已知虚线点的点积有关。
四、核函数
在上述中,最后的决策函数为
,但这个决策函数对线性不可分的数据便无能为力了,比如:

上图,不能简单的使用一条直线将其分开,但是,如果我们换个角度,

对其多加一个维度Z,很容易便可将其用一条直线将其分开,如果我们再回到最开始的维度下,则其如下图所示,

这也就告诉我们,在我们当前维度下线性不可分的数据,如果换个角度,则其就会线性可分。
又由于决策函数为
, 向量
和
在二维z坐标系中,
(这里的
指的是向量
在第一和第二维度上的值),假设
为
和
在某个维度的点积,则其决策函数就可写为
,而
. (称K为核函数)
通过上述两式就可画出最佳分割超平面,和对未知数据做出决策。
常见的核函数有(摘自Wikipedia):
- Polynomial (homogeneous):
- Polynomial (inhomogeneous):
- Gaussian radial basis function:
, for
. Sometimes parametrized using
- Hyperbolic tangent:
, for some (not every)
and
注:大部分的机器学习任务使用这些核函数都可以得到解决。
机器学习算法 --- SVM (Support Vector Machine)的更多相关文章
- 支持向量机SVM(Support Vector Machine)
支持向量机(Support Vector Machine)是一种监督式的机器学习方法(supervised machine learning),一般用于二类问题(binary classificati ...
- 机器学习经典算法笔记-Support Vector Machine SVM
可供使用现成工具:Matlab SVM工具箱.LibSVM.SciKit Learn based on python 一 问题原型 解决模式识别领域中的数据分类问题,属于有监督学习算法的一种. 如图所 ...
- SVM (support vector machine)
简单原理流程转自:http://wenku.baidu.com/link?url=57aywD0Q6WTnl7XKbIHuEwWENnSuPS32QO8X0a0gHpOOzdnNt_K0mK2cucV ...
- 支持向量机 support vector machine
SVM(support Vector machine) (1) SVM(Support Vector Machine)是从瓦普尼克(Vapnik)的统计学习理论发展而来的,主要针对小样本数据进行学习. ...
- 使用Support Vector Machine
使用svm(Support Vector Machine)中要获得好的分类器,最重要的是要选对kernel. 常见的svm kernel包括linear kernel, Gaussian kernel ...
- 支持向量机(Support Vector Machine,SVM)—— 线性SVM
支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术.尽管现在 Deep Learnin ...
- 机器学习之支持向量机(Support Vector Machine)
转载请注明出处:http://www.cnblogs.com/Peyton-Li/ 支持向量机 支持向量机(support vector machines,SVMs)是一种二类分类模型.它的基本模型是 ...
- Support Vector Machine(2):Lagrange Duality求解线性可分SVM的最佳边界
在上篇文章<Support Vector Machine(1):线性可分集的决策边界>中,我们最后得到,求SVM最佳Margin的问题,转化为了如下形式: 到这一步后,我个人又花了很长的时 ...
- Support Vector Machine (1) : 简单SVM原理
目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...
随机推荐
- virtualbox+vagrant学习-4-Vagrantfile-6-SSH Settings
SSH Settings 配置命名空间:config.ssh config.ssh的设置涉及到将如何配置vagrant使其通过ssh访问你的计算机.与大多数vagrant设置一样,默认设置通常都很好, ...
- 强连通分量算法·$tarjan$初探
嗯,今天好不容易把鸽了好久的缩点给弄完了--感觉好像--很简单? 算法的目的,其实就是在有向图上,把一个强连通分量缩成一个点--然后我们再对此搞搞事情,\(over\) 哦对,时间复杂度很显然是\(\ ...
- 串口调试助手vc源程序及其详细编写过程
串口调试助手vc源程序及其详细编写过程 目次: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件 ...
- 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序
建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...
- oracle 数据库更新 新增 修改 删除
数据增加 INSERT INTO 表名称 [(字段,字段,...)] VALUES (值,值,...) ; 考虑到日后代码的可维护性,一定要使用完整的语法进行数据的增加. 数据修改 UPDATE 表名 ...
- Linux入门基础(一):Linux基本操作
命令行BASH基本操作 Shell 用户不能直接操作内核,所以用户操作通过shell传递给内核 shell分为两种 : GUI 图形界面 (linux一般是GNOME) CLI 命令行界面 (linu ...
- Django:表单字段如何在模板中用中文显示
在处理中文显示的时候,刚开始接触django时,很容易弄混表单汉化和Admin后台汉化. 1.表单汉化:是针对用户的.用户浏览网页时,表单的名称如果是英文的,不够友好,所以需要显示为中文,虽然代码编写 ...
- Ubuntu18.04编译S3的Linux SDK(Zeta)
按照S3官方Wiki(http://www.sochip.com.cn/s3)的陈述,推荐使用Ubuntu16.04作为Host端系统,笔者是一名乐于并热衷于尝鲜的搬砖工,于是,尝试在最新的18.04 ...
- Bluebox Security最新提报Android漏洞的初步探讨(转)
Bluebox Security在7月3号的时候,在官网上发布了一个据称99% Android机器都有的一个漏洞.国内最早在4号开始有媒体报道,并持续升温.该漏洞可使攻击者在不更改Android应用 ...
- mfc 形式参数初始化
初始化函数形参 int add(int a,int b) { return a+b; } add(,); ,,char*s=NULL) { printf("a=%d,b=%d,c=%d\n& ...