【自学笔记】支持向量机(1)

一些概念

支持向量机 (Support Vector Machine,简称SVM)是一种广受欢迎的监督学习算法,主要用于分类和回归分析。在分类问题中,SVM的主要目标是在训练数据中找到一个超平面。这个超平面不仅能够准确地区分不同类别的样本,而且还能最大化不同类别样本到该超平面的最小距离,这个距离被称为"间隔"(margin)。

超平面 是一个重要的数学概念。在n维空间中,超平面是一个维度为n-1的子空间,它将空间划分成两个半空间。

超平面可以被看作是平面概念的推广,就像在二维空间中,直线是一维的超平面;在三维空间中,平面是二维的超平面。

在数学上,n维空间中的超平面可以通过一个线性方程来定义,即:

w 1 x 1 + w 2 x 2 + . . . + w n x n + b = 0 w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}+b=0 w1x1+w2x2+...+wnxn+b=0

用向量写作 w ⃗ T x ⃗ + b = 0 \vec{w}^{T}\vec{x}+b=0 w Tx +b=0

超平面的法向量是指与超平面垂直的向量,能够指示超平面的方向。

点到超平面或超平面到超平面的间隔即它们间的距离。公式为:

x 0 ⃗ = ( x 01 , x 02 , . . . x 0 n ) \vec{x_{0}}=(x_{01}, x_{02}, ... x_{0n}) x0 =(x01,x02,...x0n) (点)

∣ ∣ w ⃗ ∣ ∣ = ∑ i = 1 n w i 2 ||\vec{w}||=\sqrt{\sum_{i=1}^{n}w_{i}^{2} } ∣∣w ∣∣=∑i=1nwi2 (模)

d = ∣ w ⃗ T x 0 ⃗ + b ∣ ∣ ∣ w ⃗ ∣ ∣ d=\frac{|\vec{w}^{T}\vec{x_{0}}+b|}{||\vec{w}||} d=∣∣w ∣∣∣w Tx0 +b∣ (间隔)

正超平面是离决策边界最近的一个超平面,位于决策边界的正类别一侧。数学定义为:

w ⃗ T x ⃗ + b = 1 \vec{w}^{T}\vec{x}+b=1 w Tx +b=1

负超平面是离决策边界最近的一个超平面,位于决策边界的负类别一侧。数学定义为:

w ⃗ T x ⃗ + b = − 1 \vec{w}^{T}\vec{x}+b=-1 w Tx +b=−1

支持向量机SVM

对于一个训练集,有时能找到很多有效的决策边界来实现分类任务,但不同的决策边界在新的测试集中的表现各不相同。而SVM采用最大化间隔的标准来挑选出一种较优的决策边界,可以有效减少过拟合。

对于一个决策边界,我们可以将它视作这个数据集维度下的超平面 ( w ⃗ T , b ) = w ⃗ T x ⃗ + b = 0 (\vec{w}^{T}, b)=\vec{w}^{T}\vec{x}+b=0 (w T,b)=w Tx +b=0。假设该超平面已经能正确将训练样本分类,即满足两类样本 − 1 , + 1 {-1, +1} −1,+1已经分到了正负超平面的两侧:

若 y i = + 1 y_{i}=+1 yi=+1,那么 w ⃗ T x ⃗ + b ≥ + 1 \vec{w}^{T}\vec{x}+b \ge +1 w Tx +b≥+1

若 y i = − 1 y_{i}=-1 yi=−1,那么 w ⃗ T x ⃗ + b ≤ − 1 \vec{w}^{T}\vec{x}+b \le -1 w Tx +b≤−1

如右图,距离超平面最近的几个训练样本点使等号成立,它们被称为"支持向量 "(support vector)。显然,正负超平面的间隔等于两个异类支持向量到超平面 ( w ⃗ T , b ) (\vec{w}^{T}, b) (w T,b)的间隔之和,记作 γ \gamma γ,有:

γ = 2 ∣ ∣ w ⃗ ∣ ∣ \gamma = \frac{2}{||\vec{w}||} γ=∣∣w ∣∣2

显然,正负超平面离地越远,不同类别的数据的差异就体现地越明显,于是,我们希望找到具有"最大间隔"的划分超平面,即找到这样的参数 w ⃗ \vec{w} w 和 b b b,使得:

min ⁡ w ⃗ , b ∣ ∣ w ⃗ ∣ ∣ \min_{\vec{w}, b}||\vec{w}|| minw ,b∣∣w ∣∣

s.t. y i ( w ⃗ T x i ⃗ + b ) ≥ 1 , i = 1 , 2 , . . . , m y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1, i=1,2,...,m yi(w Txi +b)≥1,i=1,2,...,m

PS: s.t. 意思是 subject to, 即受限于..., 满足...

PS: m 表示数据组数

这就是SVM要解决的问题。

凸二次规划求解

一些定义

  简单理解:海森矩阵 是将函数在某一点 处的所有二阶偏导数 组织成一个矩阵的形式,这个矩阵可以提供函数在该点局部行为的详细信息。海森矩阵也记作 H = ▽ 2 f ( x ) H=\bigtriangledown ^{2}f(x) H=▽2f(x)

我们有这样的定理:若函数在任一点的海森矩阵是半正定的,那么这个函数是凸函数。


凸二次规划问题


转化原问题为凸二次规划问题

这里我们用拉格朗日乘子法

(1) 构建拉格朗日函数 :令 α ⃗ = ( α 1 , α 2 , . . . α m ) \vec{\alpha} = (\alpha_{1},\alpha_{2},...\alpha_{m}) α =(α1,α2,...αm)是与不等式约束向对应的拉格朗日乘子向量。则拉格朗日函数 L ( w ⃗ , b , α ⃗ ) L(\vec{w}, b, \vec{\alpha}) L(w ,b,α )定义为:

L ( w ⃗ , b , α ⃗ ) = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − ∑ i = 1 m α i [ y i ( w ⃗ T x ⃗ i + b ) − 1 ] L(\vec{w},b,\vec{\alpha})=\frac{1}{2}||\vec{w}||^{2}-\sum_{i=1}^{m}\alpha {i}[y{i}(\vec{w}^{T}\vec{x}^{i}+b)-1] L(w ,b,α )=21∣∣w ∣∣2−∑i=1mαi[yi(w Tx i+b)−1]

(2)定义KKT条件 。举个例子,一个二次函数的最小值满足 △ = 0 \bigtriangleup =0 △=0。对于这个复杂的命题,也可以有类似的想法。当函数的某个点满足KKT条件,则这个点就是全局最优解(凸函数的局部最优解即全局最优点)。KKT条件包括:

(i)驻点条件(Stationarity):表示在最优解处,对于变量 w ⃗ \vec{w} w 和 b b b拉格朗日函数的梯度必须为零,即:

▽ w ⃗ L ( w ⃗ , b , α ⃗ ) = w ⃗ − ∑ i = 1 m α i y i x ⃗ i = 0 \bigtriangledown {\vec{w}}L(\vec{w},b,\vec{\alpha})=\vec{w}-\sum{i=1}^{m}\alpha_{i}y_{i}\vec{x}{i}=0 ▽w L(w ,b,α )=w −∑i=1mαiyix i=0
▽ b L ( w ⃗ , b , α ⃗ ) = − ∑ i = 1 m α i y i = 0 \bigtriangledown {b}L(\vec{w},b,\vec{\alpha})=-\sum{i=1}^{m}\alpha
{i}y_{i}=0 ▽bL(w ,b,α )=−∑i=1mαiyi=0

(ii)原问题可行性(Primal Feasibility):约束条件必须满足。即:

y i ( w ⃗ T x i ⃗ + b ) ≥ 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1 yi(w Txi +b)≥1   ( i = 1 , 2 , . . . , m ) (i=1,2,...,m) (i=1,2,...,m)

(iii)对偶可行性(Dual Feasibility):拉格朗日乘子必须非负。即:

α i ≥ 0 \alpha_{i} \ge 0 αi≥0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

(iv)互补松弛性(Complementary Slackness):先定义一个约束条件是活动的 (active),当在某个点处该约束刚好达到其允许的最大或最小值(即取等)。而在拉格朗日乘子法中,这些活动的约束条件对应的拉格朗日乘子通常为非零,体现这个约束的重要性;对应的,非活动的(inactive)约束条件对应的拉格朗日乘子通常为零,表明它们在当前解中是冗余的或非限制性的。

所以,互补松弛性表述为:

α i [ y i ( w ⃗ T x ⃗ i + b ) − 1 ] = 0 \alpha {i}[y{i}(\vec{w}^{T}\vec{x}^{i}+b)-1]=0 αi[yi(w Tx i+b)−1]=0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

α i \alpha {i} αi 和 y i ( w ⃗ T x ⃗ i + b ) − 1 y{i}(\vec{w}^{T}\vec{x}^{i}+b)-1 yi(w Tx i+b)−1至少有一个为0

以上四个条件描述了最优解应该满足的性质,其中从驻点条件中,我们可以解出 w ⃗ \vec{w} w 和 b b b关于 α ⃗ \vec{\alpha} α 的关系式:

w ⃗ = ∑ i = 1 m α i y i x ⃗ i \vec{w}=\sum_{i=1}^{m}\alpha {i}y{i}\vec{x}_{i} w =∑i=1mαiyix i

代入 L L L后得到新的函数 g ( α ⃗ ) g(\vec{\alpha}) g(α ):

g ( α ⃗ ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x ⃗ i T x j ⃗ g(\vec{\alpha})=\sum_{i=1}^{m}\alpha {i}-\frac{1}{2} \sum{i=1}^{m}\sum_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}\vec{x}{i}^{T}\vec{x{j}} g(α )=∑i=1mαi−21∑i=1m∑j=1mαiαjyiyjx iTxj

当最小化 ∣ ∣ w ∣ ∣ 2 ||w||^{2} ∣∣w∣∣2和最大化 g ( α ⃗ ) g(\vec{\alpha}) g(α )这两个命题同时满足了KKT条件,它们解的数值相等。称前者为原命题 ,后者为对偶命题。于是目标变成求解以下问题:

max ⁡ α ⃗ g ( α ⃗ ) \max _{\vec{\alpha}}g(\vec{\alpha}) maxα g(α )

s . t . s.t. s.t.   α i ≥ 0 \alpha_{i} \ge 0 αi≥0,   ( i = 1 , . . . , m ) (i=1,...,m) (i=1,...,m)

∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}\alpha_{i}y_{i}=0 ∑i=1mαiyi=0

对比式子可以发现这正是一个二次规划问题。解出 α \alpha α后即可由 w ⃗ = ∑ i = 1 m α i y i x ⃗ i \vec{w}=\sum_{i=1}^{m}\alpha {i}y{i}\vec{x}_{i} w =∑i=1mαiyix i求出最初想要的 w ⃗ \vec{w} w

注意,条件 y i ( w ⃗ T x i ⃗ + b ) ≥ 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b) \ge 1 yi(w Txi +b)≥1   ( i = 1 , 2 , . . . , m ) (i=1,2,...,m) (i=1,2,...,m)会在后续求解中自动满足。

解决

我们可以用通用的方法解决二次规划问题,但是该问题的规模正比于训练样本数,会造成很大的开销。所以,针对这个特定的问题的特性,人们提出了一些高效的算法。在《机器学习》中提到的是SMO算法。

步骤

(1)初始化。

⋅ \cdot ⋅ 选择一个初始的 α \alpha α值,通常可以随机选取或置为0。

(2)选择两个变量。

⋅ \cdot ⋅ 选择第一个变量 α 1 \alpha _{1} α1。通常,从违反KKT条件最严重的 α \alpha α开始,也可以随机选择。

⋅ \cdot ⋅ 选择第二个优化变量 α 2 \alpha _{2} α2。这个选择不是随机的,而是基于启发式规则,以加速收敛。常见的策略是选择能够使目标函数最大下降的 α 2 \alpha _{2} α2,也可以说选取的两个变量对应的样本之间的间隔最大。

SMO算法每次选择两个变量,固定其他变量,这样有利于减少运算的时间和空间(主要体现为避免了大矩阵之间的运算)。

(3)计算边界

⋅ \cdot ⋅ 确定 α 1 \alpha_{1} α1和 α 2 \alpha_{2} α2的上下界 L L L和 H H H。记 α 1 \alpha_{1} α1和 α 2 \alpha_{2} α2对应的样本点为 ( x ⃗ 1 , y 1 ) (\vec{x}{1}, y{1}) (x 1,y1)和 ( x ⃗ 2 , y 2 ) (\vec{x}{2}, y{2}) (x 2,y2)。

⋅ \cdot ⋅ 当 y 1 ≠ y 2 y_{1}\neq y_{2} y1=y2, α 1 \alpha_{1} α1和 α 2 \alpha_{2} α2将朝着相反的方向移动,此时上下界 L L L和 H H H应该这样计算:

L = max ⁡ ( 0 , α 2 − α 1 ) L=\max (0, \alpha_{2}-\alpha_{1}) L=max(0,α2−α1)

H = min ⁡ ( C , C + α 2 − α 1 ) H=\min (C, C+\alpha_{2}-\alpha_{1}) H=min(C,C+α2−α1)

C C C是SVM中的惩罚参数,控制了错误分类的惩罚强度。在SVM的优化问题中, α i \alpha_{i} αi的值必须在 0 0 0和 C C C之间,这反映了KKT条件中的不等式约束。

这样定义的原因是确保 α 2 \alpha_{2} α2的更新值不会小到负数,同时也不会超过 C C C

⋅ \cdot ⋅ 当 y 1 = y 2 y_{1} = y_{2} y1=y2, α 1 \alpha_{1} α1和 α 2 \alpha_{2} α2将朝着相反的方向移动,此时上下界 L L L和 H H H应该这样计算:

L = max ⁡ ( 0 , α 1 + α 2 − C ) L=\max (0, \alpha_{1}+\alpha_{2}-C) L=max(0,α1+α2−C)

H = min ⁡ ( C , α 1 + α 2 ) H=\min (C, \alpha_{1}+\alpha_{2}) H=min(C,α1+α2)

这里,下界确保了 α 2 \alpha_{2} α2的值不会低于0(考虑到 α 1 \alpha_{1} α1和 α 2 \alpha_{2} α2的增加或减少是同步的),而上界则限制了 α 2 \alpha_{2} α2的值不会超过 C C C。

(4)更新 α 2 \alpha_{2} α2。 在合法区间内找到最优的更新值,若不使用核函数,会用以下式子:

它们的实际类别标签与当前模型预测的结果之间的差距
E 1 = g ( x ⃗ 1 ) − y 1 E_{1}=g(\vec{x}{1})-y{1} E1=g(x 1)−y1
E 2 = g ( x ⃗ 2 ) − y 2 E_{2}=g(\vec{x}{2})-y{2} E2=g(x 2)−y2

α 2 ′ = α 2 + y 2 ( E 1 − E 2 ) k 11 + k 22 − 2 k 12 \alpha^{'}{2}=\alpha{2}+\frac{y_{2}(E_{1}-E_{2})}{k_{11}+k_{22}-2k_{12}} α2′=α2+k11+k22−2k12y2(E1−E2)

其中 k i j = x ⃗ i ⋅ x ⃗ j k_{ij}=\vec{x}{i} \cdot \vec{x}{j} kij=x i⋅x j

然后调整,如果新的 α 2 \alpha_{2} α2超出了 L L L或 H H H,则裁剪成 L L L或 H H H。

(5)更新 α 1 \alpha_{1} α1。保持 ∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}\alpha_{i}y_{i}=0 ∑i=1mαiyi=0即可。

(6)更新 b b b。懒得敲公式了

  以上是GPT给出的方法,不知道对不对,感觉说的很有道理。《机器学习》中则利用支持向量的性质给出更新式:

注意到对于所有支持向量 ( x ⃗ s , y s ) (\vec{x}{s}, y{s}) (x s,ys),满足:

y i ( w ⃗ T x i ⃗ + b ) = 1 y_{i}(\vec{w}^{T}\vec{x_{i}}+b)=1 yi(w Txi +b)=1,  即:
y i ( ∑ i = 1 m α i y i x ⃗ i T x s ⃗ + b ) = 1 y_{i}(\sum_{i=1}^{m}\alpha {i}y{i}\vec{x}{i}^{T}\vec{x{s}}+b)=1 yi(∑i=1mαiyix iTxs +b)=1

为了模型更好的性能,采用所有的支持向量并取均值,得:
b = 1 ∣ S ∣ ∑ s ∈ S ( 1 y s − ∑ i = 1 m α i y i x ⃗ i T x s ⃗ ) b=\frac{1}{|S|}\sum_{s \in S}^{}(\frac{1}{y_{s}}-\sum_{i=1}^{m}\alpha {i}y{i}\vec{x}{i}^{T}\vec{x{s}}) b=∣S∣1∑s∈S(ys1−∑i=1mαiyix iTxs )

(7)迭代,如果所有 α \alpha α的更新都小于给定的阈值,或者达到最大迭代次数,算法终止。否则,返回步骤2。

后话

这是支持向量机的基础部分,后续还有核函数、正则化、软间隔、回归等变化。这一块内容真是目前学到的最难的了,到处查资料,以后可能会先出一些简单的内容再来攻克SVM的后续。

相关推荐
翱翔-蓝天5 分钟前
AI 在医疗行业的应用
人工智能
chenziang16 分钟前
leetcode hot100 删除链表的第n个节点
算法·leetcode·链表
索然无味io10 分钟前
跨站请求伪造之基本介绍
前端·笔记·学习·web安全·网络安全·php
864记忆11 分钟前
关于opencv、Qt、msvc编译器之间的关系
人工智能·qt·opencv
kikikidult14 分钟前
Ubuntu20.04安装openMVS<成功>.colmap<成功>和openMVG<失败(已成功)>
笔记·学习
pk_xz12345619 分钟前
OpenCV实现实时人脸检测和识别
人工智能·opencv·计算机视觉
終不似少年遊*22 分钟前
美国加州房价数据分析02
人工智能·python·机器学习·数据挖掘·数据分析·回归算法
thesky12345623 分钟前
活着就好20241225
学习·算法
胡西风_foxww24 分钟前
【es6复习笔记】集合Set(13)
前端·笔记·es6·set·集合
Xenia22331 分钟前
复习篇~第二章程序设计基础
c++·算法