前言
  终于到支持向量机这一分类算法了,支持向量机是所有入门机器学习小伙伴必须掌握的算法之一,我希望这篇文章能涵盖支持向量机SVM的绝大部分,如果有遗漏或者没有学习到的地方,后续我会加以补充。本文也是沿着《统计学习方法》这本书的主线来进行介绍,详细的部分都会加以解释。

一、支持向量机介绍
  第一点我们需要明白,SVM最初只是为了解决二分类问题而提出,后续才有用SVM来解决回归问题和多分类问题。
  在前面学习感知机的时候,我们了解到,感知机的原理即在线性可分的情况下,找到一个能对将两类数据进行分类的超平面,且这个超平面是无数个的,例如下面这张图:



上图是感知机模型对二分类问题的结果图,可以发现,在感知机模型中可以找到无数个超平面对已知数据进行分类。而在SVM中不同,SVM只能找到一个超平面对已知数据进行分类,且这个超平面一定是最优的。如果只从视觉上观察,也许我们能猜到上图中蓝色的直线可能是最优的,但如果让我们给出数学的证明,这就需要用到SVM了。
支持向量机也分多种类型,具体可以分为下面三类:

1.线性可分支持向量机:当数据集是线性可分时,SVM就能找到一个完美的超平面把数据集进行二分,且无误分类样本点。
2.线性不可分支持向量机:当数据集不是线性可分时,SVM也能找到一个超平面对数据集进行二分,只不过此时存在误分类点。
3.非线性支持向量机:如果数据集完全不能使用线性模型来解决,此时就需要借助核函数来对数据进行分类。
下面将分别对上述的三种支持向量机做介绍。

二、线性可分SVM
2.1.SVM数学模型的推导
线性可分SVM也是最简单的支持向量机模型,假设在一个特征空间上的数据集为:



首先,我们设超平面为wx+b=0,即我们需要找到最优的参数w ww和b bb,使得这个超平面是最优的。在寻找最优超平面之前我们先了解一下什么是间隔。
如下图:




对于整体样本集的最小间隔有:



在统计学习方法这本书中介绍函数间隔对最优化问题是没有影响的,因为当w和b同时扩大2倍,函数间隔也就扩大2倍,这样在约束条件中两边的2就可以约去,不会影响约束条件的。



经过上述一系列的转换,最终支持向量机的最大化最小间隔变转换成上述的二次规划问题。现在我们只需要求解上述的二次规划,找到最合适的参数w和$b


2.2.拉格朗日数乘法与对偶问题转换
  在学习支持向量机之前就听说支持向量机是一个数学模型非常优美的分类算法,当我们在面对的SVM原始形式时,求解的难度将会很大,虽然是一个




即:



一般来说在最优化问题中都是找函数的最小值,于是可以把求解最大值转换为求解最小值,即:
线性可分支持向量机对偶问题:



最终我们把原始问题转换为求解对偶问题,在对偶问题中,代求的参数只有α一种参数,虽然这时的参数有N个,但是相比于原形式来说,参数的个数以及求解的形式复杂度都会降低很多,面对上述的标准二次型,我们可以借助Matlab中自带的二次规划函数进行求解,也可以利用SMO序列最小算法进行求解。(这个算法后续再介绍)
  到这里,线性可分SVM的数学模型已经介绍的差不多了,但是其中还有很多数学思想没有详细介绍,例如KKT条件的介绍,拉格朗日函数以及对偶性的证明。

2.3.线性可分SVM学习算法
推导完线性可分SVM函数之后,我们变可以得到线性可分SVM学习算法。




关于线性可分支持向量机的代码实现,参考这个文章:
Matlab实现线性支持向量机

三、线性不可分SVM
3.1.线性不可分与软间隔




再化简得到:





到这里,关于线性不可分SVM最优化问题的数学模型便全部给出了,观察模型中存在的未知数,只有α一种,我们仍然可以使用二次规划算法来求解模型。




在这一部分中,我是直接参考《统计学习方法》中的步骤,因为这本书已经总结的非常好了。
这一部分的实现代码和编程详情放在下面的链接中了:
线性不可分支持向量机MATLAB实现

四、非线性SVM
4.1.非线性分类问题

  在前面,我们已经了解到了线性可分SVM和线性不可分SVM,其中线性不可分SVM与线性可分SVM的差别就是引入了一个松弛变量。这一节,我们要学习的非线性SVM,又和前面两节有着很大的区别。
在常规认知中,线性分类就是找到一个线性超平面(二维中就是直线形式),使得该线性超平面能够对样本点进行分类。非线性分类可以理解为使用线性模型无法进行分类,先看一个例子,如果面对下面的问题,我们要找到合适的边界,能够将红色和蓝色点完全区分开来。



可以明显的看出,想用一条直线来对已知样本点进行完美分类是完全不可能的,但是我们可以找到一条椭圆曲线(非线性模型)将它们正确分开。那么该如何解决一些非线性问题呢?我们想到把原来的坐标进行映射,即映射到更高维的空间中,然后再更高维的空间中进行分类。

4.2.核函数
下面是核函数的概念:




这其实就是等价于经过映射函数ϕ \phiϕ将原来的输入空间变换到一个新的特征空间,当映射函数是非线性函数时,学习到的含有核函数的支持向量机就是非线性支持向量机。
在这里有个点很重要,其实不需要追究到底映射后的空间是什么样子,等会在计算的时候其实完全不会使用映射函数,因为核函数已经代替了映射函数的内积。
下面介绍一些常用的核函数:



上面两个核函数其实就能解决大部分的非线性问题,而使用最多的便是高斯核函数。
掌握了核函数技巧,非线性问题就可以迎刃而解了。

4.3.非线性SVM学习算法




在非线性学习算法中,有和前面两种支持向量机不同的地方,在输出结果上,前面两种支持向量机的输出都是分类超平面和分类决策函数,但是在非线性支持向量机中,输出结果只有决策函数这一个,而且从决策函数中可以看到还没有w ww的身影,原因是非线性支持向量机学习算法只需要利用支持向量来构造分类决策函数,分类决策函数中是没有w ww的。
具体实现的算法代码:MATLAB实现非线性支持向量机

总结
  到这里支持向量机回归的大部分内容都已经介绍完,主要就是三个部分:线性可分、线性不可分、非线性这三种形式,这三种支持向量机的推导也是逐层加深的,至于后面还有一部分内容是关于SMO算法的,后续会把推导文章的链接放在下面,以及包括支持向量机回归、KKT条件的相关证明、对偶思想和拉格朗日的相关证明,以及一系列证明,正是有了这些形形色色的证明,才会有如今的支持向量机。

机器学习笔记-序列最小最优化算法SMO
机器学习笔记-理解拉格朗日函数+对偶问题+KKT条件