本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是机器学习专题的第32篇文章,我们来聊聊SVM。

SVM模型大家可能非常熟悉,可能都知道它是面试的常客,经常被问到。它最早诞生于上世纪六十年代。那时候虽然没有机器学习的概念,也没有这么强的计算能力,但是相关的模型和理论已经提出了不少,SVM就是其中之一。

SVM完全可以说是通过数学推导出来的模型,由于当时还没有计算机,所以模型当中的参数都是数学家们用手来算的。它有一个巨大的应用就是前苏联的计划经济体系,我们知道在计划经济当中,国家有多少社会资源,每样商品需要生产多少都是国家统筹规划的。

但是国家和社会不是一成不变的,去年消耗了多少粮食不意味着今年也会消耗这么多,很多因素会影响。所以当时前苏联的科学家们用当时最先进的方法来计算参数预测各项商品的消耗来完成社会资源的调度,这个最先进的方法就是SVM。

废话说了这么多,下面我们就来看看这个模型实际的原理吧。

算法描述

SVM的英文全称是Support Vector Machine,翻译过来的意思是支持向量机。无论是英文还是中文,我们直观上有些难以理解。

难以理解没有关系,我们先把支持向量这个概念放一放,先来介绍一下它整体的原理。

SVM最基本的原理就是寻找一个分隔“平面”将样本空间一分为二,完成二分类。进一步我们可以知道,对于二维的平面,我们要分隔数据需要一条线。对于三维的空间我们要分开需要一个面,发散开去对于一个n维的空间,我们要将它分开需要一个n-1的超平面。

SVM寻找的就是这样的超平面,为了方便理解,我们以最简单的二维场景为例。

我们观察一下上图,很明显图中的数据可以分成两个部分。对于上图的数据而言理论上来说我们有无数种划分的方法,我们既可以像左边这样随意的划分,也可以像右边这样看起来严谨许多的划分,在这么多划分方法当中究竟哪一种是最好的呢?我们怎么来定义划分方法的好和坏呢?

SVM对这个问题的回答很干脆,右图的划分是最好的,原因是它的间隔最大

从图中我们可以看到,间隔也就是被划分成两个部分之间最接近的距离,间隔正中的这条红线就是SVM找到的用来划分的超平面。

我们进一步观察可以发现,对于间隔这个事情来说,绝大多数样本都不起作用,能够起作用的只有在落在虚线上也就是间隔边缘的样本。是这些样本确定了间隔,从而间接确定了分隔平面,支撑起了模型。

所以SVM当中把这些落在边缘上的样本成为支持向量,这也是SVM得名的由来。

模型推导

我们首先来考虑最简单的情况,即线性可分,也就是说所有样本都可以被正确的划分。这样划分出来得到的间隔是实实在在的,所以我们把线性可分的情况下的间隔称为硬间隔

首先我们先写出这个分隔平面的公式:

\[\omega^Tx+b = 0
\]

其中x表示一条n维的样本特征组成的向量,\(\omega\)是平面的n维法向量,决定平面的方向。虽然从公式上来看和线性回归很像,但是它们之间的本质区别是线性回归是用来拟合label的,而SVM的平面方程是用来确定平面方向的。这里的b就是简单的偏移量,表示平面距离原点的距离。

表示出来分隔平面之后,我们就可以表示出每一个样本距离平面的距离:

\[\gamma = \frac{|\omega^Tx + b|}{||\omega||}
\]

这个公式看起来好像不太明白,其实它是由二维的点到平面的距离公式演化得到的:\(d = \frac{|Ax + By + c|}{A^2 + B^2}\)

这里的\(||\omega||\)是一个L2范数,我们把它也展开可以写成:\(||\omega|| = \sqrt{\sum_{i=1}^k \omega_i^2}\)

模型假设

这里我们做一点假设,对于样本当中的点,在分隔平面上方的类别为1,在分隔平面下方的类别为-1。那么我们可以进一步得到\(\omega x_i +b\)应该和\(y_i\)同号。所以我们可以写成:\(y(\omega^T x + b) > 0\)。

我们来观察支持向量,也就是刚好在间隔边缘的点,它们到分割平面的距离刚好是间隔的一半。我们假设这个点的函数值是\(\gamma\),我们把它表示出来可以得到:

\[\begin{aligned}
y_i(\omega^T x_i + b)&=\gamma\\
y_i(\frac{\omega}{\gamma}x_i + \frac{b}{\gamma}) &= 1
\end{aligned}
\]

我们令新的\(\hat{\omega} = \frac{\omega}{\gamma}\),新的\(\hat{b}= \frac{b}{\gamma}\)。也就是说我们通过变形可以将函数值缩放到1,为了方便计算,我们选取恰当的参数,使得间隔刚好为1。既然如此,对于所有的样本点,我们都可以得到\(y_i(\omega^Tx_i + b) \ge 1\),对于支持向量来说\(y_i(\omega^Tx_i + b)\)=1。

利用这点,我们可以表示出间隔:

\[\gamma = 2\frac{|\omega^Tx + b|}{||\omega||} = \frac{2}{||\omega||}
\]

\(\frac{2}{||\omega||}\)是一个分数,我们要求它的最大值,也就是求\(||\omega||^2\)的最小值。我们想要在线性可分的基础上让这个间隔尽量大,所以这是一个带约束的线性规划问题,我们把整个式子写出来:

接下来我们要做的就是在满足约束的前提下找到使得\(\frac{1}{2}||\omega||^2\)最小的\(\omega\),这个式子看起来非常麻烦,又有不等式掺和在里面,那么我们应该怎么办呢?

这部分内容我们将会在下一篇文章分享,敬请期待。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

机器学习 | 深入SVM原理及模型推导(一)的更多相关文章

  1. 机器学习之支持向量机—SVM原理代码实现

    支持向量机—SVM原理代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9596898.html 1. 解决 ...

  2. 【机器学习】算法原理详细推导与实现(六):k-means算法

    [机器学习]算法原理详细推导与实现(六):k-means算法 之前几个章节都是介绍有监督学习,这个章解介绍无监督学习,这是一个被称为k-means的聚类算法,也叫做k均值聚类算法. 聚类算法 在讲监督 ...

  3. 机器学习技法课之Aggregation模型

    Courses上台湾大学林轩田老师的机器学习技法课之Aggregation 模型学习笔记. 混合(blending) 本笔记是Course上台湾大学林轩田老师的<机器学习技法课>的学习笔记 ...

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

    SVM 原理引入 支持向量机( SVM,Support Vector Machine ) 背景 2012年前较为火热, 但是在12年后被神经网络逼宫, 由于应用场景以及应用算法的不同, SVM还是需要 ...

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

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

  6. 机器学习:SVM

    SVM 前言:支持向量机(Support Vector Machine, SVM),作为最富盛名的机器学习算法之一,其本身是一个二元分类算法,为了更好的了解SVM,首先需要一些前提知识,例如:梯度下降 ...

  7. 【机器学习】svm

    机器学习算法--SVM 目录 机器学习算法--SVM 1. 背景 2. SVM推导 2.1 几何间隔和函数间隔 2.2 SVM原问题 2.3 SVM对偶问题 2.4 SMO算法 2.4.1 更新公式 ...

  8. Support Vector Machine (1) : 简单SVM原理

    目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...

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

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

随机推荐

  1. Django学习路31_使用 locals 简化 context 写法,点击班级显示该班学生信息

    urls 中 进行注册 url(r'grades',views.grades) views 中编写函数 def grades(request): grades_list = Grade.objects ...

  2. 查看 __class__属性

    查看complex的__class__属性 a = 5+2j print(a.__class__) print(a.__class__.__class__) ''' <class 'comple ...

  3. PHP xml_set_element_handler() 函数

    定义和用法 xml_set_element_handler() 函数规定在 XML 文档中元素的起始和终止调用的函数. 如果成功,该函数则返回 TRUE.如果失败,则返回 FALSE.高佣联盟 www ...

  4. luogu P4321 随机漫游 期望dp 二进制 高斯消元

    LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...

  5. 京东架构师:日均 5 亿查询量的ElasticSearch架构如何设计?

    作者:张sir  来源:京东技术(id:jingdongjishu) 1. 背景 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数 ...

  6. Java 添加、删除、格式化Word中的图片

    本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片.具体可通过addImage()方法添加图片.deleteImage()方法删除图片.up ...

  7. 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)

    由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...

  8. 【LeetCode/LintCode】 题解丨微软面试题:大楼轮廓

    水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度.大楼之间从远处看可能会重叠,求出 N 座大楼的外轮 ...

  9. java 模拟斗地主发牌洗牌

    一 模拟斗地主洗牌发牌 1.案例需求 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...

  10. C#LeetCode刷题之#717-1比特与2比特字符( 1-bit and 2-bit Characters)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3740 访问. 有两种特殊字符.第一种字符可以用一比特0来表示.第 ...