首页 > 其他分享 >支持向量机模型 0基础小白也能懂(附代码)

支持向量机模型 0基础小白也能懂(附代码)

时间:2024-09-09 21:24:56浏览次数:8  
标签:SVM 函数 代码 小白 超平面 线性 alpha 向量

支持向量机模型 0基础小白也能懂(附代码)

原文链接

啥是向量机模型

本篇我们要讲解的模型是大名鼎鼎的支持向量机 SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但 SVM 在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。

支持向量机学习方法,针对不同的情况,有由简至繁的不同模型:

线性可分支持向量机(linear support vector machine in linearly separable case):训练数据线性可分的情况下,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机(亦称作硬间隔支持向量机)。

线性支持向量机(linear support vector machine):训练数据近似线性可分的情况下,通过软间隔最大化(soft margin maximization),学习一个线性的分类器,称作线性支持向量机(又叫软间隔支持向量机)。

非线性支持向量机(non-linear support vector machine):训练数据线性不可分的情况下,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性分类器,称作非线性支持向量机。

支持向量机可以借助核技巧完成复杂场景下的非线性分类,当输入空间为欧式空间或离散集合、特征空间为希尔贝特空间时,核函数(kernel function)表示将输入从输入空间映射到特征空间得到的特征向量之间的内积,先可以简单的把希尔贝特空间视作一个高维空间,核函数就是一种将低维数据映射到高维空间的方式,以便在高维空间中处理复杂的非线性问题。

通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。这样的方法称为核技巧。

最大间隔分类器

1)分类问题与线性模型

分类问题是监督学习的一个核心问题。在监督学习中,当输出变量取有限个离散值时,预测问题便成为分类问题。

实际生活中,有很多问题的本质都是分类,如识别某种模式:文本分类、分词、词性标注、图像内容识别和目标检测等。

2)最大间隔分类器

不同的模型在解决分类问题时,会有不同的处理方式,直观上看,我们会使用不同的决策边界对样本进行划分。

如图中「冰墩墩」与「雪容融」两类样本点,我们对其进行分类,可以完成该分类任务的决策边界有无数个。而我们这里介绍到的 SVM 模型,要求更高一些,它不仅仅希望把两类样本点区分开,还希望找到鲁棒性最高、稳定性最好的决策边界(对应图中的黑色直线)。

这个决策边界与两侧「最近」的数据点有着「最大」的距离,这意味着决策边界具有最强的容错性,不容易受到噪声数据的干扰。直观的理解就是,如果决策边界抖动,最不容易「撞上」样本点或者进而导致误判。

支持向量机详解

1)线性可分 SVM 与硬间隔最大化

我们要找到把下图中红蓝两色的图标点分开的最优分界线。令红色的图标点\(=+1\),蓝色的图标的点\(=-1\),直线\(f(x)=w*x+b\),这里\(w,x\)是向量,其实公式等价于\(f(x)=w_1x_1+w_2x_2+...+w_nx_n+b\)

  • 当向量\(x\)为二维向量时,\(f(x)\)表示二维空间中的一条直线。

  • 当向量\(x\)为三维向量时,\(f(x)\)表示三维空间中的一个平面。

  • 当向量\(x\)的\(n\)维向量(\(f(n)>3\))时,\(f(x)\)表示\(n\)维空间中的\(n-1\)维超平面。

当有一个新的点\(x\)需要预测属于哪个分类的时候,我们用\(sgn(f(x))\)就可以预测了。sgn表示符号函数:

  • 当\(f(x)>0\)的时候,\(sgn(f(x))=+1\)。

  • 当\(f(x)<0\)的时候,\(sgn(f(x))=-1\)。

回到重点,我们怎样才能取得一个最优的划分直线\(f(x)\)呢?下图的直线表示几条可能的线:

我们希望这条直线满足「最大间隔」原则,也就是如下图的形态。图中位于红色和蓝色线上的图标就是所谓的支持向量(support vector),也就是刚好卡在线上的那个数据点。

决策边界就是\(f(x)\),红色和蓝色的线是支持向量(support vector)所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙M(Margin Width)。

这里直接给出间隔\(M\)的计算公式:\(M=\frac{2}{||w||}\)。

SVM 要求解能够正确划分训练数据集并且「几何间隔」最大的分离超平面。

如下图所示,\(w*x+b\)即为分离超平面。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

  • 其中\(x_i\)为第\(i\)个特征向量。
  • \(y_i\)是第i个数据点的类别标签

间隔咋求,文中提到了两步如下。

1 几何间隔

公式中 s.t 是 subject to 的缩写,也就是限制条件的意思。SVM 模型的「求解最大分割超平面问题」可以表示为上面的约束最优化问题,化简的步骤中首先是先除了个\(\gamma\),然后重新代换了w和b(意义变了),最后他吧\(max(\gamma)\)也变了,最大化\(\gamma\)其实就是最大化\(\frac{2}{||w||}\)也就是\(\frac{1}{||w||}\),也就等价于最小化\(\frac{1}{2}||w||^2\),这里是把\(w\)转换了一下,方便之后的求导计算

2 对偶算法

求解线性可分支持向量机的最优化问题,我们很多时候会将它转化为对偶问题(dual problem)来求解,也就是应用「拉格朗日对偶性」,通过求解「对偶问题(dual problem)」得到「原始问题(primal problem)」的最优解

这样做有一些优点:

  • 对偶问题往往更容易求解。
  • 引入自然核函数,进而可以推广到非线性分类问题。

① 我们首先构建拉格朗日函数(Lagrange function)。为此,对每一个不等式约束引进拉格朗日乘子

左上角的拉格朗日函数咋来的呢?通过拉格朗日乘子\(\alpha_i\)的引入,约束条件\(y_i(w*x_i+b)\geq1\)被融入到目标函数中,而不再是外部的约束条件。这使得我们可以用标准的优化方法来处理它。如果某个解违背了约束,那么拉格朗日函数中的惩罚项就会变得很大,从而惩罚不合适的解。这样,我们通过优化拉格朗日函数,间接确保了原始约束的满足。至于\(\frac{1}{2}w^Tw\)就是之前的是向量

标签:SVM,函数,代码,小白,超平面,线性,alpha,向量
From: https://www.cnblogs.com/Mephostopheles/p/18403054

相关文章

  • 代码随想录day 10-栈和队列2
    题目1150.逆波兰表达式求值给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*'和'/'。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除......
  • 【Django开发】前后端分离django美多商城项目第10篇:收货地址,1. 展示地址接口设计和定
    本教程的知识点为:项目准备项目准备配置1.修改settings/dev.py文件中的路径信息2.INSTALLED_APPS3.数据库用户部分图片1.后端接口设计:视图原型2.具体视图实现用户部分使用Celery完成发送判断帐号是否存在1.判断用户名是否存在后端接口设计:用户部分JWT什......
  • b站小土堆|Dataset类代码实战
    完整代码如下:fromtorch.utils.dataimportDatasetfromPILimportImageimportosclassMyData(Dataset):def__init__(self,root_dir,label_dir):self.root_dir=root_dirself.label_dir=label_dirself.path=os.path.join(self.ro......
  • opencv学习:图像轮廓识别及代码实现
    图像轮廓1.获取图像轮廓cv2.findContours()函数是OpenCV库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界,并返回这些轮廓的列表。从OpenCV3.4版本开始,这个函数的返回值和参数有所变化,以下是详细的参数说明:方法:contours,hierarchy=cv2.findCon......
  • 牛客小白月赛100
    A-ACM中的A题#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;constintN=10;chars[N];i32main(){inta,b,c;cin>>a>>b>>......
  • 代码随想录训练营第25天|set去重
    491.非递减子序列classSolution{public:vector<vector<int>>result;vector<int>path;voiddfs(vector<int>&nums,intstartIdx){if(startIdx==nums.size()){return;}unordered_set&......
  • 代码随想录训练营第24天|回溯过程收集
    93.复原IP地址classSolution{public:vector<vector<string>>result;vector<string>path;boolcheck(string&sub){if(sub.length()>1&&sub[0]=='0')returnfalse;try{......
  • 代码随想录训练营第23天|回溯去重
    39.组合总和classSolution{public:vector<vector<int>>result;vector<int>path;intsum=0;voiddfs(vector<int>&candidates,inttarget,intstartIdx){if(sum==target){result.push_back(path......
  • VS中如何将本地代码上传到码云仓库
    VS中如何将本地代码上传到码云仓库方式一:点击“添加到源代码管理”VS底部栏点击“添加到源代码管理”,并选择“Git”选项在弹出窗口中,选择“其他→现有远程”选项,在右侧区域找到“远程URL”输入框,输入Gitee仓库地址,然后点击“创建并推送”按钮。此时项目目录会多出git文......
  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
    文章目录Java代码审计篇|ofcms系统审计思路讲解-篇1|环境搭建、路由机制1.前言2.项目环境搭建3.项目路由机制3.1.1)先搜索pom.xml文件,看看使用了什么框架3.2.2)确定是否是spring的路由机制3.3.3)确定自写路由机制的特点3.4.4)从前端探索3.5.5)断点调试3.6.6)寻......