注:最近在工做中,高频率的接触到了SVM模型,并且还有使用SVM模型作回归的状况,即SVR。另外考虑到本身从第一次知道这个模型到如今也差很少两年时间了,从最开始的腾云驾雾到如今有了一点直观的认识,花费了很多时间。所以在这里作个总结,比较一下使用同一个模型作分类和回归之间的差异,也记念一下与SVM相遇的两周年!这篇总结,不会涉及太多公式,只是但愿经过可视化的方法对SVM有一个比较直观的认识。html
因为代码比较多,没有放到正文中,全部代码均可以在github中:linkgit
原始SVM算法是由弗拉基米尔·万普尼克和亚历克塞·泽范兰杰斯于1963年发明的。1992年,Bernhard E. Boser、Isabelle M. Guyon和弗拉基米尔·万普尼克提出了一种经过将核技巧应用于最大间隔超平面来建立非线性分类器的方法。当前标准的前身(软间隔)由Corinna Cortes和Vapnik于1993年提出,并于1995年发表。github
上个世纪90年代,因为人工神经网络(RNN)的衰落,SVM在很长一段时间里都是当时的明星算法。被认为是一种理论优美且很是实用的机器学习算法。算法
在理论方面,SVM算法涉及到了很是多的概念:间隔(margin)、支持向量(support vector)、核函数(kernel)、对偶(duality)、凸优化等。有些概念理解起来比较困难,例如kernel trick和对偶问题。在应用方法,SVM除了能够当作有监督的分类和回归模型来使用外,还能够用在无监督的聚类及异常检测。相对于如今比较流行的深度学习(适用于解决大规模非线性问题),SVM很是擅长解决复杂的具备中小规模训练集的非线性问题,甚至在特征多于训练样本时也能有很是好的表现(深度学习此时容易过拟合)。可是随着样本量$m$的增长,SVM模型的计算复杂度会呈$m^2$或$m^3$增长。网络
在下面的例子中,均使用上一篇博客中提到的鸢尾属植物数据集。机器学习
图1:Iris data set函数
感知机能够看作是低配版的线性SVM,从数学上能够证实:学习
在线性可分的两类数据中,感知机能够在有限步骤中计算出一条直线(或超平面)将这两类彻底分开。优化
若是这两类距离越近,所需的步骤就越多。此时,感知机只保证给出一个解,可是解不惟一,以下图所示:spa
图2:感知机训练出来的3个不一样的线性分类器
训练样本$x \in \mathbb{ R }^{n}$,标签$y \in {-1, 1}$,对于线性分类器来讲:
参考上面的描述,在分类正确的状况下,若是一个点$x$的标签为$y = 1$,预测值$w \cdot x + b > 0$,分类为1;标签为-1,预测值小于0,分类为-1. 那么可使用$y (w \cdot x + b) > 0 $来统一表示分类正确的状况,反之可使用$y(w \cdot x + b) < 0$来表示分类错误的状况。
在分类正确时,即$y (w \cdot x + b) > 0$,$loss = 0$;
在分类错误时,即$y (w \cdot x + b) \leq 0$,$loss = -y (w \cdot x + b)$.
利用随机梯度降低的方式训练模型,每次只使用一个样本,根据代价函数的梯度更新参数,
step1: 初始化$w = 0, b = 0$;
step2: 循环从训练集取样本,每次一个
if $y (w \cdot x + b) \leq 0$(该样本分类错误):
w = w + yx
b = b + y
从流程上来看,每次取出一个样本点训练模型,并且只在分错的状况下更新参数,最终全部样本都分类正确时,模型训练过程结束。
在两类样本线性可分的状况下,感知机能够保证找到一个解,彻底正确的区分这两类样本。可是解不惟一,并且这些决策边界的质量也不相同,直观上来看这条线两边的间隔越大越好。那么有没有一种方法能够直接找到这个最优解呢?这就是线性SVM所作的事情。
从直观上来看,约束条件越多对模型的限制也就越大,所以解的个数也就越少。感知机的解不惟一,那么给感知机的代价函数加上更强的约束条件好像就能够减小解的个数。事实上也是这样的。
在分类正确时,即$y (w \cdot x + b) > 1$,$loss = 0$;
在分类错误时,即$y (w \cdot x + b) \leq 1$,$loss = -y (w \cdot x + b)$.
比较一下能够发现,原来$w \cdot x + b$只须要大于0或小于0就能够了,可是如今须要大于1或小于1. 在这里为何选择1我尚未很直观的解释,可是有一点很是重要:原来的决策边界只是一条直线,如今则变成了一条有宽度的条带。原来差别很是小的两个点(例如$w \cdot x + b = 0$附近的两个点)就能够被分红不一样的两类,可是如今至少要相差$\frac{2}{||w||}$才能够,以下图所示。
图3:设样本属于两个类,用该样本训练SVM获得的最大间隔超平面。在超平面上的样本点也称为支持向量。
图3来自wiki,为了统一块儿见,下面仍是将决策边界定义为$w \cdot x + b = 0$,两边的边界(两条虚线)分别为$w \cdot x + b = 1$和$w \cdot x + b = 1$,此时只是b的符号不一样其余性质都相同. 其中$w, b$就是模型训练时须要优化的参数。由上面的示意图能够获得如下信息:
下面是计算两条虚线之间距离的过程:
将决策边界的向量表示$w·x + b = 0$展开后能够获得,$w1*x1 + w2*x2 + b = 0$.
转化成截距式能够获得,$x2 = - w1/w2 * x1 - b/w2$,所以其斜率为$-w1/w2$, 截距为$-b/w2$
直线的方向向量为,$(1, -w1/w2)$(能够取x=1, b=0时,获得y的值)
直线的法向量为$w = (w1, w2)$
所以,对于直线$w \cdot x + b = 1$来讲,截距式为$x2 = - w1/w2 * x1 + (1 - b)/w2$,至关于沿着$x2$轴向上平移了$\frac{1}{w_2}$,计算可得该直线与$w \cdot x + b = 0$沿法向量方向的距离为$\gamma = \sqrt{\frac{1}{w_1^2 + w_2^2}} = \frac{1}{||w||}$,参考图4.
图4:margin的宽度$\gamma$
在SVM中,优化的目标就是最大化margin的宽度$\gamma$,由于$\gamma = \frac{1}{||w||}$,其中$||w||$是待优化参数$w$的模长。所以优化目标等价于最小化$||w||$,能够表示为为:
对于$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2$
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1$对于全部的$i = 1, 2, ..., m$成立
下面是分别使用感知机和SVM对鸢尾属数据集中setosa这一类和非setosa进行分类的效果比较:
图5:感知机线性分类器
图6:线性SVM的分类效果
比较图5和图6能够看到,SVM肯定的决策边界周围的margin更大一些,所以对更多未知的样本进行分类时,在边界上的一些点能够获得更准确的分类结果。
在图1中能够看到,setosa这一类与其余两类是线性可分的,可是virginica这一类与与之相邻的versicolor有一些点是重合的,也就是说是线性不可分的。此时仍然可使用SVM来进行分类,原理是在代价函数中加入了一个松弛变量(slack) $\xi$,
对于$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2 + C\sum_{i=1}^{m}{\xi^i} $
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1 - \xi_i$对于全部的$i = 1, 2, ..., m$成立
上面的优化目标加入松弛变量后,就能够容许必定程度的违反两边的边界(由上式中的C来控制),容许必定的错误分类,从而将两类原来线性不可分的两类数据分开。
下面是$C=1000$时,对virginica和非virginica的分类效果:
图8:加入松弛变量后的SVM分类效果
C做为SVM模型的超参数之一,须要从一个较大的范围中一步一步的筛选,直到找到最适合的C。C值越大,表示错误分类的代价越大,就越趋于拒绝错误分类,即hard margin;C值越小,表示错误分类的代价越小,就越能容忍错误分类,即soft margin。即便是在线性可分的状况下,若是C设置的很是小,也可能致使错误分类的出现;在线性不可分的状况下,设置过大的C值会致使训练没法收敛。
支持向量回归模型(Support Vector Regression, SVR)是使用SVM来拟合曲线,作回归分析。分类和回归问题是有监督机器学习中最重要的两类任务。与分类的输出是有限个离散的值(例如上面的$\{-1, 1\}$)不一样的是,回归模型的输出在必定范围内是连续的。下面再也不考虑不一样鸢尾花的类型,而是使用花瓣的长度(至关于自变量x)来预测花瓣的宽度(至关于因变量y)。
下图中从全部150个样本中,随机取出了80%做为训练集:
图9:训练SVR模型的训练样本
下面是使用线性SVR训练出来的回归线:
图10:SVR模型训练出来的回归线
与SVM是使用一个条带来进行分类同样,SVR也是使用一个条带来拟合数据。这个条带的宽度能够本身设置,利用参数$\epsilon$来控制:
图11:SVR模型回归效果示意图,其中带红色环的点表示支持向量
在SVM模型中边界上的点以及两条边界内部违反margin的点被当作支持向量,而且在后续的预测中起做用;在SVR模型中边界上的点以及两条边界之外的点被当作支持向量,在预测中起做用。按照对偶形式的表示,最终的模型是全部训练样本的线性组合,其余不是支持向量的点的权重为0. 下面补充SVR模型的代价函数的图形:
图12:soft margin SVR的代价函数
从图12中能够看到,在margin内部的这些点的error都为0,只有超出了margin的点才会计算error。所以SVR的任务就是利用一条固定宽度的条带(宽度由参数$\epsilon$来控制)覆盖尽量多的样本点,从而使得总偏差尽量的小。
https://zh.wikipedia.org/wiki/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA
https://zhuanlan.zhihu.com/p/26263309, 直线方程的各类形式
https://github.com/ageron/handson-ml/blob/master/05_support_vector_machines.ipynb
http://www.svms.org/regression/SmSc98.pdf
http://www.robots.ox.ac.uk/~az/lectures/ml/
edx: UCSanDiegoX - DSE220x Machine Learning Fundamentals
https://github.com/OnlyBelter/jupyter-note/blob/master/machine_learning/SVM/04_how%20SVM%20becomes%20to%20SVR.ipynb, 文中代码