教程地址:http://www.showmeai.tech/tutorials/34
本文地址:http://www.showmeai.tech/article-detail/196
声明:版权所有,转载请联系平台与作者并注明出处
本篇我们要讲解的模型是大名鼎鼎的支持向量机SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但SVM在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。
支持向量机学习方法,针对不同的情况,有由简至繁的不同模型:
支持向量机可以借助核技巧完成复杂场景下的非线性分类,当输入空间为欧式空间或离散集合、特征空间为希尔贝特空间时,核函数(kernel function)表示将输入从输入空间映射到特征空间得到的特征向量之间的内积。
通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。这样的方法称为核技巧。
分类问题是监督学习的一个核心问题。在监督学习中,当输出变量取有限个离散值时,预测问题便成为分类问题。实际生活中,有很多问题的本质都是分类,如识别某种模式:文本分类、分词、词性标注、图像内容识别和目标检测等。
分类问题的数学理解是空间划分(或者寻找不同类别的决策边界),如下图所示是一个简单的线性分类器(这部分更详细的讲解参考ShowMeAI文章 图解机器学习 | 机器学习基础知识 和 图解机器学习 | 逻辑回归算法详解)。
不同的模型在解决分类问题时,会有不同的处理方式,直观上看,我们会使用不同的决策边界对样本进行划分。
如下图中「冰墩墩」与「雪容融」两类样本点,我们对其进行分类,可以完成该分类任务的决策边界有无数个。而我们这里介绍到的SVM模型,要求更高一些,它不仅仅希望把两类样本点区分开,还希望找到鲁棒性最高、稳定性最好的决策边界(对应图中的黑色直线)。
这个决策边界与两侧「最近」的数据点有着「最大」的距离,这意味着决策边界具有最强的容错性,不容易受到噪声数据的干扰。直观的理解就是,如果决策边界抖动,最不容易「撞上」样本点或者进而导致误判。
我们要找到把下图中红蓝两色的图标点分开的最优分界线。令红色的图标点 =+1 ,蓝色的图标的点 =-1 ,直线 f(x) = \boldsymbol{w}\cdot \boldsymbol{x} + b ,这里 w、x 是向量,其实公式等价于 f(x) = w_1x_1 + w_2x_2 +…+ w_nx_n + b 。
当有一个新的点 x 需要预测属于哪个分类的时候,我们用 sgn(f(x)) 就可以预测了。 sgn 表示符号函数:
回到重点,我们怎样才能取得一个最优的划分直线 f(x) 呢?下图的直线表示几条可能的 f(x) :
我们希望这条直线满足「最大间隔」原则,也就是如下图的形态。图中位于红色和蓝色线上的图标就是所谓的支持向量(support vector)。
决策边界就是 f(x) ,红色和蓝色的线是支持向量(support vector)所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙M(Margin Width)。
这里直接给出间隔M的计算公式: M=\frac{2}{\left \| w \right \| } 。
SVM要求解能够正确划分训练数据集并且「几何间隔」最大的分离超平面。
如下图所示, \boldsymbol{w} \cdot \boldsymbol{x}+b=0 即为分离超平面。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
我们先做一些定义,假设给定一个特征空间上的训练数据集: T={(x_1, y_1),(x_2, y_2), \ldots,(x_N, y_N)} 。且训练数据集是线性可分的,其中:
对于给定的数据集 T 和超平面 wx+b=0 。
① 根据以上定义,SVM模型的「求解最大分割超平面问题」可以表示为以下约束最优化问题:
② 将约束条件两边同时除以 \gamma 得到:
③ 因为 \left \| w \right \| 、 \gamma 都是标量,所以为了表达式简洁,令: w=\frac{w}{\left \| w \right \| \gamma} 、 b=\frac{b}{\left \| w \right \| \gamma} 得到:
④ 又因为最大化 \gamma ,等价于最大化 \frac{1}{\left \| w \right \|} ,也就等价于最小化 \frac{1}{2}\left \| w \right \|^{2} ,最终SVM模型的求解最大分割超平面问题又可以表示为以下约束最优化问题:
求解线性可分支持向量机的最优化问题,我们很多时候会将它转化为对偶问题(dual problem)来求解,也就是应用「拉格朗日对偶性」,通过求解「对偶问题(dual problem)」得到「原始问题(primal problem)」的最优解,即线性可分支持向量机的对偶算法(dual algorithm)。
这样做有一些优点:
① 我们首先构建拉格朗日函数(Lagrange function)。为此,对每一个不等式约束引进拉格朗日乘子(Lagrange multiplier) \alpha_i\geq 0,i=1,2,…,N ,定义拉格朗日函数:
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题: \max_{\alpha}\min_{w,b}L(w, b, \alpha) 。所以,为了得到对偶问题的解,需要先求 L(w, b, \alpha) 对 w、b 的极小值,再求对 \alpha 的极大值。
② 求 L(w, b, \alpha) 对 w、b 的极小值
将拉格朗日函数 L(w, b, \alpha) 分别对 w、b 求偏导,并令其值为0。
将上式代入拉格朗日函数,即得:
③ 求 \min_{w,b}L(w, b,\alpha) 对 \alpha 的极大值,即对偶问题
将式中的目标函数由求极大转换成求极小,就得到下面与之等价的对偶最优化问题:
④ 对线性可分训练数据集,假设对偶最优化问题对 \alpha 的解为 \alpha^*=(\alpha_1^*,\alpha_2^*,…,\alpha_N^*)^ T ,可以由 \alpha^* 求得原始最优化问题的解 w^*、b^* 。
有下面的定理:设 \alpha^*=(\alpha_1^*,\alpha_2^*,…,\alpha_N^*)^T 是对偶最优化问题的解,则存在下标 j ,使得 \alpha_j^*>0 ,并可按下式求得原始最优化问题的解 w^*,b^* :
证明:根据定理,KKT条件成立,即得:
由此得 w^*=\sum_{i=1}^{N} \alpha_i^*y_ix_i ,其中至少有一个 \alpha_j^*>0 (用反正法,假设 \alpha_j^*=0 ,由式可知 w^*=0 ,而 w^*=0 不是原始最优化问题的解,产生矛盾),由此对 j 有: y_j(w^*\cdot x_j+b^*) – 1 = 0
将式代入并注意到 y_j^2=1 ,即得: b^* = y_j – w^*{}x_j = y_j – \sum_{i=1}^{N} \alpha_i^*y_i(x_ix_j)
⑤ 由此定理可知,分离超平面可以写成
⑥ 分类决策函数可以写成
也就是说,这里的决策函数只依赖于输入 x 和训练样本输入的内积。上式亦称作线性可分SVM的对偶形式。
综上所述,对于给定得线性可分训练数据集,可以首先求对偶问题的解 \alpha^* ;再利用公式求得原始问题的解 w^*,b^* ;从而得到分离超平面及分类决策函数。这种算法称为线性可分支持向量机的对偶学习算法,是线性可分支持向量机学习的基本算法。
我们前面提到的是线性可分的情况,但实际应用中完全线性可分的情况太少见了。如下图就是一个典型的线性不可分的分类图(我们没有办法找到一条直线,把空间划分为2个区域,一个区域只有黑点,一个区域只有白点)。
要对其进行切分,有2种方案:
方案1:用曲线去将其完全分开,即非线性的决策边界,这会和之后谈到的核函数关联。
方案2:还是使用直线,不过不追求完全可分,会适当包容一些分错的情况,在这个过程中我们会在模型中加入惩罚函数,尽量让分错的点不要太多太离谱。对分错点的惩罚函数就是这个点到其正确位置的距离,如下图所示:
图上黄色、蓝色的直线分别为支持向量所在的边界,黑色的线为决策函数,那些绿色的线表示分错的点到其相应的决策面的距离,这样我们可以在原函数上面加上一个惩罚函数,并且带上其限制条件为:
上述公式为在线性可分问题的基础上加上的惩罚函数部分,当 x_i 在正确一边的时候, \varepsilon = 0 ,R为全部的点的数目,C是一个由用户去指定的系数,表示对分错的点加入多少的惩罚:
实际我们也会调整和选择合适的C值。
经过这个变换之后,我们可以同样求解一个拉格朗日对偶问题,得到原问题的对偶问题的表达式:
在线性不可分情况下得到的对偶问题,不同的地方就是α的范围从[0, +∞),变为了0, C,增加的惩罚 \varepsilon 没有为对偶问题增加太多复杂度。
如果我们要处理的分类问题更加复杂,甚至不能像上面一样近似线性可分呢,这种情况下找到的超平面分错的程度太高不太可接受。
对于这样的问题,一种解决方案是将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,然后再运用SVM求解,如下图所示:
比如下图中的典型线性不可分的情况:
当我们使用映射函数 z_{1}=x_{1}^{2}, z_{2}=x_{2}^{2}, z_{3}=x_{2} 把这两个类似于椭圆形的点映射到三维空间 (z_1,z_2,z_3) 后,对映射后的坐标加以旋转之后就可以得到一个线性可分的点集了。
我们回忆一下之前得到的对偶问题表达式:
做一点小小的改造,令: x_{i}^{T} x_{j}=\kappa\left(x_{i}, x_{j}\right) 。这个式子所做的事情就是将线性的空间映射到高维的空间, \kappa\left(x_{i}, x_{j}\right) 有很多种,下面是比较典型的两种:
上述两个核函数分别为多项式核和高斯核,高斯核甚至是将原始空间映射为无穷维空间,另外核函数有一些比较好的性质,比如说不会比线性条件下增加多少额外的计算量,等等,此处我们不深入。对于一个问题,不同的核函数可能会带来不同的结果,我们需要做一些尝试来支撑选择(关于这个部分,大家可以看最下方的python实现部分)。
支持向量机(Support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化,同时该方法可以形式化为一个求解图二次规划。
SVM由简至繁可分为三类:线性可分支持向量机、硬间隔(hard-margin svm);线性支持向量机、软间隔(soft-margin svm);非线性支持向量机、Kernel SVM。
SVM中存在三宝:间隔、对偶、核技巧。
更多监督学习的算法模型总结可以查看ShowMeAI的文章AI知识技能速查 | 机器学习-监督学习。
我们这里直接借助于python机器学习工具包sklearn来演示SVM的应用,sklearn中对SVM的算法实现都包在sklearn.svm下面,具体见sklearn官方文档,其中SVC类是用来进行进行分类的任务,SVR是用来进行数值回归任务的。
不同的核函数需要指定不同的参数。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两维特征,方便可视化
y = iris.target
svc = svm.SVC(kernel='linear', C=1).fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()
初始化svm对象的代码替换为下面这行
svc = svm.SVC(kernel='poly', degree=3).fit(X, y)
初始化svm对象的代码替换为下面这行
svc = svm.SVC(kernel='rbf', C=1).fit(X, y)
gamma 值越大,SVM 就会倾向于越准确的划分每一个训练集里的数据,这会导致泛化误差较大和过拟合问题。
C:错误项的惩罚参数C。它还控制平滑决策边界和正确分类训练点之间的权衡。
可以点击 B站 查看视频的【双语字幕】版本
【双语字幕+资料下载】斯坦福CS229 | 机器学习-吴恩达主讲(2018·完整版)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。