当前位置: 首页 > news >正文

机器学习:详细推导支持向量机SVM原理+Python实现

目录

  • 0 写在前面
  • 1 什么是支持向量机?
  • 2 支持向量机的优化目标
  • 3 KKT条件计算支持向量
  • 4 软间隔策略
  • 5 Python实现支持向量机
    • 5.1 构造数据集
    • 5.2 构造软硬间隔SVM
    • 5.3 可视化

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。

🚀详情:机器学习强基计划(附几十种经典模型源码合集)

1 什么是支持向量机?

支持向量机(Support Vector Machine, SVM)是基于训练集在样本空间或其映射空间中寻找一个最鲁棒的划分超平面将不同类别样本划分开的分类方法。

在这里插入图片描述

定义两个异类样本集到划分超平面最小距离之和为间隔(margin),如图所示。直观地,间隔越大则划分对训练样本局部扰动的容忍性越好,泛化能力与鲁棒性越强。间隔并非由所有训练样本决定,而是由距离分类决策超平面最近的少量样本决定,这些样本称为支持向量(Support Vector)

设划分超平面方程为 π : w T x + b = 0 \pi : \boldsymbol{w}^T\boldsymbol{x}+b=0 π:wTx+b=0,根据机器学习强基计划3-1:图文详解超平面、函数间隔、几何间隔可以计算间隔

d = 2 min ⁡ i ∣ w T x i + b ∣ ∥ w ∥ = 2 min ⁡ i y i ( w T x i + b ) ∥ w ∥ d=2\underset{i}{\min}\frac{\left| \boldsymbol{w}^T\boldsymbol{x}_i+b \right|}{\left\| \boldsymbol{w} \right\|}=2\underset{i}{\min}\frac{y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right)}{\left\| \boldsymbol{w} \right\|} d=2iminw wTxi+b =2iminwyi(wTxi+b)

即样本到超平面最小几何间隔的两倍——也就是正负支持向量之间的几何间隔,优化目标是最大化间隔 max ⁡ w , b    d \max _{\boldsymbol{w},b}\,\,d maxw,bd

2 支持向量机的优化目标

原始优化目标的形式较为复杂,注意到给定一个超平面,样本的几何间隔随之确定,但函数间隔却具有冗余的尺度自由度,函数间隔的取值并不影响优化问题的解,不妨通过增加约束来降低问题复杂度——令函数间隔 min ⁡ i ∣ w T x i + b ∣ = 1 \min _i\left| \boldsymbol{w}^T\boldsymbol{x}_i+b \right|=1 mini wTxi+b =1,优化目标变为

{ max ⁡ w , b 2 ∥ w ∥ ⇔ min ⁡ w , b 1 2 ∥ w ∥ 2 s . t . y i ( w T x i + b ) ⩾ 1 ( i = 1 , 2 , ⋯   , m ) \begin{cases} \underset{\boldsymbol{w},b}{\max}\frac{2}{\left\| \boldsymbol{w} \right\|}\Leftrightarrow \underset{\boldsymbol{w},b}{\min}\frac{1}{2}\left\| \boldsymbol{w} \right\| ^2\\ \mathrm{s}.\mathrm{t}. y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \geqslant 1\left( i=1,2,\cdots ,m \right)\\\end{cases} w,bmaxw2w,bmin21w2s.t.yi(wTxi+b)1(i=1,2,,m)

所以一句话总结SVM的核心:以函数间隔为约束,最大化几何间隔

用拉格朗日乘数法化约束优化问题为无约束优化,设拉格朗日函数为

L ( w , b , α ) = 1 2 ∥ w ∥ 2 + ∑ i = 1 m α i ( 1 − y i ( w T x i + b ) ) L\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) =\frac{1}{2}\left\| \boldsymbol{w} \right\| ^2+\sum_{i=1}^m{\alpha _i\left( 1-y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \right)} L(w,b,α)=21w2+i=1mαi(1yi(wTxi+b))

则优化目标变为

{ a r g min ⁡ w , b    L ( w , b , α ) ∇ w L ( w , b , α ) = w − ∑ i = 1 m α i y i x i = 0 ∇ b L ( w , b , α ) = − ∑ i = 1 m α i y i = 0 α i ⩾ 0 1 − y i ( w T x i + b ) ⩽ 0 α i ( 1 − y i ( w T x i + b ) ) = 0 } ( i = 1 , 2 , ⋯   , m ) , K K T 约束 \begin{cases} \underset{\boldsymbol{w},b}{\mathrm{arg}\min}\,\,L\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right)\\ \left. \begin{array}{r} \nabla _{\boldsymbol{w}}L\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) =\boldsymbol{w}-\sum_{i=1}^m{\alpha _iy_i\boldsymbol{x}_i}=0\\ \nabla _bL\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) =-\sum_{i=1}^m{\alpha _iy_i}=0\\ \alpha _i\geqslant 0\\ 1-y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \leqslant 0\\ \alpha _i\left( 1-y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \right) =0\\\end{array} \right\} \left( i=1,2,\cdots ,m \right) , KKT\text{约束}\\\end{cases} w,bargminL(w,b,α)wL(w,b,α)=wi=1mαiyixi=0bL(w,b,α)=i=1mαiyi=0αi01yi(wTxi+b)0αi(1yi(wTxi+b))=0 (i=1,2,,m),KKT约束

∇ w L ( w , b , α ) \nabla _{\boldsymbol{w}}L\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) wL(w,b,α) ∇ b L ( w , b , α ) \nabla _bL\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) bL(w,b,α)约束代入 L ( w , b , α ) L\left( \boldsymbol{w},b,\boldsymbol{\alpha } \right) L(w,b,α)消去 w , b \boldsymbol{w},b w,b得到原问题的对偶形式

{ a r g max ⁡ α    Γ ( α ) α i ⩾ 0 1 − y i ( w T x i + b ) ⩽ 0 α i ( 1 − y i ( w T x i + b ) ) = 0 } ( i = 1 , 2 , ⋯   , m ) , K K T 约束 \begin{cases} \underset{\boldsymbol{\alpha }}{\mathrm{arg}\max}\,\,\varGamma \left( \boldsymbol{\alpha } \right)\\ \left. \begin{array}{r} \alpha _i\geqslant 0\\ 1-y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \leqslant 0\\ \alpha _i\left( 1-y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \right) =0\\\end{array} \right\} \left( i=1,2,\cdots ,m \right) , KKT\text{约束}\\\end{cases} αargmaxΓ(α)αi01yi(wTxi+b)0αi(1yi(wTxi+b))=0 (i=1,2,,m),KKT约束

其中

Γ ( α ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j \varGamma \left( \boldsymbol{\alpha } \right) =\sum_{i=1}^m{\alpha _i}-\frac{1}{2}\sum_{i=1}^m{\sum_{j=1}^m{\alpha _i\alpha _jy_iy_j\boldsymbol{x}_{i}^{T}\boldsymbol{x}_j}} Γ(α)=i=1mαi21i=1mj=1mαiαjyiyjxiTxj

这些公式让人看得头皮发麻,但却是理解SVM底层逻辑不可缺少的。简单解释一下上面在做什么:

  • 对偶问题,在凸优化理论中,对偶问题是一种常见的技巧,它可以使原本复杂的问题变简单。在SVM中,原问题需要同时优化 w , b \boldsymbol{w},b w,b两个变量,但对偶问题只需要优化 α \boldsymbol{\alpha} α一个变量,问题复杂度显著下降
  • 将不等式约束优化问题化为无约束优化问题时会产生KKT(Karush-Kuhn-Tucker)条件,对偶问题计算的最优解一般不如原问题最优解,只有在满足KKT条件时才能保证二者相同

综上所述,上面的复杂推导实际上是为了更好地解决问题。

3 KKT条件计算支持向量

根据KKT条件

  • α i = 0 \alpha _i=0 αi=0则该样本无约束作用,处于正确的分类域内
  • α i > 0 \alpha _i>0 αi>0则样本满足 1 = y i ( w T x i + b ) 1=y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) 1=yi(wTxi+b),处于优化边界构成支持向量集 S \mathcal{S} S。因此SVM在训练完成后,大部分在间隔外不受约束的训练样本都无需保留,最终模型只与支持向量有关。解得后即得

{ w = ∑ i = 1 m α i y i x i b = 1 ∣ S ∣ ∑ x i , y i ∈ S ( 1 y i − w T x i ) \begin{cases} \boldsymbol{w}=\sum_{i=1}^m{\alpha _iy_i\boldsymbol{x}_i}\\ b=\frac{1}{\left| \mathcal{S} \right|}\sum_{\boldsymbol{x}_i,y_i\in \mathcal{S}}{\left( \frac{1}{y_i}-\boldsymbol{w}^T\boldsymbol{x}_i \right)}\\\end{cases} {w=i=1mαiyixib=S1xi,yiS(yi1wTxi)

4 软间隔策略

前述严格满足 y i ( w T x i + b ) ⩾ 1 ( i = 1 , 2 , ⋯   , m ) y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \geqslant 1\left( i=1,2,\cdots ,m \right) yi(wTxi+b)1(i=1,2,,m)的策略称为硬间隔(hard margin),在硬间隔下模型可能会因为噪点的存在产生过拟合(甚至因为异常值无法计算满足硬间隔的超平面),如图(b)所示

因此允许SVM在部分样本上分类出错但约束误分类的样本尽量少以提高鲁棒性的策略称为软间隔(soft margin),如图(c)所示

在这里插入图片描述

与硬间隔相比,软间隔SVM多引入了松弛变量 ξ i ⩾ 0 \xi _i\geqslant 0 ξi0表征样本不满足硬间隔约束的程度

{ min ⁡ w , b , ξ i 1 2 ∥ w ∥ 2 + C ∑ i = 1 m ξ i s . t . { y i ( w T x i + b ) ⩾ 1 − ξ i ξ i ⩾ 0 ( i = 1 , 2 , ⋯   , m ) \begin{cases} \underset{\boldsymbol{w},b,\xi _i}{\min}\frac{1}{2}\left\| \boldsymbol{w} \right\| ^2+C\sum_{i=1}^m{\xi _i}\\ \mathrm{s}.\mathrm{t}.\begin{cases} y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \geqslant 1-\xi _i\\ \xi _i\geqslant 0\\\end{cases}\left( i=1,2,\cdots ,m \right)\\\end{cases} w,b,ξimin21w2+Ci=1mξis.t.{yi(wTxi+b)1ξiξi0(i=1,2,,m)

其中 C C C称为惩罚因子 C C C越大软间隔代价越大,误分类样本越少,模型越趋近硬间隔SVM

松弛变量的几何意义如图所示。正确的分类且处于优化边界外的样本 ξ i = 0 \xi _i=0 ξi=0,正确分类但处于优化边界内的样本 0 < ξ i < 1 0<\xi _i<1 0<ξi<1,错误分类的样本 ξ i ⩾ 1 \xi _i\geqslant 1 ξi1

在这里插入图片描述

5 Python实现支持向量机

SVM背后实现的SMO算法非常复杂,另开一篇文章详细推导序列最小优化SMO算法+Python实现叙述。本文采用sklearn库模型来体验一下支持向量机。

5.1 构造数据集

使用sklearn.datasetsmake_blobs构造二分类数据集,并打印正负样本散点

# 原始数据
X, y = make_blobs(n_samples=80, centers=2, cluster_std=1.2, random_state=6)

# 添加噪声
noise_x = np.array([[5, -5]])
X = np.vstack([X, noise_x])
noise_y = np.array([1])
y = np.hstack([y, noise_y])

data = []
for i in range(len(X)):
    index = np.where(y == i)[0]
    data.append(X[index, :])
plt.scatter(data[0][:, 0], data[0][:, 1], marker='o', s=40, cmap=plt.cm.Paired)
plt.scatter(data[1][:, 0], data[1][:, 1], marker='s', s=40, cmap=plt.cm.Paired)

5.2 构造软硬间隔SVM

硬间隔支持向量机

clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)
Z4 = clf.decision_function(xy).reshape(XX.shape)
plt.contour(XX, YY, Z4, colors='black', levels=[-1, 0, 1], alpha=0.8, linestyles=['--', '-', '--'])
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=140,
            linewidth=1, facecolors='none', edgecolors='k')

软间隔支持向量机

clf = svm.SVC(kernel='linear', C=1)
clf.fit(X, y)
Z4 = clf.decision_function(xy).reshape(XX.shape)
plt.contour(XX, YY, Z4, colors='black', levels=[-1, 0, 1], alpha=0.8, linestyles=['--', '-', '--'])
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=140,
            linewidth=1, facecolors='none', edgecolors='k')

可以看到区别仅仅在于惩罚因子的大小

5.3 可视化

上面代码运行后得到如下的结果

在这里插入图片描述


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关文章:

  • mysql socket文件丢失处理或者mysql.sock被删除
  • 欧拉计划详解第506题:钟摆序列
  • 《Python3 网络爬虫开发实战》:二、HTML消息结构
  • 调试接口小技巧-通过接口调试工具去下载上传文件
  • 【C指针详解】进阶篇
  • 惊奇发现业务移动端在往小程序化发展
  • 啸叫检测的方法:基于DSP的实现
  • java中比较两个map是否相同
  • C/C++编程工具及实用小软件推荐
  • [项目管理-15]:项目执行中的三大管理者:项目活动管理、职能部门管理、产品架构设计。
  • Code For Better 谷歌开发者之声——基于改进 EfficientDet 的电网线路的识别与检测的设计实现
  • 【for lovelier】IDEA + LeetCode Editor 最佳实践
  • React Native 0.70 版本发布,Hermes 成为默认引擎
  • 【Java基础】时间日期类之Date类、SimplDateFormat类、Calendar类及二月天案例
  • 2023计算机毕业设计SSM最新选题之javaEE的仓库管理系统93c6b
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Android Studio:GIT提交项目到远程仓库
  • canvas 绘制双线技巧
  • Create React App 使用
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • GraphQL学习过程应该是这样的
  • iOS | NSProxy
  • KMP算法及优化
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React系列之 Redux 架构模式
  • 阿里研究院入选中国企业智库系统影响力榜
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我与Jetbrains的这些年
  • 学习使用ExpressJS 4.0中的新Router
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 自定义函数
  • nb
  • 《天龙八部3D》Unity技术方案揭秘
  • 选择阿里云数据库HBase版十大理由
  • ​iOS安全加固方法及实现
  • ​水经微图Web1.5.0版即将上线
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #define
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (十一)图像的罗伯特梯度锐化
  • (一) storm的集群安装与配置
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .net 简单实现MD5
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET是什么
  • .NET下ASPX编程的几个小问题
  • .php文件都打不开,打不开php文件怎么办