SVM背后的数学推导比较复杂,我根据自己的学习写了一篇笔记,只用到少量的数学公式,帮助理解和记忆。
- SVM要解决的基本问题:在二分类问题中,可能有多个能把两类数据完全分开的超平面,在这些超平面中,找到最佳的分类超平面;
- 最佳分类超平面到两类数据中距离最近的点距离相等且距离最大,这个距离的两倍是分类间隔,具有最大分类间隔的超平面就是SVM要找的最佳超平面;
- 最佳超平面两侧距离最近的这些数据点在坐标系中对应的向量就是支持向量。
因此SVM是一个最优化问题:
- 优化对象:最佳分类超平面
- 优化目标:使分类间隔最大
- 限制条件:所有数据点到最佳超平面的距离都大于等于最大分类间隔的一半
数学建模:
-
要求得的最佳超平面:wx+b=0,即确定最佳的w和b
-
分类间隔:支持向量数据点到最佳分类超平面的距离可由点到直线距离公式计算如下(1)
d = ∣ w x + b ∣ ∣ ∣ w ∣ ∣ d = \frac{\left|wx+b\right|}{\left||w\right||}\qquad d=∣∣w∣∣∣wx+b∣
分类间隔就是2d,最佳的超平面使分类间隔最大
-
限制条件:
-
数据集中所有数据样本点都要被最佳超平面正确分类
-
且离最佳超平面的距离大于等于d
于是有(2)
-
( w x i + b ) / ∣ ∣ w ∣ ∣ ≥ d ∀ y i = 1 ( w x i + b ) / ∣ ∣ w ∣ ∣ ≤ − d ∀ y i = − 1 \left(wx_i+b\right)/\left||w\right||\geq d\qquad\forall y_i=1\\ \left(wx_i+b\right)/\left||w\right||\leq -d\qquad\forall y_i=-1 (wxi+b)/∣∣w∣∣≥d∀yi=1(wxi+b)/∣∣w∣∣≤−d∀yi=−1
在上面的式子两边同时除以d,得到(3)
( w d x i + b d ) / ≥ 1 ∀ y i = 1 ( w d x i + b d ) / ≤ 1 ∀ y i = − 1 \left(w_dx_i+b_d\right)/\geq 1\forall y_i=1\\ \left(w_dx_i+b_d\right)/\leq 1\forall y_i=-1 (wdxi+bd)/≥1∀yi=1(wdxi+bd)/≤1∀yi=−1
其中
w d = w / d ∣ ∣ w ∣ ∣ , b d = b / d ∣ ∣ w ∣ ∣ w_d=w/d\left||w\right||,b_d=b/d\left||w\right|| wd=w/d∣∣w∣∣,bd=b/d∣∣w∣∣
用
w d 和 b d w_d和b_d wd和bd
替换最佳超平面中的w和d,最佳超平面不变(因为等式两边乘以相同倍数,等式不变),令
w = w d , b = b d w=w_d,b=b_d w=wd,b=bd
支持向量到最佳超平面的距离可由上(1)化为
d = 1 / ∣ ∣ w ∣ ∣ d=1/\left||w\right|| d=1/∣∣w∣∣
分类间隔就是:
2 d = 2 / ∣ ∣ w ∣ ∣ 2d=2/\left||w\right|| 2d=2/∣∣w∣∣
于是要优化的目标变为使(4):
2 ∣ ∣ w ∣ ∣ \frac{2}{\left||w\right||} ∣∣w∣∣2
最大,
限制条件则由上(3)变为(5):
( w x i + b ) ≥ 1 ∀ y i = 1 ( w x i + b ) / ≤ − 1 ∀ y i = − 1 \left(wx_i+b\right)\geq 1\forall y_i=1\\ \left(wx_i+b\right)/\leq -1\forall y_i=-1 (wxi+b)≥1∀yi=1(wxi+b)/≤−1∀yi=−1
对(4)求最大等效于对(6)
1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}\left||w\right||^2 21∣∣w∣∣2
求最小值,对(5)限制条件的两个不等式两边同时乘上标签值
y i y_i yi
得到(7)
y i ( w x i + b ) ≥ 1 i = 1 , 2 , . . . , m y_i(wx_i+b)\geq1 \qquad i=1,2,...,m yi(wxi+b)≥1i=1,2,...,m
总结一下线性SVM最优化问题的数学描述:
m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 min_{w,b}\frac{1}{2}\left||w\right||^2 minw,b21∣∣w∣∣2
s . t . y i ( w x i + b ) ≥ 1 , i = 1 , 2 , . . . , m s.t.y_i(wx_i+b)\geq1, i=1,2,...,m s.t.yi(wxi+b)≥1,i=1,2,...,m
这是SVM标准问题的数学描述,与之对应还有对偶问题。
标准问题是一个凸二次规划问题。这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。
转化为对偶问题的目的:
- 对偶问题往往更容易求解,原问题求解时的维数是训练样本的特征维数+1,而对偶问题求解时的维数是样本个数,因此相比深度神经网络,支持向量机特别擅长于特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题,特别是如果用了核函数,可以将特征空间的维数变得很大乃至无穷,这是求标准问题是比较困难的。另外,在SKlearn的LinearSVC方法里有一个dual参数,其说明里也提到,Prefer dual=False when n_samples > n_features.;
- 转化至对偶问题的推导结果可以自然的引入核函数,进而推广到非线性分类问题。
对偶问题求解的讲解和推导过程比较繁琐,可以看参考资料1
通过求解对偶问题得到
w = ∑ S V α i x i y i w = \sum_{SV}\alpha_ix_iy_i w=∑SVαixiyi
其中SV表示支持向量,因此计算w只需支持向量即可。
分类函数为:
f ( x ) = ( ∑ S V α i x i y i ) T x + b = ∑ S V α i y i ( x i , x ) + b f(x) = (\sum_{SV}\alpha_ix_iy_i)^Tx+b=\sum_{SV}\alpha_iy_i(x_i,x)+b f(x)=(∑SVαixiyi)Tx+b=∑SVαiyi(xi,x)+b
可以看到,对于新点 x的预测,只需要计算它与支持向量数据点的内积即可,由此,引出kernel,将SVM推广到非线性分类,对于线性不可分的情况,选择一个核函数,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
( x i , x ) ⇒ k ( x i , x ) (x_i,x)\Rightarrow k(x_i,x) (xi,x)⇒k(xi,x)
几种kernel:
- 多项式核(polynomial)和线性核(linear)
k ( x i , x ) = ( ζ + γ x i T x ) Q k(x_i,x) = (\zeta+\gamma x_i^Tx)^Q k(xi,x)=(ζ+γxiTx)Q
Q=1时是基本的线性核,γ大时分类超平面更复杂。
通常先尝试线性核,不行再试非线性
- 高斯核(RBF)
k ( x i , x ) = e x p ( − γ ∣ ∣ x i − x ∣ ∣ 2 ) k(x_i,x) =exp(-\gamma||x_i-x||^2) k(xi,x)=exp(−γ∣∣xi−x∣∣2)
可以处理无限维的问题,当γ过大的时候可能会有过拟合问题。
提到过拟合问题,我们可以看到之前的讨论都是基于要对数据进行完美分类的,这也叫做hard margin SVM(硬间隔),这种情况下,如果训练数据中有噪声,就会过拟合,由此引出软间隔,soft margin SVM。
在前面的标准问题里,约束条件是
y i ( w x i + b ) ≥ 1 , i = 1 , 2 , . . . , m y_i(wx_i+b)\geq1, i=1,2,...,m yi(wxi+b)≥1,i=1,2,...,m
假设允许数据点跑到分类间隔内,约束条件变为
y i ( w x i + b ) ≥ 1 − ξ i , i = 1 , 2 , . . . , m y_i(wx_i+b)\geq1-\xi_i, i=1,2,...,m yi(wxi+b)≥1−ξi,i=1,2,...,m
其中
ξ i ≥ 0 \xi_i\geq0 ξi≥0
称为松弛变量 (slack variable),对应数据点允许跑到分隔边界内的量;
相应的,原来的目标函数也要改为
m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i min_{w,b}\frac{1}{2}\left||w\right||^2+C\sum_{i=1}^n\xi_i minw,b21∣∣w∣∣2+C∑i=1nξi
其中C是一个超参数,用于控制目标函数中两项——large margin和margin violation之间的trade-off,要优化带松弛变量的目标函数,从上式中可以推断:
- C较大的时候,对噪声的容忍较小,容易过拟合;
- C较小的时候,得出的分类间隔可能较大,可能欠拟合。
因此,C是SVM算法中一个可以调节的超参数。
总结一下SVM的使用,一般一开始是直接用线性核SVM,不行再上多项式核甚至高斯核,如果用多项式核,可调节超参数包括ξ、γ和Q,如果是高斯核,可调节超参数是γ,如果使用软间隔,则错误惩罚参数C也可以调节。
Sklearn中参数C是Penalty parameter of the error term,取值范围为0-1,决定了分类器对于误分类的容忍度,C的取值越大,容忍度越低。当C=1时,分类器不允许误分类的存在。如果SVM当下配合的核函数是非线性函数,如RBF,那么在高维空间的确可以找到完全没有误分的方法。但如果用线性核搭配C=1或者较大的C,而数据又不是线性可分的,那么有很大的概率分类器不会收敛,会一直运行下去。
如果你的数据集不大且长时间SVM无法收敛,可以尝试:
- 检查是否同时使用了 线性核 以及 C=1 (或其他较大的值)
- 尝试将训练数据进行归一化或者标准化 (是否是因为优化过程出了问题)
- 尝试设置最大训练次数,默认的max_iter = -1会导致训练器无限运行下去