SVM原理

article/2025/10/1 4:03:03

我们先认识一下SVM:

(1)支持向量机(Support Vector Machine, SVM)是一种对数据进行二分类的广义线性分类器,其分类边界是对学习样本求解的最大间隔超平面。

(2)SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。

(3)SVM可以通过引入核函数进行非线性分类。

关于SVM的阐述,我们发现SVM有三宝,分别是最大间隔、对偶问题以及核函数。

 

1、最大间隔超平面

在说明最大间隔超平面问题之前,先说明一下什么是线性可分。

线性可分:假设有猪狗两类样本,若在特征空间中存在一个超平面将猪狗完全准确分开,那么就称这个猪狗样本集线性可分。在二维空间时,超平面就是一条直线。

对于一个线性可分样本集,可能存在多个超平面(line1,line2)都可以将其线性可分,那么怎么选择超平面呢?假设现在有一只冒充猪的小狗来搞破坏,是否存在一个超平面,无论来了多少只小狗或者小猪,依然可以将其阴谋识破?SVM解决的就是这个,找出一个最佳超平面正确划分样本。

那最佳超平面长什么样的呢?我们认为最佳超平面必须具有更好的泛化能力,对噪声更为不敏感,即更好的鲁棒性。从几何角度来说,两样本到超平面的间隔越大,抗干扰能力越强,所以最佳超平面就是以最大间隔把样本分开的超平面,也称之为最大间隔超平面。

间隔是两侧样本到超平面的距离之和,即margin = d1+d2,多个样本就有多个间隔值,那是不是每个间隔对超平面的贡献都一样的呢?答案是否定的,离超平面越近的样本越容易划分错误,因此离超平面越近的样本对超平面的影响越大,所以为了找到最大间隔超平面,首先要找到两侧离超平面最近的样本点,求出其到超平面的距离之和,即margin = min(d1+d2)。然后不同超平面,margin不同,为了找到最佳超平面,我们需要最大化margin,可以理解为泛化能力最大的那个超平面,即max margin。

转为数学表达,即max margin = max min(d1+d2)

点到直线的距离d:点W(Xw,Yw)到直线AX+BY+C=0的距离等于

现在假设在样本集中,存在一个超平面WTX+b=0,使得样本集线性可分,那么样本到超平面的距离d为:

答案是否定的,因为无论k值取多少,都是 WTX+b=0移k个单位,因此为了方便后面的计算,使|WTX+b|=1,那么:

就这样,将寻找最大间隔超平面的问题转化为数学优化问题,但这里有一个前提,就是这个超平面能把样本正确分类,这个大前提的数学表达式为:

另外求优化问题时,我们更喜欢转为凸优化,因为: 

且||W||是个带根号的值,为了方便运算,将||W||等同于||W||的平方, 且乘上系数1/2方便求导,因此最终优化问题表达式为:

 

2、对偶问题:

那么怎么求解呢?对于高维数据、样本量非常大的时候,无法通过简单运算求解,这时候就会通过对偶、核技巧等方法求解。在求解之前先简单介绍一下带约束与不带约束的凸优化问题都是怎么求解的?

(1) 不带约束条件:

不带约束条件的求解是很容易得到的,直接求导求最小值就可以了。

(2) 带等式约束条件:

带等式约束条件的一般会先通过拉格朗日乘子法转化为无约束后,再通过求导求解。如:给定约束条件h(x)=0,求minf(x) 的问题,可以先定义如下拉格朗日函数(λ为拉格朗日乘子):L(x,λ) = f(x)+λh(x),即将等式约束转为无约束了,求解时分别对x,λ求导即可。

(3) 带不等式的约束条件:

带不等式的约束条件的优化问题,一般会先转化为带等式约束,再通过拉格朗日乘子法求解。如:给定约束条件 g(x)<=0,求min f(x) 的问题,首先定义一个k值,使得h(x,k) =g(x)+k^2。接着定义如下拉格朗日函数(λ为拉格朗日乘子): L(x,λ,k) = f(x)+λh(x)=f(x)+λg(x)+λk^2 即将不等式约束转为无约束了,最后分别对各个参数求导即可。

这里以我们的优化问题为例,讲讲带不等式的约束条件时怎么求解的。

最终得到的条件也称为不等式约束优化问题的KKT条件,也是强对偶的必要条件。另外,从上图星号的公式也可以知道,当λi=0时,约束条件是不起约束作用,只有当λi>0时,约束条件才起约束作用,此时点(xi,yi)称为支持向量。这也是为什么这个算法叫支持向量机的原因,真正对最佳超平面起作用的点只有支持向量,因此大大降低了的运算消耗。

那么强对偶能解决什么问题呢?强对偶可以根据计算的难度、复杂度在minmax与 maxmin之间转换。

Ok,对偶问题讲到这里,那么对偶问题是怎么应用到我们的优化问题当中的呢?现在我们的优化问题可以写成:

公式推导到这里 :

 

可以看出来其实这是个二次规划问题,常用SMO算法求解,最终得出最佳参数λ。 

在已知最优W (KKT条件),最优λ的前提下,因为对最佳超平面起作用的只有支持向量,那么设点(xk,yk)是一个支持向量,则,求得最优b。最终最佳超平面的表达式为:

 

可以看到,最佳参数W,b都是关于数据的线性组合,到这里SVM的任务就完成了。

 

3、核函数:

百度百科:支持向量机通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x) ⋅φ( x′) > 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数 K(x, x′) 直接得到非线性变换的内积,大大简化了计算。这样的函数 K(x, x′) 称为核函数。

 

这里提取一下知识点,非线性变换、内积运算、核函数

 

(1) 非线性变化

 

这里有一个定理,高维空间比低维空间更容易线性可分。

 

前面提到当数据样本完全线性可分时,可以得到一个最佳超平面,那么当数据样本不是线性可分时,还可以得到一个最佳超平面吗?根据定理,在当前维度不能线性可分时,把样本通过非线性变化映射到更高维度,是有可能线性可分的。举个例子:

 

(2) 内积运算

 

经过上述的推导,我们知道SVM最终的优化问题是:

(xi ⋅ xj)是内积运算,当有n个样本点时,会构成n*n的矩阵。当x经过非线性变换后为 φ( x),优化问题转为:

当 φ( x)维度高到一定程度甚至无限维时,计算量会随着维度的增大而增大,而且计算完φ( x)后,还需要计算φ( x)的内积,这时可能会因为计算量过大而出现无法计算的情况,这时候就需要核函数拯救世界了。

(3) 核函数

 

核函数是指在低维输入空间中存在一个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x) ⋅φ( x′) >,此时将会大大减小计算消耗,这就是为什么很多人将核函数也称为核技巧的原因,因为其相当于是一个计算技巧。

 

常见的核函数有线性核函数、多项式核函数、高斯核函数等。

 

4、软间隔:

完全线性可分在现实中是很少的,大部分都并不是完全线性可分,有两种情况,一是需要通过非线性变化后才可能线性可分,二是在低维空间可以线性可分,但有一定量的错误。对于第二种情况,我们会使用软间隔划分,说白了就是没那么苛刻的硬间隔。

这里引入一个松弛变量,优化问题:

看到上述式子是不是有点像加入了正则化的感觉呢?没错,这里是对错误划分样本的惩罚。

当松弛变量=0时,点落在最大间隔边上,点划分正确;

当 1>松弛变量>0 时,点落在最大间隔内,点划分正确;

当 松弛变量=1 时,点落在超平面上,点划分正确;

当 松弛变量>1时,点划分错误;

 

接下来的求解过程跟上述类似,先构建拉格朗日乘子函数: 

可能有朋会问为啥最后那一项是减而不是加,这里提醒一下,拉格朗日乘子法的约束条件是小于等于0的。然后还是强对偶转换,求导代入,最后得到:

对比一下硬间隔和软间隔,最终得到的优化问题是一致的,不同的地方在于软间隔增加了一个约束条件 。

 

5、实例:

已知一个训练集,现在有正例(3,3)T,(4,3)T ,负例(1,1)T ,试求最大间隔分离超平面。

 

答:按照上述算法,构建训练集约束最优化问题:

 


http://chatgpt.dhexx.cn/article/SqeeWPmm.shtml

相关文章

通俗易懂SVM原理介绍,适合小白食用

目录 1、SVM概念描述 2、SVM数学表达及相关计算 3、SVM优化问题定义 附&#xff1a;证明区 【证明1】 【计算1】 1、SVM概念描述 如图一所示&#xff0c;存在两个数据集&#xff0c;我们希望通过一个超平面将两个数据集分割开&#xff0c;并且我们希望这个超平面离两个数…

01-Hive创建表

声明&#xff1a;本实验环境是Apache hadoop-2.2.0&#xff0c;zookeeper-3.4.5&#xff0c;mysql Server version: 5.1.73作为元数据库&#xff0c;hive版本是apache-hive-0.9.0-bin&#xff0c;都是apache&#xff0c;不是CDH和其他。本实验集群3台&#xff0c;一个主节点(ha…

hive 中创建表的三种方式

官网地址&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualDDL 通常我们所使用的创建hive表有三种方式 1.create table 首先我们找到官网对创建表的描述如下&#xff1a; ’[]’ 表示可选&#xff0c;’|’ 表示几选一 CREATE [TEMPORARY] [EXT…

hive创建新表——基础

创建基础表 1、创建表&#xff1a; create table if not exists orders 创建一个名叫“orders”的表&#xff0c;“if not exists”可以写可不写&#xff0c;如果相同名字的表已经存在&#xff0c;则抛出异常&#xff0c;可以用 IF NOT EXIST 选项来忽略这个异常。 2、定义表…

HIVE的常用操作-建库和表-插入数据

hive的安装&#xff08;远程模式&#xff09; 点击打开链接 使用hive----------------------- 启动hadoop 启动hive 创建数据库&#xff1a; create database myhive; 查看数据库&#xff1a; hive (default)> show databases; OK database_name default myhive 数…

Hive三种建表语句详解

转载自&#xff1a;https://blog.csdn.net/qq_36743482/article/details/78383964 注&#xff1a;hive其他语法在hive官网有说明&#xff0c;建议初学者&#xff0c;去官网学习一手的资料&#xff0c; 官网&#xff1a;https://cwiki.apache.org/confluence/display/Hive/Home#…

关于hive建表查询语句小记

库相关操作 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; IF NOT EXISTS 也就是没有重复库就创建&#xff0c;有重复就不执行建库 保证了建库…

hive、pg库,建表语句及查询表结构语句

1、hive hive 建表语句 DROP TABLE IF EXISTS tmp_001; CREATE TABLE tmp_001 (etl_time timestamp comment , day_id double comment , subs_id string comment , msisdn int comment ) comment partitioned by…

3、Hive数据仓库——建表语句

文章目录 Hive基本操作Hive查看SQL解析计划Hive建表建表1&#xff1a;全部使用默认建表方式 Hive 内部表 &#xff08;Managed tables&#xff09;指定location (这种方式也比较常用)formatted 查看该表的结构化数据&#xff0c;但并不列出表中的数据将本地数据上传到HDfS上 Hi…

HIVE的三种建表方式

目录 一、直接建表二、as &#xff08;直接使用查询结果插入到一张新表&#xff09;三、like&#xff08;复制表结构&#xff09; 一、直接建表 中括号里面的均为可选项 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name[(col_name data_type [COMMENT col_comment], ...…

Hive学习3:Hive三种建表语句详解

注&#xff1a;hive其他语法在hive官网有说明&#xff0c;建议初学者&#xff0c;去官网学习一手的资料&#xff0c; 官网&#xff1a;https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation Create Table 官网说明 Hive建表方式共有三种&#xff…

Hive_ Hive 建表语句详解

参考文章&#xff1a; https://blog.csdn.net/qq_36743482/article/details/78383964 最近博主在编写一个每天定时创建Hive 分区的脚本&#xff0c;其中需要创建Hive表&#xff0c; 开始的时候我以为创建Hive 表的语句顺序是比较宽松的&#xff0c;经过测试发现不然&#xf…

Hive建表语句详解--CREATE TABLE

创建表的三种方法 Hive创建表的方式&#xff08;默认路径/user/hive/warehouse&#xff0c;也可以location指定&#xff0c;主要针对external表&#xff09; 1、使用create命令创建一个新表,带分区 CREATE TABLE mydb.dept( dept_no int, addr string, tel string) par…

【Hive】Hive 创建表

学习笔记—Hive创建表 1. Hive语句的特点 HQL 语言大小写不敏感&#xff0c;但内容分大小写&#xff08;where ,if/ case when&#xff0c;如&#xff1a;数据表内容某人名叫Tom&#xff0c;则条件后不能写tom&#xff0c;HDFS 路径名&#xff08;NameNode&#xff09;分大小写…

hive建表语句

目录 一、建表语句1、创建内部表2、创建外部表3、建表高阶语句 CTAS 和 WITH4、向临时表中插入原表中的数据5、创建分区表 一、建表语句 1、创建内部表 建表&#xff1a; CREATE TABLE phone_info(id int,name String,storage String,price double) ROW FORMAT DELIMITED //…

c语言void* arg,void * arg什么意思

许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据…

什么是arguments

什么是arguments 形参&#xff1a;函数定义的参数实参&#xff1a;函数调用时实际传递的参数。参数匹配是从左向右进行匹配。如果实参个数少于形参&#xff0c;后面的参数对应赋值undefined。实参的个数如果多于形参的个数&#xff0c;可以通过arguments访问。【案例】模拟封装…

python函数参数*arg和**args的用法

import numpy as np """ 做饭函数&#xff0c;表示午饭有什么,foods表示一个元组 """ def make_meals(*foods):for item in foods:print(今天午饭有,item)def dictionary(**dic):for key,value in dic.items():print(英文名(key) , key , &…

什么是:arguments

在调用函数时&#xff0c;浏览器每次都会传递进两个隐含的参数: 1.函数的上下文对象this 2.封装实参的对象arguments 什么是&#xff1a;arguments 1.arguments是一个类数组对象,它也可以通过索引来操作数据&#xff0c;也可以获取长度 在调用函数时&#xff0c;我们所传递的实…

python中的arg,*args,args,**kwargs,kwargs的关系和区别

arg就是指一个参数 def func(arg):print(arg)func(2) *args 是用来将参数打包成元组给函数调用的&#xff0c;args即是传给函数的参数所构成的元组 def func(arg, *args):print(arg, *args)func(1, 2, 3, 4, 5, 6, 7)**kwargs是用来将关键字参数打包成字典给函数调用的&#…