王小草【机器学习】笔记--支持向量机SVM

2023-12-24 23:58

本文主要是介绍王小草【机器学习】笔记--支持向量机SVM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标签(空格分隔): 王小草机器学习笔记


1.SVM的原理与目标

1.1 分割超平面

QQ截图20161119153254.png-19.9kB

来看上图,假设C和D是两个不想交的凸集,则存在一个超平面P,这个P可以将C和D分离。

image_1b1to6btfmb7160310if21ilam12.png-7.2kB

这两个集合的距离,定义为两个集合间元素的最短距离。

做集合C和集合D最短线段的垂直平分线。这条垂直平分线就是分割超平面。

在两个集合之间,可以有无数条分割超平面,使其将两个集合分离,但是如何定义与找出两个集合的“最优”分割超平面呢?

可以这样做:
找到集合“边界”上的若干点,以这些点为基础计算超平面的方向,以两个集合 边界上的这些点的平均作为超平面的“截距”
因为超平面是通过这些点(向量)来支撑形成的,所以我们叫这些吃撑了超平面产生的向量叫做支持向量,support vector.

那么如果两个集合有部分相交,如何定义超平面,从而使得两个集合尽量分开呢?

如下图,在两个集合之间可以画出无数条超平面,到底哪条是最好的,到底哪些是支持向量呢?
image_1b1topoibt2839d5qjdo4rr1f.png-140.6kB

1.2 定义输入数据

假设给定一个特征空间上的训练集为:

image_1b1tp0330v6o1kune981ebn14a93g.png-6.3kB

其中,image_1b1tpatp911ct1li9t4e8vop513t.png-4.3kB

xi为第i个实例(样本),若n>1,则xi为向量。

yi为xi的标记:
当yi=1时,xi为正例
当yi=-1时,xi为负例
(至于为什么正负用(-1,1)表示呢?这个问题也许从来没有想过。其实这里没有太多原理,就是一个标记,你也可以用正2,负-3来标记。只是为了方便,yi/yj=yi*yj的过程中刚好可以相等,便于之后的计算。)

(xi,yi)称为样本点。

1.3 线性可分支持向量机

给定了上面提出的线性可分训练数据集,通过间隔最大化得到分离超平面为
image_1b1tporci1e53sa81lh9189lh0u9.png-3.3kB

相应的分类决策函数为:
image_1b1tppmtabnr1m1rnlj96kaskm.png-4.7kB

以上决策函数就称为线性可分支持向量机。

这里解释一下image_1b1tq1o9fscb5jjdl7avfidq13.png-1.3kB这个东东。
这是某个确定的特征空间转换函数,它的作用是将x映射到更高的维度。
比如我们看到的特征有2个:x1,x2,组成最见到的线性函数可以是w1x1,w2x2.但也许这两个特征并不能很好地描述数据,于是我们进行维度的转化,变成了w1x1+w2x2+w3x1x2+w4x1^2+w5x2^2.于是我们多了三个特征。而这个image_1b1tq8f2ja1nb81m8vi591aiq1g.png-1.3kB就是笼统地描述x的映射的。
最简单直接的就是:image_1b1tq9ortstg7ra1oedop81iae1t.png-2.3kB

以上就是线性可分支持向量机的模型表达式。我们要去求出这样一个模型,或者说这样一个超平面y(x),它能够最优地分离两个集合。
其实也就是我们要去一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合。

如下就是一个最优超平面:
image_1b1tqf5qo1s6r1hhq14ct1dfu5d12a.png-231.8kB

又比如说这样:
image_1b1tqguiaj4p1i7m1u9j10t11mds2n.png-69.3kB

阴影部分是一个“过渡带”,“过渡带”的边界是集合中离超平面最近的样本点落在的地方。

2.SVM的计算过程与算法步骤

2.1 推导目标函数

我们知道了支持向量机是个什么东东了。现在我们要去寻找这个支持向量机,也就是寻找一个最优的超平面。

于是我们要建立一个目标函数。那么如何建立呢?

再来看一下我们的超平面表达式:
image_1b1tqouu41hblckp1igg11po1q0k34.png-4.4kB

有:
image_1b1tqqn1d1l4ogjj102kt6e19ui3u.png-10.8kB

如果这个点落在超平面的上方,那么y就大于0,为正例,反之则为负例。无论正例还是负例,yi * y(xi)总是会大于0.

如果w,b等比缩放,则t*y的值同样缩放,所以有:
image_1b1tr1nn51lkhcdmmpr1abl1pqv9.png-7.3kB

通过上式可以得到目标函数:
image_1b1tr2ret1c2sogg1uei9d4i9jm.png-8.2kB

首先是把image_1b1tr7uqqelgrkairhrnnj7313.png-0.8kB这个东东提出来在外面。

image_1b1tr90jf1o7a1s5c1thl1kb9eq71g.png-4.6kB表示对某一个(w,b)的参数组合(也就是对某一个超平面)遍历所有的样本点xi,求该样本点到超平面的距离,然后取一个最小的距离。

最外层的max(w,b)表示在所有的(w,b)的组合中(也就是在所有的超平面中),选出那个拥有最大的最短距离的超平面。这个超平面就是我们要寻找的最优超平面。

2.2 转换目标函数

我们有了目标函数了,但创建目标函数的故事还没有完。为了计算的方便,目标函数还要进一步地化简化简,直到处女座们会心一笑为止。

再来看一下我们的分割平面:image_1b1trnn9en931ddg14dc62i1qg1t.png-3.8kB
|y|总是>=0的。

然而我们总可以通过等比例地缩放w的方法,使得两类点的函数值都满足|y| >= 1。
如果|y| >= 1这个条件满足,那么我们的原目标函数:
image_1b1trtma21rf2svj11er1j3e40n2a.png-7.7kB

就可以瘦身成新的目标函数:
image_1b1trugr01n6c4eje31evg1f7h2n.png-3.5kB

这个新的目标函数有个约束条件,就是:
image_1b1ts02r0vro1nsq16da1nu17ra37.png-4.2kB

来来来,教科书里标准的写法:
image_1b1ts2tbafi7mor165r8eo1h6k41.png-9.2kB

上面求最大值可以转换成求最小值的函数:
image_1b1ts5u31uludki1040133hof74h.png-9.4kB

||w||其实就是开根号的(w1^2+w2^2…wn^2),
所以||w||^2就刚好把里面的根号去掉了。

乘以一个1/2是我了等等求导的方便。

2.3 目标函数的求解

终于把目标函数给建立起来了。那么下一步自然是去求目标函数的最优值喽~

因为目标函数带有一个约束条件,所以我们可以用拉格朗日乘子法求解。

啥是拉格朗日乘子法呢?这边小小回顾一下。
如果函数f(x)= 2x+1,约束条件是x+1>0,
那么目标函数可以转换为:
f(x) = 2x+1 - α(x+1)

于是我们的目标函数就转换为了:
image_1b1tslnd0jn516gai3end5rmj5e.png-8.9kB

image_1b1tsoc6f1i3ophqhk01bcduj85r.png-6kB中将约束条件-1,所以这一部分的值肯定满足>=0了。

走到这一步,这个目标函数还是不能开始求解,现在我们的问题是极小极大值问题:
image_1b1tsvl1rb3oaoi1g3516tcpq468.png-5.5kB

我们要将其转换为对偶问题,变成极大极小值问题:
image_1b1tt101cr8t1s9vhs458nrcf6l.png-6kB

如何获取对偶函数?
首先我们对原目标函数的w和b分别求导:
原目标函数:image_1b1vjnneag2c1o0esh21520kn69.png-9.6kB

对w求导:
image_1b1vjp8611tvc1717jb52is1c6jm.png-10.4kB

对b求导:
image_1b1vjqegou181f94117j371cq21a.png-8.1kB

然后将以上w和b的求导函数重新代入原目标函数的w和b中,得到的就是原函数的对偶函数:
image_1b1vk20iq3vc14ld17p51a1v1tq72h.png-40.6kB

这个对偶函数其实求的是image_1b1vk6nks1tph1sgahlr1i7gk839.png-7.4kB中的minL(w,b)部分(因为对w,b求了偏导)。

于是现在要求的是这个函数的极大值max(a),写成公式就是:
image_1b1vkcscvjtmvrh17aesshj216.png-11.2kB

好了,现在我们只需要对上式求出极大值a*,然后将a*代入w求偏导的那个公式image_1b1vkl6itec6sd973hfejijt30.png-3.3kB
从而求出w.

将w代入超平面的表达式,并且将所有样本点都代入,再除以2,就可以得到b了。

现在的w,b就是我们要寻找的最优超平面的参数。

我们用数学表达式来说明上面的过程:
1.首先是求image_1b1vl4efr1in9ie51i3oji91k443q.png-4.5kB的极大值。即:

image_1b1vl6m211d4i10p91gqa142e1kdb4k.png-20.2kB
注意有两个约束条件。

2.对目标函数添加符号,转换成求极小值:
image_1b1vl91l31elj17hf1cf1a7n9d951.png-20.5kB

3.计算上面式子的极值求出a*

4.将a*代入,计算w,b
image_1b1vlc9li1hkdb59179u147dfoo61.png-12kB

5.求得超平面:
image_1b1vld5fhblkn2j1c7h1nk1pc66e.png-5.3kB

6.求得分类决策函数:
image_1b1vldujb18mb1g5ch8uoikios6r.png-8.2kB

2.4 例子

给定3个数据点:正例点x1=(3,3),x2=(4,3),负x3=(1,1),求线性可分支持向量机。
三个点画出来:
image_1b1vpnodb1b799lo8l2e23122h78.png-10.7kB

1.首先确定目标函数

image_1b1vpp1i8168k1haq1m9m15fctco7l.png-20.6kB

2.求得目标函数的极值

image_1b1vprj9k165r2vre2cgj2ocp9.png-66.9kB

3.将求得的极值代入从而求得最优参数w,b
a1=a3=1/4对应的点x1,x3就是支持向量机
代入公式:
image_1b1vpvo2k17871nch1c11o32vgcm.png-9.7kB

得到w1=w2=0.5, b=-2

4.因此得到分离超平面为
image_1b1vq1idm13qfc9rs661r8c124r13.png-3.1kB

5.得到分离决策函数为:
image_1b1vq2j9ks6a1obb10re4dm112s1g.png-5.6kB

3.线性支持向量机–软间隔最大化

上文第一节与第二节将的都是线性可分支持向量机,也就是说肯定可以找出一个超平面来完全得分割两个集合。

那么是不是分类完全正确的超平面就是最好的呢?

像下图这样的例子,黑色实线完全地将两个集合分开了,但是很明显,我们仍然感觉虚线更好,虽然如果将虚线作为分割面有一个样本被分错了,但是它具有更好的泛化能力。如果画出过渡带的话,实现的过渡带会非常窄,而虚线的过渡带则比较宽。
image_1b1vqj1acfs81ldf1f5bl5h1vfl2a.png-12.7kB

完美地分割面并不是最优的,而且往往还会导致过拟合。我们的样本数据中可能存在的异常值或噪声往往也会导致完美的分割并不完美。对它们的忽视也许会有利于找到更好的分离超平面。

另外,在实际应用中,样本数据往往是线性不可分的,我们根本找不到一个超平面去完全隔离两组数据。

3.1 目标函数及其计算

若数据线性不可分,则增加松弛因子ξi>=0.
使函数间隔加上松弛变量大于等于1.
如此的话约束条件就变成了:
image_1b1vtdlg91h0g7kv1m22hpm165i9.png-5.4kB

目标函数就变成了:
image_1b1vtf87m15v01ck31tjv70s1vuo13.png-20.3kB
这个系数C细究一下,如果C为正无穷,那么ξ必须等于0才能使整个公式求得最小值。如果ξ为0的话,就是没有松弛因子,求出来的就是线性可分支持向量机的最优超平面。随着ξ越来越小,超平面会慢慢地趋于泛化,下面这个图中的实现会慢慢变成虚线。
image_1b1vqj1acfs81ldf1f5bl5h1vfl2a.png-12.7kB

同样对目标函数进行拉格朗日函数的转换:
image_1b1vtge8gq84g7417aa1ot5o4p1g.png-8kB

然后对w,b,ξ分别求偏导:
image_1b1vthet81v3ueqn13mp1hsh13cp1t.png-18.5kB

将以上三个求偏导的式子代入L中,得到:
image_1b1vtifftf94btu123l1sulrrt2a.png-9.1kB

对上式再求极大值:
image_1b1vtjcbb1loavc8msol271edl2n.png-18.7kB
其实,我们发现,目标函数与线性可分支持向量机是一样的,不一样的是约束条件。

上面的约束条件可以经过变化,最终得到对偶问题:
image_1b1vtnfh21pl21kogk2irtqejj3h.png-15.9kB

然后对以上式子求最优值a*

将a*代入并计算w,b
image_1b1vtqsd924gfjnort1vn4fu39.png-9.4kB
注意,计算b*时,需要使用满足条件0 < aj

3.2 损失函数

如下图,分别有三类损失函数

image_1b1vvangp18tc11dhis2q8h9k22a.png-67.4kB

绿色:0/1损失
当负例的点落在y=0这个超平面的下边,说明是分类正确,无论距离超平面所远多近,误差都是0.
当这个负例的样本点落在y=0的上方的时候,说明分类错误,无论距离多远多近,误差都为1.

蓝色:SVM Hinge损失函数
当一个负例的点落在y=1的直线上,距离超平面长度1,,那么1-ξ=1,ξ=0;
当它落在距离超平面0.5的地方,1-ξ=0.5,ξ0.5,也就是说误差为0.5;
当它落在Y=0上的时候,距离为0,1-ξ=0,ξ=1,误差为1;
当这个点落在了y=0的上方,被误分到了正例中,距离算出来应该是负的,比如-0.5,那么1-ξ=-0.5,ξ=-1.5.误差为1.5.
以此类推,画在二维坐标上就是上图中蓝色那根线了。

红色:LOGISTIC损失函数
损失函数的公式为:ln(1+e^-yi)
当yi=0时,损失等于ln2,这样真丑,所以我们给这个损失函数除以ln2.
这样到yi=0时,损失为1,即损失函数过(0,1)点
及时图中的红色线。

4.核函数

SVM+核函数具有极大威力。核函数并不是SVM特有的,核函数可以和其他算法也进行结合,只是核函数与SVM结合的优势非常大。

4.1 什么是核函数

核函数,是将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。

之前我们讲的Φ(xi)是第i个样本的特征,Φ(xj)是第j个样本的特征。现在我们将两个样本做一个点乘,并且用k(xi,xj)表示:
k(xi,xj) = Φ(xi) * Φ(xj)

这个k(xi,xj)我们就定义核函数。它是类似于相似度的一个东东。

i可以取值为1->n,j也可以取值为1->n,通过核函数的转换就变成了n*n的一个矩阵:

j/i12n
1k11k12k1n
2k2n
nkn1kn2

注意xi和xj是两个样本,如果是特征的维度只有1,那么x就是一个值,如果维度大于等于2,那么x就是一个特征向量。但是k(xi,xj)永远都是一个值。

核函数有很多很多种类,比如:
image_1b2095k6g10hi1k151u151tp81bf29.png-28.6kB

在实际中选择何种核函数呢?
选择核函数,往往依赖先验领域知识,或者通过交叉验证等方法来选择有效的核函数。

如果没有更多的先验信息,则选择使用高斯核函数。

4.2 核函数的映射

我们以高斯核函数为例。
假设任意两个点x1,x2.
||x1-x2||表示x1-x2的模也就是x1与x2的直线距离d。
||x1-x2||^2就是两点距离d的平方。
将d^2再除以2sigma平方,然后前面加个负号
于是从高斯核函数的公式中可以看出,如果距离d越大,则两个点的相似性越小,而k(x1,x2)也越小,反之亦然。所以我们说核函数就是类似于相似性的一个描述。

既然是相似性,那距离为0的核函数k就=1,距离越远的话,k就越小。
对样本点x1,我们可以把所有样本点都和x1求一个k值,那么必然是以x1为中心点,向外一层层画圆,每个圆环上的点都与x1的k值相同,越外的圆k值就越小。就好像一组等高线。正例的在上方形成一个山峰,负例的在下方形成一个山谷。那么对每个样本点都这样做一次。于是画在三维图上就是如下样子:

image_1b226l7vrt64esoirf6k51lv713.png-311.1kB

所有的山峰会组成一个大山峰,所有的山谷也会组成一个大山谷,所以,就形成了右下图的样子。
image_1b226gvic11gq5oh1d1jpi1bffm.png-166.9kB

可以看到上图中有一个平面可以将这一整个山切开,上面是正例点,下面是负例点。加这个平面转换到二维左边的样本点图中就是一条分割红蓝点的曲线(分割超平面)。

也就是说,我们将低维的样本点映射到高维,在高维中找到一个最优的分割超平面,然后再将超平面转换到低维中的一条曲线。

那么如何在高维中寻找一个最优分割超平面呢?这个就又回到了我们上面讲的SVM支持向量机的寻找分割超平面的问题了。
所以说核函数与SVM真的是搭配得天衣无缝。

4.3 高斯核

高斯核是什么样的,上面已经讲了。高斯核还有一个特性–就是“高斯核是无穷维的”。

下面这个公式是可以证明得到的,这里不讲如何证明:
image_1b2279a04mkl1qai34lphn1u8n9.png-9kB

将上面这个公式代入高斯核函数中:
image_1b227av37psssfr1e2re3lsnum.png-34.4kB

其中,
image_1b227d9mcfseika6pm12dm1ttf1j.png-12.1kB

无穷维的高斯核,也就说可以将低维空间的样本构造成如何维度,可以构造任何一种存在的可能。所以,对于一组训练样本,高斯核函数总能有一种方式可以实现对训练样本的100%的拟合。(虽然100%的拟合并不是我们想要的,因为那样会导致过拟合)

5.SMO算法

SMO:Sequential Minimal Optimization序列最小最优化

回顾之前的目标函数求解,函数中有多个拉格朗日乘子a11,a2,..an。
现在对其中两个乘子做优化,其他因子认为是常数。这样就将N个解的问题转换成了两个变量的求解问题,并且目标函数是凸的。求解完之后,将这两个因子剔除掉,然后继续选另外两个来做优化,以此类推。

下面是求解过程(直接截取邹博老师的PPT)
image_1b228lcag1q0r1ajjddjcuf1qtnm.png-47.7kB

image_1b228njnk83r1dst8mi1mpd1iqn1j.png-52.4kB

image_1b228t39l1uiq1d917oenep1ce820.png-41.3kB

image_1b228tnjj11lki830o1m7i1bdt2d.png-52.7kB


支持向量机的理论就此结束,之后的补充与扩展会直接追加。

这篇关于王小草【机器学习】笔记--支持向量机SVM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/533584

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi