在机器学习中,支持向量机(SVM)是具有相关学习算法的监督学习模型,其分析用于分类和回归分析的数据。给定一组训练示例,每个示例标记为属于两个类别中的一个或另一个,SVM训练算法构建一个模型,将新示例分配给一个类别或另一个类别,使其成为非概率二元线性分类器。SVM模型是将示例表示为空间中的点,映射使得单独类别的示例除以尽可能宽的明确间隙。然后将新的示例映射到同一空间,并根据它们落在哪个边缘预测属于一个类别。除了执行线性分类之外,SVM还可以使用所谓的内核技巧有效地执行非线性分类,将其输入隐式映射到高维特征空间。
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。支持向量机(Support Vector Machine, SVM)的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。
硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。
SVM算法原理支持向量机(SVM)——原理篇 - 知乎 (zhihu.com)
SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示, w ⋅ x + b = 0 w ·x+b=0 w⋅x+b=0 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。【机器学习】支持向量机 SVM(非常详细) - 知乎 (zhihu.com)
两类样本分别分割在该超平面的两侧;
两侧距离超平面最近的样本点到超平面的距离被最大化了。
SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述: w T x + b = 0 w^Tx+b=0 wTx+b=0,二维空间点 (x,y) 到直线 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0 的距离公式是: ∣ A x + B y + C ∣ A 2 + B 2 \frac{|Ax+By+C|}{\sqrt{A^2+B^2}} A2+B2∣Ax+By+C∣,扩展到 n 维空间后,点 x = ( x 1 , x 2 , . . . , x n ) x=(x_1,x_2,...,x_n) x=(x1,x2,...,xn) 到直线 w T x + b = 0 w^Tx+b=0 wTx+b=0 的距离为: ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ \frac{|w^Tx+b|}{||w||} ∣∣w∣∣∣wTx+b∣,如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d,其他点到超平面的距离大于 d。
在推导之前,先给出一些定义。假设给定一个特征空间上的训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ R n , y i ∈ { − 1 , + 1 } , i = 1 , 2 , . . . , N x_i\in \R^n,y_i\in\{-1,+1\},i=1,2,...,N xi∈Rn,yi∈{−1,+1},i=1,2,...,N, x i x_i xi表示第i个特征向量, y i y_i yi表示类的标记,两个类,当它等于+1时为正例;为-1时为负例。再假设训练数据集是线性可分的。
几何间隔:对于给定的数据集 T 和超平面 w ⋅ x + b = 0 w ·x+b=0 w⋅x+b=0 ,定义超平面关于样本点 ( x i , y i ) (x_i,y_i) (xi,yi) 的几何间隔为 γ i = y i ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) \gamma_i=y_i(\frac{w}{||w||}·x_i+\frac{b}{||w||}) γi=yi(∣∣w∣∣w⋅xi+∣∣w∣∣b),超平面关于所有样本点的几何间隔的最小值为 γ = min i = 1 , 2 , . . . , N γ i \gamma=\mathop{\min}\limits_{i=1,2,...,N}\gamma_i γ=i=1,2,...,Nminγi,实际上这个距离就是我们所谓的支持向量到超平面的距离。
根据以上定义,SVM模型的求解最大分割超平面问题可以表示为以下约束最优化问题
max w , b γ s . t . y i ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) > γ , i = 1 , 2 , . . . , N \mathop{\max}\limits_{w,b}\gamma\\ s.t.~~y_i(\frac{w}{||w||}·x_i+\frac{b}{||w||})>\gamma,i=1,2,...,N w,bmaxγs.t. yi(∣∣w∣∣w⋅xi+∣∣w∣∣b)>γ,i=1,2,...,N
将约束条件两边同时除以 γ \gamma γ ,得到
y i ( w ∣ ∣ w ∣ ∣ γ ⋅ x i + b ∣ ∣ w ∣ ∣ γ ) > 1 y_i(\frac{w}{||w||\gamma}·x_i+\frac{b}{||w||\gamma})>1 yi(∣∣w∣∣γw⋅xi+∣∣w∣∣γb)>1
因为 , ∣ ∣ w ∣ ∣ , γ ||w||,\gamma ∣∣w∣∣,γ 都是标量,所以为了表达式简洁起见,令 w = w ∣ ∣ w ∣ ∣ γ , b = b ∣ ∣ w ∣ ∣ γ w=\frac{w}{||w||\gamma},b=\frac{b}{||w||\gamma} w=∣∣w∣∣γw,b=∣∣w∣∣γb。
得到限制条件为 y i ( w ⋅ x i + b ) ≥ 1 , i = 1 , 2 , . . . , N y_i(w·x_i+b)\geq 1,i=1,2,...,N yi(w⋅xi+b)≥1,i=1,2,...,N,又因为最大化 γ \gamma γ ,等价于最大化 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1 ,也就等价于最小化 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2 ( 1 2 \frac{1}{2} 21 是为了后面求导以后形式简洁,不影响结果),因此SVM模型的求解最大分割超平面问题又可以表示为以下约束最优化问题:
min w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y i ( w ⋅ x i + b ) ≥ 1 , i = 1 , 2 , . . . , N \mathop{\min}\limits_{w,b}\frac{1}{2}||w||^2\\ s.t.~~y_i(w·x_i+b)\geq 1,i=1,2,...,N w,bmin21∣∣w∣∣2s.t. yi(w⋅xi+b)≥1,i=1,2,...,N
这是一个含有不等式约束的凸二次规划问题,可以对其使用拉格朗日乘子法得到其对偶问题(dual problem)。首先,我们将有约束的原始目标函数转换为无约束的新构造的拉格朗日目标函数
L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i ( y i ( w ⋅ x i + b ) − 1 ) L(w,b,\alpha)=\frac{1}{2}||w||^2-\sum^N_{i=1}\alpha_i(y_i(w·x_i+b)-1) L(w,b,α)=21∣∣w∣∣2−i=1∑Nαi(yi(w⋅xi+b)−1)
其中 α i \alpha_i αi 为拉格朗日乘子,且 α i ≥ 0 \alpha_i\geq 0 αi≥0 。现在我们令 θ ( w ) = max α ≥ 0 L ( w , b , α ) \theta(w)=\mathop{\max}\limits_{\alpha\geq 0}L(w,b,\alpha) θ(w)=α≥0maxL(w,b,α),当样本点不满足约束条件时,即在可行解区域外: y i ( w ⋅ x i + b ) < 1 y_i(w·x_i+b)<1 yi(w⋅xi+b)<1,此时,将 α i \alpha_i αi 设置为无穷大,则 θ ( w ) \theta(w) θ(w) 也为无穷大。当满本点满足约束条件时,即在可行解区域内: y i ( w ⋅ x i + b ) ≥ 1 y_i(w·x_i+b)\geq1 yi(w⋅xi+b)≥1,此时, θ ( w ) \theta(w) θ(w) 为原函数本身。于是,将两种情况合并起来就可以得到我们新的目标函数:
于是原约束问题就等价于 min w , b θ ( w ) = min w , b max α i ≥ 0 L ( w , b , α ) = p ∗ \mathop{\min}\limits_{w,b}\theta(w)=\mathop{\min}\limits_{w,b}\mathop{\max}\limits_{\alpha_i\geq0}L(w,b,\alpha)=p^* w,bminθ(w)=w,bminαi≥0maxL(w,b,α)=p∗。
看一下我们的新目标函数,先求最大值,再求最小值。这样的话,我们首先就要面对带有需要求解的参数 w 和 b 的方程,而 α i \alpha_i αi 又是不等式约束,这个求解过程不好做。所以,我们需要使用拉格朗日函数对偶性,将最小和最大的位置交换一下,这样就变成了: max α i ≥ 0 min w , b L ( w , b , α ) = d ∗ \mathop{\max}\limits_{\alpha_i\geq0}\mathop{\min}\limits_{w,b}L(w,b,\alpha)=d^* αi≥0maxw,bminL(w,b,α)=d∗。
要有 p ∗ = = d ∗ p^*==d^* p∗==d∗ ,需要满足两个条件:
优化问题是凸优化问题
满足KKT条件
首先,本优化问题显然是一个凸优化问题,所以条件一满足,而要满足条件二,即要求
为了得到求解对偶问题的具体形式,令 L ( w , b , α ) L(w,b,\alpha) L(w,b,α) 对 w 和 b 的偏导为0,可得
将以上两个等式带入拉格朗日目标函数,消去 w 和 b , 得
L ( w , b , α ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i y i ( ( ∑ j = 1 N α j y j x j ) ⋅ x i + b ) + ∑ i = 1 N α i = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i L(w,b,\alpha) =\frac12\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_j(x_i·x_j)-\sum^N_{i=1}\alpha_iy_i((\sum^N_{j=1}\alpha_jy_jx_j)·x_i+b)+\sum^N_{i=1}\alpha_i\\ =-\frac12\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum^N_{i=1}\alpha_i L(w,b,α)=21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαiyi((j=1∑Nαjyjxj)⋅xi+b)+i=1∑Nαi=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
即求 min w , b L ( w , b , α ) = min w , b ( − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i ) \mathop{\min}\limits_{w,b}L(w,b,\alpha)=\mathop{\min}\limits_{w,b}(-\frac12\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_j(x_i·x_j)+\sum^N_{i=1}\alpha_i) w,bminL(w,b,α)=w,bmin(−21∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)+∑i=1Nαi),对 α \alpha α 的极大,即是对偶问题。
把目标式子加一个负号,将求解极大转换为求解极小
现在我们的优化问题变成了如上的形式。对于这个问题,我们有更高效的优化算法,即序列最小优化(SMO)算法。我们通过这个优化算法能得到 α ∗ \alpha^* α∗ ,再根据 a l p h a ∗ alpha^* alpha∗ ,我们就可以求解出 w 和 b ,进而求得我们最初的目的:找到超平面,即”决策平面”。
SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为你这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题因为只有两个变量,且其中一个变量还能根据约束条件由另一个变量表出,所以可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
因此,整个SMO算法包括两个部分:求解两个变量二次规划的解析方法和选择变量的启发式方法。注意到只需选取的αi和αj有一个不满足KKT条件,目标函数就会在迭代后增大。直观上来看,KKT条件违背的程度越大,则变量更新后可能导致的目标函数值增幅越大。于是SMO先选取违背KKT条件程度最大的变量。第二个变量应选择一个使目标函数值增长最快的变量,但由于比较各变量所对应的目标函数值增幅的复杂度过高,因此SMO采用了一个启发式:使选取的两变量所对应样本之间的间隔最大。一种直观的解释是,这样的两个变量有很大的差别,与对两个相似的变量进行更新相比,对它们进行更新会带给目标函数值更大的变化。
前面的推导都是假设满足KKT条件下成立的,KKT条件如下
{ α i ≥ 0 y i ( w i ⋅ x i + b ) − 1 ≥ 0 α i ( y i ( w i ⋅ x i + b ) − 1 ) = 0 \begin{cases} \begin{aligned} \alpha_i\geq0\\ y_i(w_i·x_i+b)-1\geq0\\ \alpha_i(y_i(w_i·x_i+b)-1)=0 \end{aligned} \end{cases} ⎩ ⎨ ⎧αi≥0yi(wi⋅xi+b)−1≥0αi(yi(wi⋅xi+b)−1)=0
为了得到求解对偶问题的具体形式,令 L ( w , b , α ) L(w,b,\alpha) L(w,b,α) 对 w 和 b 的偏导为0,可得: w = ∑ i = 1 N α i y i x i , ∑ i = 1 N α i y i = 0 w=\sum^N_{i=1}\alpha_iy_ix_i,\sum_{i=1}^N\alpha_iy_i=0 w=∑i=1Nαiyixi,∑i=1Nαiyi=0.由此可知在 α ∗ \alpha^* α∗ 中,至少存在一个 α ∗ > 0 \alpha^*>0 α∗>0(反证法可以证明,若全为0,则 w=0 ,矛盾),对此 j 有 y j ( w ∗ ⋅ x j + b ∗ ) − 1 = 0 y_j(w^*·x_j+b^*)-1=0 yj(w∗⋅xj+b∗)−1=0。因此可以得到:
w ∗ = ∑ i = 1 N α i ∗ y i x i b ∗ = y j − ∑ i = 1 N α ∗ y i ( x i ⋅ x j ) w^*=\sum^N_{i=1}\alpha^*_iy_ix_i\\ b^*=y_j-\sum^N_{i=1}\alpha^*y_i(x_i·x_j) w∗=i=1∑Nαi∗yixib∗=yj−i=1∑Nα∗yi(xi⋅xj)
对于任意训练样本 ( x i , x j ) (x_i,x_j) (xi,xj),总有 α i = 0 \alpha_i=0 αi=0 或者 y j ( w ⋅ x j + b ) = 1 y_j(w·x_j+b)=1 yj(w⋅xj+b)=1 。若 α i = 0 \alpha_i=0 αi=0 ,则该样本不会在最后求解模型参数的式子中出现。若 a l p h a i > 0 \\alpha_i>0 alphai>0,则必有 y j ( w ⋅ x j + b ) = 1 y_j(w·x_j+b)=1 yj(w⋅xj+b)=1 ,所对应的样本点位于最大间隔边界上,是一个支持向量。这显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。
到这里都是基于训练集数据线性可分的假设下进行的,但是实际情况下几乎不存在完全线性可分的数据,为了解决这个问题,引入了“软间隔”的概念,即允许某些点不满足约束 y j ( w ⋅ x j + b ) ≥ 1 y_j(w·x_j+b)\geq1 yj(w⋅xj+b)≥1,采用hinge损失,将原优化问题改写为:
min w , b , ξ i ( 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i ) s . t . y i ( w ⋅ x i + b ) ≥ 1 − ξ i ξ i ≥ 0 , i = 1 , 2 , . . . , N \mathop{\min}\limits_{w,b,\xi_i}(\frac12||w||^2+C\sum^m_{i=1}\xi_i)\\ s.t.~~y_i(w·x_i+b)\geq1-\xi_i\\ \xi_i\geq0,i=1,2,...,N w,b,ξimin(21∣∣w∣∣2+Ci=1∑mξi)s.t. yi(w⋅xi+b)≥1−ξiξi≥0,i=1,2,...,N
其中 ξ i \xi_i ξi 为“松弛变量”, ξ i = m a x ( 0 , 1 − y i ( w ⋅ x i + b ) ) \xi_i=max(0,1-y_i(w·x_i+b)) ξi=max(0,1−yi(w⋅xi+b)) ,即一个hinge损失函数。每一个样本都有一个对应的松弛变量,表征该样本不满足约束的程度。 C > 0 C>0 C>0 称为惩罚参数,C 值越大,对分类的惩罚越大。跟线性可分求解的思路一致,同样这里先用拉格朗日乘子法得到拉格朗日函数,再求其对偶问题。
综合以上讨论,我们可以得到线性支持向量机学习算法如下:
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)} 其中, x i ∈ R n x_i\in\R^n xi∈Rn , y i ∈ { − 1 , + 1 } , i = 1 , 2 , . . . , N y_i\in\{-1,+1\},i=1,2,...,N yi∈{−1,+1},i=1,2,...,N ;
输出:分离超平面和分类决策函数。
选择惩罚参数 C > 0 C>0 C>0 ,构造并求解凸二次规划问题
min α ( 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i ) s . t . ∑ i = 1 N α i y i = 0 , α ≥ 0 , i = 1 , 2 , . . , N \mathop{\min}\limits_{\alpha}(\frac12\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_j(x_i·x_j)-\sum^N_{i=1}\alpha_i)\\ s.t.~~\sum^N_{i=1}\alpha_iy_i=0,\\ \alpha\geq0,i=1,2,..,N αmin(21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi)s.t. i=1∑Nαiyi=0,α≥0,i=1,2,..,N
得到最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha^*_1,\alpha^*_2,...,\alpha^*_N)^T α∗=(α1∗,α2∗,...,αN∗)T。
计算 w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum^N_{i=1}\alpha^*_iy_ix_i w∗=∑i=1Nαi∗yixi,选择 α ∗ \alpha^* α∗ 的一个分量 α j ∗ \alpha^*_j αj∗ 满足条件 0 < α j ∗ < C 0<\alpha^*_j
求分离超平面 w ∗ ⋅ x + b ∗ = 0 w^*·x+b^*=0 w∗⋅x+b∗=0,分类决策函数: f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) f(x)=sign(w^*·x+b^*) f(x)=sign(w∗⋅x+b∗)。
非线性SVM算法原理:对于输入空间中的非线性分类问题,可以通过非线性变换将它转化为某个维特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。由于在线性支持向量机学习的对偶问题里,目标函数和分类决策函数都只涉及实例和实例之间的内积,所以不需要显式地指定非线性变换,而是用核函数替换当中的内积。核函数表示,通过一个非线性转换后的两个实例间的内积。具体地, K ( x , z ) K(x,z) K(x,z) 是一个函数,或正定核,意味着存在一个从输入空间到特征空间的映射 ϕ ( x ) \phi(x) ϕ(x) ,对任意输入空间中的 x,z ,有: K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) K(x,z)=\phi(x)·\phi(z) K(x,z)=ϕ(x)⋅ϕ(z),在线性支持向量机学习的对偶问题中,用核函数 K ( x , z ) K(x,z) K(x,z) 替代内积,求解得到的就是非线性支持向量机 f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i K ( x , x i ) + b ∗ ) f(x)=sign(\sum^N_{i=1}\alpha^*_iy_iK(x,x_i)+b^*) f(x)=sign(∑i=1Nαi∗yiK(x,xi)+b∗)。
综合以上讨论,我们可以得到非线性支持向量机学习算法如下:
输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)} T=(x1,y1),(x2,y2),...,(xN,yN) 其中 x i ∈ R n x_i\in\R^n xi∈Rn, y i ∈ − 1 , + 1 , i = 1 , 2 , . . . , N y_i\in{-1,+1},i=1,2,...,N yi∈−1,+1,i=1,2,...,N ;
输出:分离超平面和分类决策函数。
选取适当的核函数 K ( x , z ) K(x,z) K(x,z) 和惩罚参数 C > 0 C>0 C>0,构造并求解凸二次规划问题
min α ( 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i ) s . t . ∑ i = 1 N α i y i = 0 , α ≥ 0 , i = 1 , 2 , . . , N \mathop{\min}\limits_{\alpha}(\frac12\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_j(x_i·x_j)-\sum^N_{i=1}\alpha_i)\\ s.t.~~\sum^N_{i=1}\alpha_iy_i=0,\\ \alpha\geq0,i=1,2,..,N αmin(21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi)s.t. i=1∑Nαiyi=0,α≥0,i=1,2,..,N
得到最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha^*_1,\alpha^*_2,...,\alpha^*_N)^T α∗=(α1∗,α2∗,...,αN∗)T。
计算:选择 α ∗ \alpha^* α∗ 的一个分量 α j ∗ \alpha^*_j αj∗ 满足条件 0 < α j ∗ < C 0<\alpha^*_j
分类决策函数: f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i K ( x , x i ) + b ∗ ) f(x)=sign(\sum^N_{i=1}\alpha^*_iy_iK(x,x_i)+b^*) f(x)=sign(∑i=1Nαi∗yiK(x,xi)+b∗).
介绍一个常用的核函数——高斯核函数: K ( x , z ) = e x p ( − ∣ ∣ x − z ∣ ∣ 2 2 δ 2 ) K(x,z)=exp(-\frac{||x-z||^2}{2\delta^2}) K(x,z)=exp(−2δ2∣∣x−z∣∣2)。
对应的SVM是高斯径向基函数分类器,在此情况下,分类决策函数为 f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i e x p ( − ∣ ∣ x − z ∣ ∣ 2 2 δ 2 ) + b ∗ ) f(x)=sign(\sum^N_{i=1}\alpha^*_iy_iexp(-\frac{||x-z||^2}{2\delta^2})+b^*) f(x)=sign(∑i=1Nαi∗yiexp(−2δ2∣∣x−z∣∣2)+b∗)
支持向量机不仅可以用来解决分类问题还可以用来解决回归问题,称为支持向量回归(Support Vector Regression,SVR)。
SVM的优缺点
SVM在中小量样本规模的时候容易得到数据和特征之间的非线性关系,可以避免使用神经网络结构选择和局部极小值问题,可解释性强,可以解决高维问题。有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;能找出对任务至关重要的关键样本(即:支持向量);采用核技巧之后,可以处理非线性分类/回归任务;最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
SVM对缺失数据敏感,对非线性问题没有通用的解决方案,核函数的正确选择不容易,计算复杂度高 O ( n 2 ) O(n^2) O(n2),主流的算法可以达到O(n2)的复杂度,这对大规模的数据是吃不消的。训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 N 为训练样本的数量;当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 O ( n 2 ) O(n^2) O(n2) ;模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。
导包,加载鸢尾花数据集
from sklearn import datasets # 采用sklearn中内置的数据集
from sklearn.model_selection import train_test_split # skearn内置的训练集和测试集划分函数
from sklearn.preprocessing import StandardScaler # 去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。标准差标准化(standardScale)使得经过处理的数据符合标准正态分布,即均值为0,标准差为1
from sklearn.svm import SVC # svm用来做分类的,Support Vector Classification就是支持向量机用于分类,
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
# 准备鸢尾花数据集
iris = datasets.load_iris()
# iris.data 一共有4个特征
X = iris.data[:,[2,3]] # 只使用2个特征: petal length and petal width 以及3个类别
y = iris.target # 获取数据的标签数据
print(X.shape, y.shape)
print('Class labels:', np.unique(y))
(150, 2) (150,)
Class labels: [0 1 2]
数据预处理,绘图
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
# standardize the features 以获得最佳性能
sc = StandardScaler() # 标准化处理实例化
sc.fit(X_train) # fit() 就是求得训练集X的均值啊,方差啊,最大值啊,最小值啊这些训练集X固有的属性。可以理解为一个训练过程
X_train_std = sc.transform(X_train) # transform() 在Fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。
X_test_std = sc.transform(X_test)
# fit_transform是fit和transform的组合,既包括了训练又包含了转换。
# 绘制分类决策边界:
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
# setup marker generator and color map
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
# plot the decision surface
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), # numpy.meshgrid()——生成网格点坐标矩阵。
np.arange(x2_min, x2_max, resolution))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap) # 绘制等高线
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
alpha=0.8, c=colors[idx],
marker=markers[idx], label=cl,)
# highlight test samples
if test_idx:
# plot all samples
X_test, y_test = X[test_idx, :], y[test_idx]
plt.scatter(X_test[:, 0], X_test[:, 1], alpha=1.0,
linewidth=1, marker='o',
s=100, label='test set')
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='linear', C=1.0, random_state=1)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()
API Reference — scikit-learn 1.2.2 documentation
SVM=Support Vector Machine 是支持向量;
SVC=Support Vector Classification就是支持向量机用于分类,
SVR=Support Vector Regression.就是支持向量机用于回归分析
svm.LinearSVC Linear Support Vector Classification.
svm.LinearSVR Linear Support Vector Regression.
svm.NuSVC Nu-Support Vector Classification.
svm.NuSVR Nu Support Vector Regression.
svm.OneClassSVM Unsupervised Outlier Detection.
svm.SVC C-Support Vector Classification.
svm.SVR Epsilon-Support Vector Regression.
sklearn中SVM的算法库分为两类,一类是分类的算法库,主要包含LinearSVC,NuSVC和SVC三个类,另一类是回归算法库,包含SVR,NuSVR和LinearSVR三个类,相关模块都包裹在sklearn.svm模块中。
对于SVC,NuSVC和LinearSVC 三个分类的库,SVC和NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。
同样的对于SVR,NuSVR和LinearSVR 三个回归的类,SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。
我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类或者LinearSVR去回归,他们不需要我们去慢慢的调参选择各种核函数以及对应的参数,速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。
实现rbf核以及相对较小的 γ \gamma γ值,能得到更加soft的决策边界
svm = SVC(kernel='rbf', random_state=1, gamma=0.2, C=1.0)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()
创建一个简单的数据集,它具有XOR门的形式;其中100个样本将被分配给类标签1,100个样本将被分配给类标签-1。
np.random.seed(1)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor == 1, 0], X_xor[y_xor == 1, 1], c='b', marker='x', label='1')
plt.scatter(X_xor[y_xor == -1, 0], X_xor[y_xor == -1, 1], c='r', marker='s', label='-1')
plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.show()
svm = SVC(kernel='rbf', random_state=1, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier=svm)
plt.legend(loc='upper left')
plt.show()
linear
poly
sigmoid
precomputed(自定义核函数)
参数:
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’Python机器学习笔记:SVM(4)——sklearn实现 - 知乎 (zhihu.com)
linear:线性分类器(C越大分类效果越好,但有可能会过拟合(default C=1))
poly:多项式分类器
rbf:高斯模型分类器(gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。)
sigmoid:sigmoid核函数
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。 如果gamma是’auto’,那么实际系数是1 / n_features。
coef0 :核函数中的独立项。 它只在’poly’和’sigmoid’中很重要。
probability :是否启用概率估计。 必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False
shrinking :是否采用shrinking heuristic方法(收缩启发式),默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
verbose :允许冗余输出
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=ovr
random_state :数据洗牌时的种子值,int值,default=None,在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。
认为最重要的参数有:C,kernel、degree、gamma、coef0、decision_function_shape。
SVM算法库其他调参要点