SVM直观理解

https://tangshusen.me/2018/10/27/SVM/

https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from=333.337.search-card.all.click\&vd_source=8272bd48fee17396a4a1746c256ab0ae

SVM是什么? 先来看看维基百科上对SVM的定义:

支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。

如果从未接触SVM的话,维基的这一大段解释肯定会让你一头雾水。简单点讲,SVM就是一种二类分类模型,他的基本模型是的定义在特征空间上的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。

我们先来看看下面这个图:

图1.1

图中有分别属于两类的一些二维数据点和三条直线。如果三条直线分别代表三个分类器的话,请问哪一个分类器比较好?

我们凭直观感受应该觉得答案是H3。首先H1不能把类别分开,这个分类器肯定是不行的;H2可以,但分割线与最近的数据点只有很小的间隔,如果测试数据有一些噪声的话可能就会被H2错误分类(即对噪声敏感、泛化能力弱)。H3以较大间隔将它们分开,这样就能容忍测试数据的一些噪声而正确分类,是一个泛化能力不错的分类器。

对于支持向量机来说,数据点若是𝑝维向量,我们用𝑝−1维的超平面来分开这些点。但是可能有许多超平面可以把数据分类。最佳超平面的一个合理选择就是以最大间隔把两个类分开的超平面。

目标:

因此,SVM选择能够使离超平面最近的数据点的到超平面距离最大的超平面。

以上介绍的SVM只能解决线性可分的问题,为了解决更加复杂的问题,支持向量机学习方法有一些由简至繁的模型:

  • 线性可分SVM

当训练数据线性可分时,通过硬间隔(hard margin,什么是硬、软间隔下面会讲)最大化可以学习得到一个线性分类器,即硬间隔SVM,如上图的的H3。

为了找到最大间隔超平面,我们可以先选择分离两类数据的两个平行超平面,使得它们之间的距离尽可能大。在这两个超平面范围内的区域称为"间隔(margin)",最大间隔超平面是位于它们正中间的超平面。

  • 线性SVM

当训练数据不能线性可分但是可以近似线性可分时,通过软间隔(soft margin)最大化也可以学习到一个线性分类器,即软间隔SVM。

软间隔目的是在间隔距离和错误大小间找到一个平衡

  • 非线性SVM

当训练数据线性不可分时,通过使用核技巧(kernel trick)和软间隔最大化,可以学习到一个非线性SVM。

此时不能通过一条直线将他有效区分

进行升维转换,增加一个维度

  1. 通过维度转换函数将低维数据进行升维
  2. 在高维度下求解SVM模型,找到对应的分隔超平面

但是维度转换函数需要更多的存储数据需求

通过选取合适的核公式,可以不用知道具体的维度转换函数,直接获得数据的高维度差异

相关推荐
罗湖老棍子4 分钟前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
for_ever_love__31 分钟前
线性回归与梯度下降——从零手写一个模型
python·机器学习·线性回归·梯度下降
飘尘2 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
AOI小白新手上路3 小时前
anomalib 缺陷检测复现笔记:从跑通库到 EfficientAD 落地
人工智能·笔记·机器学习
夏幻灵3 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展
I Am a robert girl3 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
CarIise3 小时前
Java实训阶段查漏补缺复习笔记2
java·linux·算法
无忧.芙桃4 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode
蛋蛋的就会顺顺的4 小时前
hot100——二叉树
java·数据结构·算法·leetcode·力扣
Code_Solitude4 小时前
c语言:二分法的完整补充
c语言·开发语言·算法