SVM 概述
支持向量机:是一种监督学习的算法。
前置芝士:
- 支持向量:就是距离超平面最近的那些点
- 机:表示一种算法
- 超平面:就是分割数据的一个(n-1)维的面,就是分类的决策边界
- 线性可分:数据可以通过画一条直线就可以将它们完全分开
- 线性不可分:上一条相反的意思
场景
- 给左右两边的点进行分类
- 直觉就会发现D这种分类方法最好
算法流程:
我们找到函数间隔最小值的向量(也就是找到支持向量),然后让几何间隔最大化。
函数间隔、几何间隔、为什么这样选择是最优得我下面会说。
本质:求一个函数最小化的最大值得过程
所以什么是函数间隔和几何间隔呢?
函数间隔:
就是训练数据集T中得样本点( x i x_i xi, y i y_i yi)距离超平面 w T x + b w^{T}x+b wTx+b 的距离。
r ^ = l a b l e k ∗ ( w T x k + b ) \widehat{r}=lable_{k}\ast \left( w^{T}x_{k}+b\right) r =lablek∗(wTxk+b)
(lable表示分类决策,lable == 1表示在正分类,lable == -1表示在负分类。前面用label乘一下来保证这个间隔是非负的)
只要等比例改变w和b,超平面没变但是函数间隔变了为什么呢?
答案: 函数间隔能表示分类的正确性和可信度,但无法表示出间隔的数量大小(定性表示)。我们因此就引入了几何间隔。
几何间隔:
r ^ = l a b l e k ∗ ( W T x + b ) ∥ W ∥ \widehat{r}=\dfrac{lable_{k}*(W^{T}x+b)}{\left\| W\right\| } r =∥W∥lablek∗(WTx+b)
下图形象的解释了函数间隔和几何间隔
有了上面的讲解,目标函数就很容易就的出来了。
a r g : m a x w , b ( m i n [ l a b e l ∗ ( w T x + b ) ] ∗ 1 ∣ ∣ w ∣ ∣ ) arg: max_{w, b} \left( min[label*(w^Tx+b)]*\frac{1}{||w||} \right) arg:maxw,b(min[label∗(wTx+b)]∗∣∣w∣∣1)
目标函数非常的复杂吗,那么我们怎么优化函数让其便于求解呢?:
- 令 l a b e l ∗ ( w T x + b ) > = 1 label*(w^Tx+b)>=1 label∗(wTx+b)>=1,因为0-1之间,得到的点存在误判的可能性,所以要保证 m i n [ l a b e l ∗ ( w T x + b ) = = 1 min[label*(w^Tx+b)==1 min[label∗(wTx+b)==1,才能更好的降低噪音数据的影响。
因为要保证函数间隔最小(找到支持向量),所以将最小的函数距离设为1,也就是说非支持向量的函数距离大于1
- 所以目标函数得以简化为:
a r g : m a x w , b ( 1 ∣ ∣ w ∣ ∣ ) arg: max_{w, b} \left( \frac{1}{||w||} \right) arg:maxw,b(∣∣w∣∣1)
前提条件为: l a b e l ∗ ( w T x + b ) = = 1 label*(w^Tx+b)==1 label∗(wTx+b)==1
3.进一步化简:
a r g : m a x w , b ( 1 ∣ ∣ w ∣ ∣ ) = > arg: max_{w, b} \left( \frac{1}{||w||} \right) => arg:maxw,b(∣∣w∣∣1)=> a r g : m i n w , b ( ∣ ∣ w ∣ ∣ ) arg: min_{w, b}\left( {||w||} \right) arg:minw,b(∣∣w∣∣)
(求矩阵偏导很麻烦,如果x求 1 2 x 2 \frac{1}{2x^2} 2x21的偏导数,同样求得是最小值)
所以目标函数最终变为:
a r g : m i n w , b ( 1 2 ∗ ∣ ∣ w ∣ ∣ 2 ) arg: min_{w, b}\left( \frac{1}{2}*{||w||^2} \right) arg:minw,b(21∗∣∣w∣∣2)
(凸二次优化问题)
4.应用拉格朗日乘子法求解凸优化问题:
L ( w , b , a ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n a i [ l a b l e ∗ ( w T x i + b ) − 1 ] L\left( w,b,a\right) =\dfrac{1}{2}\left\| w\right\| ^{2}-\sum ^{n}_{i=1}a_{i}\left[ lable\ast \left( w^Tx_{i}+b\right) -1\right] L(w,b,a)=21∥w∥2−∑i=1nai[lable∗(wTxi+b)−1]
令L(w,b,a)对w和b的偏导数为0,有
w = ∑ i = 1 n l a b l e i ∗ a i x i w=\sum ^{n}_{i=1}lable_{i}*a_{i}x_{i} w=∑i=1nlablei∗aixi
∑ i = 1 n a i ∗ l a b l e i = 0 \sum ^{n}_{i=1}a_{i}*lable_{i}=0 ∑i=1nai∗lablei=0
再将上述两个结果带入L(w,b,a)中消去w和b,之后有其对偶化处理得到拉格朗日乘子a的值最终得到结果。
w = ∑ i = 1 n l a b l e i ∗ a i x i w=\sum ^{n}_{i=1}lable_{i}*a_{i}x_{i} w=∑i=1nlablei∗aixi
b = l a b l e i − w T x i b=lable_{i}-w^Tx_{i} b=lablei−wTxi
所以超平面:
w
x
+
b
=
0
wx+b=0
wx+b=0
分类决策函数:
f
(
x
)
=
s
i
g
n
(
w
x
+
b
)
f(x)=sign(wx+b)
f(x)=sign(wx+b)
对待有极端数据点的优化:
上述所述算法是基于硬间隔,硬间隔对异常数据点太过于敏感,接下来我们介绍一下软间隔。
软间隔SVM模型:允许对少量训练样本出现分类错误。这里我们引入了松弛变量
ξ
i
\xi _{i}
ξi和惩罚因子
C
C
C,约束条件转化为:
这里的
y
i
y_i
yi代表lable值。
线性SVM算法流程概览:
非线性SVM
概述
对于非线性的情况,支持向量机选择一个核函数k(…,…)将数据映射到高维空间,从而解决原始空间中线性不可分的问题。
算法流程
分类函数定义为: f ( x ) = ∑ i = 1 n w i ϕ i ( x ) + b f\left ( x\right) =\sum ^{n}_{i=1}w_{i}\phi _{i}\left( x\right) +b f(x)=∑i=1nwiϕi(x)+b
这里的 ϕ i \phi _{i} ϕi是核函数,将低维数据到高维空间的映射关系。
下面是将三维的x矩阵映射为六维的Z矩阵
接下来严格数学证明还没整理 ~ 考完试再来补充 ~ (一定~)
SVM优点
- 训练好的模型算法的复杂度是由支持向量的个数决定的,而不是由数据维度决定的。所以SVM不太容易产生过拟合。
- SVM训练出来的模型完全依赖于支持向量,即使训练集里面所有非支持向量点被去除,重复训练过程,结果仍然得到一样的模型。
- 如果支持向量个数比较少,SVM训练出的模型容易被泛化。
SVC算法中不同参数的影响:
- C:惩罚系数(对误差的宽容度):
C越大,越不容忍误差,容易过拟合。C越小,越容忍误差,容易欠拟合。设计算法时我们要选取合适的C,以便在平滑决策边界和分类正确性之间进行平衡。
2.gamma:指定核函数的系数
隐含地决定了数据映射到新的特征空间中的分布。gamma值越大,支持向量越少。