支持向量机模型(SVM)是一个二分类模型,基本思想是求解能够正确划分训练数据集并且几何间隔最大的分离超平面,其学习策略便是间隔最大化,最终化为一个凸二次规划问题的求解。
SVM可分为线性可分支持向量机、线性支持向量机和非线性支持向量机。
算法推导
1. 线性可分支持向量机
线性向量机的基本思想是硬间隔最大化,即:
maxw,b γs.t. yi⋅1||w||⋅(w⋅xi+b)≥γ,i=1,2,…,N
即:
maxw,b ŷ||w||s.t. yi⋅(w⋅xi+b)≥ŷ,i=1,2,…,N
取ŷ=1,得
minw,b 12||w||2s.t. yi⋅(w⋅xi+b)−1≥0,i=1,2,…,N
这是一个凸二次规划问题,通过引入拉格朗日乘子法,构建拉格朗日对偶函数,通过求其对偶函数的解,从而得到原始问题的最优解。
L(w,b,α)=12||w||2−N∑i=1αiyi(w⋅xi+b)+N∑i=1αi
其中,α=(α1,α2,…,αN)T为拉格朗日乘子向量,αi≥0,i=1,2,…,N
原始问题的对偶问题是极大极小问题:
maxαminw,bL(w,b,α)
-
求解对偶问题
- 求minw,bL(w,b,α)
分别对w,b求偏导数并令其为0:
∇wL(w,b,α)=w−N∑i=1αiyixi=0∇bL(w,b,α)=N∑i=1αiyi=0
得
w=N∑i=1αiyixiN∑i=1αiyi=0
代入拉格朗日函数,得
L(w,b,α)=12N∑i=1N∑j=1αiαjyiyj(xi⋅xj+b)−N∑i=1αiyi((N∑j=1αjyjxj)⋅xi+b)+N∑i=1αi
=−12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)+N∑i=1αi
即
minw,bL(w,b,α)=−12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)+N∑i=1αi
- 求minw,bL(w,b,α)对α的极大:
maxα −12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)+N∑i=1αi
s.t. N∑i=1αiyi=0
αi≥0,i=1,2,…,N
即:
minα 12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)−N∑i=1αi
s.t. N∑i=1αiyi=0
αi≥0,i=1,2,…,N
求得最优解1
αx=(α1x,α2x,…,αNx)T
计算
w∗=N∑i=1αixyixi
并选择αx的一个正分量αjx>0,计算
bx=yi−N∑i=1αixyi(xi⋅xj)
求得分类决策函数:
f(x)=sign(wx⋅x+bx)
可知wx,bx只依赖训练数据中对应于αix>0的样本点(xi,yi),而其他样本点对wx,bx没有影响。将训练样本中对应于αix>0的实例点称为支持向量。
2. 线性支持向量机
对于线性不可分训练集,引入松弛变量,采用软间隔最大化策略
minw,b 12||w||2+CN∑i=1ξis.t. yi⋅(w⋅xi+b)≥1−ξi,i=1,2,…,Nξi≥0,i=1,2,…,N
构建拉格朗日函数:
L(w,b,ξ,α,μ)=12||w||2+CN∑i=1ξi−N∑i=1αi(yi(w⋅xi+b)−1+ξi)−N∑i=1μiξi
求导后代入,得
minw,bL(w,b,ξ,α,μ)=−12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)+N∑i=1αi
得其对偶问题:
maxα −12N∑i=1N∑j=1αiαjyiyj(xi⋅xj)+N∑i=1αi
s.t. N∑i=1α_iyi=0
αi≥0,i=1,2,…,N
C−αi−μi=0
μi≥0,i=1,2,…,N
可以看做最小化以下目标函数:
N∑i=1[1−yi(w⋅xi+b)]++λ||w||2
目标函数第一项是经验风险,称为合页损失函数(hinge loss function)
3. 非线性支持向量机
核函数:我们可以使用核函数,将原始输入空间映射到新的样本空间,从而使原来线性不可分得变成高维的线性可分。
在线性支持向量机的对偶问题中,无论是目标函数还是决策函数都只涉及输入实例与实例之间的内积。在对偶问题的目标函数中内积可以用核函数来代替,此时对偶问题的目标函数成为:
W(α)=12N∑i=1N∑j=1αiαjyiyjK(xi⋅xj)+N∑i=1αi
同样,分类决策函数中的内积也可以用核函数代替,而分类决策函数成为:
f(x)=sign(∑i=1Nsαxiyi⋅ϕ(xi)⋅ϕ(x)+bx) =sign(Ns∑i=1αxiyiK(xi,x)+bx)
SMO
SMO是用于快速求解SVM的
它选择凸二次规划的两个变量,其他的变量保持不变,然后根据这两个变量构建一个二次规划问题,这个二次规划关于这两个变量解会更加的接近原始二次规划的解,通过这样的子问题划分可以大大增加整个算法的计算速度,关于这两个变量:
- 其中一个是严重违反KKT条件的一个变量
- 另一个变量是根据自由约束确定,求剩余变量的最大化来确定的。
相关问题
SVM如何解决多分类问题?
- 直接法
直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类(计算复杂度很高,实现起来较为困难)
- 间接法
1) 一对多
其中某个类为一类,其余n-1个类为另一个类,比如A,B,C,D四个类,第一次A为一个类,{B,C,D}为一个类训练一个分类器,第二次B为一个类,{A,C,D}为另一个类,按这方式共需要训练4个分类器,最后在测试的时候将测试样本经过这4个分类器f1(x),f2(x),f3(x)和f4(x),取其最大值为分类器(这种方式由于是1对M分类,会存在偏置,很不实用)
2) 一对一(libsvm实现的方式)
任意两个类都训练一个分类器,那么n个类就需要n_(n-1)/2个svm分类器。
还是以A,B,C,D为例,那么需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}为目标共6个分类器,然后在预测的将测试样本通过这6个分类器之后进行投票选择最终结果。(这种方法虽好,但是需要n(n−1)/2个分类器代价太大,不过 可以使用循环图来进行改进)
KKT条件及其物理意义
KKT条件可以总结成:约束条件(原始约束和引入拉格朗日乘子后的约束)、对x偏导为0、对偶互补条件
针对问题:
min f(x)s.t. h(x)=0g(x)≤0
对于这个问题先不看等式约束,画出不等式约束和目标函数关系图:

其中,阴影部分就是可行域,也就是说可行域从原来的一条线变成了一块区域。那么能取到极值点的地方可能有两种情况:
1、还是在 h(x)和等值线相切的地方
2、f(x)的极值点本身就在可行域里面。

因为如果不是相切,那么,对任意一个在可行域中的点,如果在它附近往里走或者往外走,f(x)一般都会变大或者变小,所以绝大部分点都不会是极值点。除非这个点刚好在交界处,且和等值线相切;或者这个点在可行域内部,但是本身就是f(x)的极值点。
对于第一种情况,不等式约束就变成等式约束了,定义拉格朗日函数:
L(x,λ,μ)=f(x)+λh(x)+μg(x)
使用拉格朗日乘子法:
∇xL(x,λ,μ)=0h(x)=0g(x)=0μ≥0
这里需要解释一下,为什么是μ≥0。在“不等式约束”图中,问题的可行域是在$ g(x)≤0一侧,而g(x)$ 的梯度是指向大于 0 的一侧,也就是不是可行域的一侧。而求的问题是极小值,所以 f(x) 在交点处的梯度是指向可行域的一侧,也就是说两个梯度一定是相反的。所以也就可以确定这里的系数一定是大于等于0的。而等式约束由于不知道h(x) 的梯度方向,所以对它没有约束。
对于第二种情况,不等式约束就相当于没有,定义拉格朗日函数
L(x,λ)=f(x)+λh(x)
使用拉格朗日乘子法:
∇xL(x,λ)=0h(x)=0g(x)≤0μ=0
不同的是第一种情况有g(x)=0且μ≥0,第二种情况g(x)≤0且μ=0,综合两个问题可得:
∇xL(x,λ,μ)=0μg(x)=0μ≥0h(x)=0g(x)≤0
这个就是 KKT 条件。它的含义是这个优化问题的极值点一定满足这组方程组。(不是极值点也可能会满足,但是不会存在某个极值点不满足的情况)它也是原来的优化问题取得极值的必要条件。
LR与SVM的区别和联系
相同点:
1、都是有监督的分类算法;
2、如果不考虑核函数,LR和SVM都是线性分类算法。它们的分类决策面都是线性的。
3、LR和SVM都是判别式模型。
不同点:
1、本质上是loss函数不同,或者说分类的原理不同。LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。SVM只考虑分界面附近的少数点,而LR则考虑所有点。
2、SVM是结构风险最小化,LR则是经验风险最小化。
结构风险最小化就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,减小泛化误差。为了达到结构风险最小化的目的,最常用的方法就是添加正则项。SVM的loss函数具有L2正则项;LR需要加入正则化项。
3、SVM不能产生概率,LR可以产生概率。
4、在解决非线性问题时,SVM可采用核函数的机制,而LR通常不采用核函数的方法。
5、SVM计算复杂,但效果比LR好,适合小数据集;LR计算简单,适合大数据集,可以在线训练。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)