主要思想
上篇文章提到了线性可分支持向量机,顾名思义,这个算法可以解决线性可分的数据,但在实际情况下几乎不存在完全线性可分的数据,为解决这个问题,需要引入“软间隔”这个概念,意思是允许一些点不满足约束条件 y i ( w ⃗ ⋅ x ⃗ j + b ) ≥ 1 y_i(\vec w\cdot\vec x_j+b)\ge1 yi(w⋅xj+b)≥1
引入 Hinge 函数
使用 h i n g e hinge hinge 损失函数将原优化问题
min w ⃗ 1 2 ∥ w ⃗ ∥ 2 s . t . y i ( w ⃗ ⋅ x ⃗ j + b ) ≥ 1 \min\limits_{\vec w}\frac{1}{2}\parallel\vec w\parallel^2\\s.t.\ y_i(\vec w\cdot\vec x_j+b)\ge1 wmin21∥w∥2s.t. yi(w⋅xj+b)≥1
改写为:
min w ⃗ 1 2 ∥ w ⃗ ∥ 2 + C ∑ i = 1 N ξ i s . t . y i ( w ⃗ ⋅ x ⃗ j + b ) ≥ 1 − ξ i \min\limits_{\vec w}\frac{1}{2}\parallel\vec w\parallel^2+C\sum\limits^N_{i=1}\xi_i\\s.t.\ y_i(\vec w\cdot\vec x_j+b)\ge1-\xi_i wmin21∥w∥2+Ci=1∑Nξis.t. yi(w⋅xj+b)≥1−ξi
其中 ξ i \xi_i ξi 为“松弛变量”, ξ i = max ( 0 , 1 − y i ( w ⃗ ⋅ x ⃗ i + b ) ) \xi_i=\max(0,1-y_i(\vec w\cdot\vec x_i+b)) ξi=max(0,1−yi(w⋅xi+b)),是一个 h i n g e hinge hinge 损失函数,它反应了所有在边界内的点(也就是分类错误的点)到边界的距离。每一个样本对应一个松弛变量,松弛变量描绘了该样本不满足约束的程度。
C > 0 C>0 C>0 为惩罚函数, C C C 越大,对分类的惩罚越大。或者可以理解为, C C C 越大,边界越小(因为一但有一个在边界内的点都会带来很大的惩罚)
拉格朗日乘子法
把原优化问题
min w ⃗ , b , x ⃗ i 1 2 ∥ w ⃗ ∥ 2 + C ∑ i = 1 N ξ i s . t . y i ( w ⃗ ⋅ x ⃗ i + b ) ≥ 1 − ξ i , ξ ≥ 0 \min\limits_{\vec w,b,\vec x_i}\frac{1}{2}\parallel\vec w\parallel^2+C\sum\limits^N_{i=1}\xi_i\\s.t.\ y_i(\vec w\cdot\vec x_i+b)\ge1-\xi_i,\ \xi\ge0 w,b,ximin21∥w∥2+Ci=1∑Nξis.t. yi(w⋅xi+b)≥1−ξi, ξ≥0
转换成拉格朗日函数
L ( w ⃗ , b , α ⃗ , ξ ⃗ , μ ⃗ ) = 1 2 ∥ w ⃗ ∥ 2 + C ∑ i = 1 N ξ i − ∑ i = 1 N α i ( y i ( w ⃗ ⋅ x ⃗ i + b ) − 1 + ξ i ) − ∑ i = 1 N μ i ξ i L(\vec w,b,\vec\alpha,\vec\xi,\vec\mu)=\frac{1}{2}\parallel\vec w\parallel^2+C\sum\limits^N_{i=1}\xi_i-\sum\limits^N_{i=1}\alpha_i(y_i(\vec w\cdot\vec x_i+b)-1+\xi_i)-\sum\limits^N_{i=1}\mu_i\xi_i L(w,b,α,ξ,μ)=21∥w∥2+Ci=1∑Nξi−i=1∑Nαi(yi(w⋅xi+b)−1+ξi)−i=1∑Nμiξi
其中 α i ≥ 0 , μ i ≥ 0 \alpha_i\ge0,\mu_i\ge0 αi≥0,μi≥0
令 L ( w ⃗ , b , ξ ⃗ ) L(\vec w,b,\vec \xi) L(w,b,ξ) 对 w ⃗ , b , ξ ⃗ \vec w,b,\vec \xi w,b,ξ 求偏导(中间略去的过程参考线性可分支持向量机)
w ⃗ = ∑ i = 1 N α i y i x ⃗ i ∑ i = 1 N α i y i = 0 C = α i + μ i \vec w=\sum\limits^N_{i=1}\alpha_iy_i\vec x_i\\\sum\limits^N_{i=1}\alpha_iy_i=0\\C=\alpha_i+\mu_i w=i=1∑Nαiyixii=1∑Nαiyi=0C=αi+μi
代回原式:
max α ⃗ ∑ i = 1 N α i − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x ⃗ i T x ⃗ j s . t . ∑ i = 1 N α i y i = 0 , 0 ≤ α i ≤ C \max\limits_{\vec\alpha}\sum\limits^N_{i=1}\alpha_i-\frac{1}{2}\sum\limits^N_{i=1}\sum\limits^N_{j=1}\alpha_i\alpha_jy_iy_j\vec x_i^T\vec x_j\\s.t.\ \sum\limits^N_{i=1}\alpha_iy_i=0,\ 0\le\alpha_i\le C αmaxi=1∑Nαi−21i=1∑Nj=1∑NαiαjyiyjxiTxjs.t. i=1∑Nαiyi=0, 0≤αi≤C
之后的过程与线性可分支持向量机相同。
调库实现:
from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import train_test_split
My_Data = datasets.load_iris()
x = My_Data['data']
y = My_Data['target']
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.3)
clf = svm.SVC(C = 1, kernel='linear')
clf.fit(train_x, train_y)
clf.predict(test_x)
print(clf.score(test_x, test_y))
同步更新于:SP-FA 的博客