SVM(支持向量机)

news2024/10/23 14:35:21

SVM(支持向量机)

引言

支持向量机(Support Vector Machine,SVM),可以用来解答二分类问题。支持向量(Support Vector):把划分数据的决策边界叫做超平面,点到超平面的距离叫做间隔。在SVM中,距离超平面最近的且满足一定条件的几个训练样本点被称为支持向量。
图中,被圈出来的就是支持向量。支持向量机是要使超平面和支持向量之间的间隔尽可能的大,这样才能使两类样本尽可能地分开。
在这里插入图片描述

间隔又分为硬间隔软间隔

  • 硬间隔
    在使用超平面进行分割数据时,严格地让所有实例都不在最大间隔之间,并且位于正确的一遍,就是硬间隔。
    在这里插入图片描述

硬间隔存在的问题:1.只在数据线性可分时有效 2.对异常值非常敏感。

  • 软间隔
    要避免硬间隔存在的问题,目标是尽可能在保持最大间隔宽阔和限制间隔违例之间找到良好平衡。
    在这里插入图片描述

SVM存在以下优点:

  1. 既可以用于二分类,也可以用于回归和异常检测
  2. 具有良好的鲁棒性,对未知数据拥有很强的泛化能力,特别是在数据量较小的情况下,相较其他传统机器学习算法具有更优的性能。
  3. 原理

SVM通过优化一个凸二次规划问题来求解最佳的超平面,其中包括最小化模型的复杂度,同时限制训练样本的误分类情况。
我们将支持向量机的判别面、支持面表示为:
w x + b = ± 1 w x + b = 0 wx+b= \pm 1\\ wx+b = 0 wx+b=±1wx+b=0
从而可以算得,支持面和判别面的距离为 d = 1 ∣ ∣ w ∣ ∣ d = \frac{1}{||w||} d=∣∣w∣∣1
在使用SVM模型时,由于SVM的支持面与判别面的距离为 d = 1 ∣ ∣ w ∣ ∣ d = \frac{1}{||w||} d=∣∣w∣∣1,所以两个支持面的距离为 2 d = 2 ∣ ∣ w ∣ ∣ 2d=\frac{2}{||w||} 2d=∣∣w∣∣2最大化两支持面之间的距离 2 ∣ ∣ w ∣ ∣ \frac{2}{||w||} ∣∣w∣∣2,等价于最小化 ∣ ∣ w ∣ ∣ 2 2 ( 给 ∣ ∣ w ∣ ∣ 加平方是为了去除根号 ) \frac{||w||^2}{2}(给{||w||}加平方是为了去除根号) 2∣∣w2(∣∣w∣∣加平方是为了去除根号)

  • 硬间隔SVM的损失函数

    硬间隔SVM最大化支持面之间的距离,并要求所有样本在支持面之外。因此,硬间隔的损失函数如下:

    目标函数:
    L ( w , b ) = 1 2 ∣ ∣ w ∣ ∣ 2 L(w,b)=\frac{1}{2}||w||^2 L(w,b)=21∣∣w2
    约束条件:
    y i ( w x i + b ) − 1 ≥ 0 , i = 1 , 2 , . . . . . , N y_i(wx_i+b)−1 \geq 0 , i=1,2,.....,N yi(wxi+b)10,i=1,2,.....,N

    正样本要在正支持面一侧,即 w x i + b ≥ 1 wx_i+b \geq 1 wxi+b1,此时 y i = 1 y_i = 1 yi=1,可得 y i ( w x i + b ) − 1 ≥ 0 y_i(wx_i + b)-1 \geq 0 yi(wxi+b)10
    负样本要在负支持面一侧,即 w x i + b ≤ − 1 wx_i+b \leq -1 wxi+b1,此时 y i = − 1 y_i = -1 yi=1 ,可得 y i ( w x i + b ) − 1 ≥ 0 y_i(wx_i+b)-1 \geq 0 yi(wxi+b)10

  • 软间隔SVM的损失函数
    软间隔SVM最小化支持面之间的距离,并最小化错误样本,因此软间隔的损失函数如下:
    目标函数:
    L ( w , b , ξ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i L(w,b,\xi) = \frac {1}{2}||w||^2 + C \sum_{i=1}^{N} \xi _i L(w,b,ξ)=21∣∣w2+Ci=1Nξi
    约束条件:
    (1) y i ( w x i + b ) − ( 1 − ξ i ) ≥ 0 , i = 1 , 2 , . . . . . . . , N y_i(wx_i+b)-(1-\xi_i) \geq 0,i=1,2,.......,N yi(wxi+b)(1ξi)0,i=1,2,.......,N
    (2) ξ i ≥ 0 , i = 1 , 2 , . . . . . . , N \xi_i \geq 0 ,i=1,2,......,N ξi0,i=1,2,......,N
    其中 ξ i \xi_i ξi是对i个样本的松弛量,而C是惩罚因子。

    随着支持面的不同取值,有的样本能在支持面正确一侧,有的则在错误一侧,不妨记 ξ i \xi_i ξi为第i个样本的误错量,则第i个样本满足 y i ( w x i + b ) − ( 1 − ξ i ) ≥ 0 y_i(wx_i+b)-(1-\xi_i)\geq0 yi(wxi+b)(1ξi)0
    然后目标函数是最小化所有样本的误错量 C ∑ i = 1 N ξ i C\sum_{i=1}^N\xi_i Ci=1Nξi,其中C是错误量在损失函数中的权重。

SVM的损失函数中带有各种约束条件,难以用一般的方法进行求解,因此可以考虑使用下面的方法:

  1. 先将损失函数转化为拉格朗日形式
  2. 通过拉格朗日形式获得损失函数的对偶问题
  3. 使用SOM算法求得对偶问题的解
  4. 将对偶问题的解转换回原问题的解

下面是对软间隔问题的求解
将SVM软间隔模型的损失函数化为拉格朗日函数形式为:
L ( w , b , ξ , α , μ ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i y i ( w x i + b ) + ∑ i = 1 N α i − ∑ i = 1 N ( C − α i − μ i ) ξ i L(w,b,\xi,\alpha,\mu) = \frac{1}{2}||w||^2 - \sum_{i=1}^N \alpha_i y_i(wx_i+b)+\sum_{i=1}^N \alpha_i - \sum _{i=1}^N(C - \alpha_i -\mu_i)\xi_i L(w,b,ξ,α,μ)=21∣∣w2i=1Nαiyi(wxi+b)+i=1Nαii=1N(Cαiμi)ξi
其中 α i ≥ 0 , μ i ≥ 0 \alpha_i \geq 0,\mu_i \geq 0 αi0,μi0
SVM损失函数的对偶问题:

目标函数:
m i n 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i T ⋅ x j ) − ∑ i = 1 N α i min\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_j y_i y_j(x_i^T \cdot x_j) - \sum_{i=1}^N \alpha_i min21i=1Nj=1Nαiαjyiyj(xiTxj)i=1Nαi
约束条件:

(1) ∑ i = 1 N α i y i = 0 \sum_{i=1}^N \alpha_i y_i = 0 i=1Nαiyi=0

(2) C ≥ α i ≥ 0 , ( i = 1 , 2....... N ) C\geq\alpha_i\geq0,(i=1,2.......N) Cαi0,(i=1,2.......N)

解得损失函数对偶问题 α i \alpha_i αi之后,按下式可以转回原问题的解w、b
w = ∑ i = 1 N α i y i x i b = A v g ( y i − ∑ j = 1 N α j y j ( x j T ⋅ x i ) ) w = \sum_{i=1}^N\alpha_i y_i x_i \\ b = Avg(y_i - \sum_{j=1}^N\alpha_j y_j (x_j^T \cdot x_i)) w=i=1Nαiyixib=Avg(yij=1Nαjyj(xjTxi))

最终,SVM的模型解由对偶问题的解所给出,可以写为:
g = w x + b ,其中 w = ∑ i = 1 N α i y i x i b = A v g ( y i − ∑ j = 1 N α j y j ( x j T ⋅ x i ) ) g = wx+b,其中\\ w = \sum_{i=1}^N \alpha_i y_i x_i \\ b = Avg(y_i - \sum_{j=1}^N\alpha_j y_j(x_j^T \cdot x_i)) g=wx+b,其中w=i=1Nαiyixib=Avg(yij=1Nαjyj(xjTxi))
忽略掉 α i = 0 \alpha_i = 0 αi=0的项,可以看到模型是由所有 α i > 0 \alpha_i > 0 αi>0 样本来共同表示,也就是 α i > 0 \alpha_i >0 αi>0的样本构成了最终的判别函数,因此称 α i > 0 \alpha_i > 0 αi>0的样本为支持向量。
几何意义:支持向量是落在支持面上及支持面错误一侧的样本
在这里插入图片描述

支持向量是我们所需要关注的样本,它们都是模型决策较为模糊、错误的样本。

由于模型的w,b实际只由支持向量构成,这就是为什么把模型称为"支持向量机SVM"的原因

代码

from sklearn import svm
import numpy as np

# ----生成样本数据与构建SVM模型-----------
X = np.array( [[0.708333,1],[0.291667,1],[0.217,1.5],[0.2367,0.3],[0.454,1]
               ,[0.583333,-4],[0.875,-1],[0.333,-0.6],[0.111,-1]] )
y = np.array([1,1,1,1,1,-1,-1,-1,-1])
clf = svm.SVC(kernel ='linear',C=1000)             # 初始SVM模型,这里C设为很大,也就成为了硬间隔
clf.fit(X,y)                                       # 用X,y训练模型

# -----------------打印模型系数------------
print('\n---------支持向量与alpha--------')        # 打印模型求解结果
print('support_vectors:\n',clf.support_vectors_)  # 打印支持向量
print('alpha:\n'  ,clf.dual_coef_[0])             # 打印支持向量系数

print("\n----------模型系数---------") 
w = clf.coef_                                     # 提取模型系数w,它等于clf.dual_coef_[0]@clf.support_vectors_
b = -clf._intercept_                              # 提取模型系数b
print('w:',w)                                     # 打印模型系数w
print('b:',b)                                     # 打印模型阈值b

 # ---画出分割面与支持面-----------------
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (9, 5)           # 设置figure_size尺寸
plt.scatter(X[:, 0], X[:, 1],c=y,marker='o')      # 画出样本点  
line_x = np.array([X[:,0].min(),X[:,0].max()])    # 判别面的x坐标
line_y = (-b-w[0,0]*line_x)/w[0,1]                # 判别面的y坐标
plt.plot(line_x,line_y)                           # 画出判别面
line_u = (-b+1-w[0,0]*line_x)/w[0,1]              # 上支持面的y坐标
line_b = (-b-1-w[0,0]*line_x)/w[0,1]              # 下支持面的y坐标
plt.plot(line_x,line_u,color='grey')              # 画出上支持面
plt.plot(line_x,line_b,color='grey')              # 画出下支持面


#在代码中,我们将松驰惩罚系数C设得非常大(C=1000),相当于使用了硬间隔模型

---------支持向量与alpha--------
support_vectors:
[[ 0.333 -0.6 ]
[ 0.2367 0.3 ]]
alpha:
[-2.44118665 2.44118665]
----------模型系数---------
w: [[-0.23508627 2.19706799]]
b: [0.39652452]

在这里插入图片描述

参考

老饼讲解

CSDN博客

代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东笔试题

和谐敏感词 🔗 题目地址 🎉 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…

Mapbox GL 加载GeoServer底图服务器的WMS source

貌似加载有点慢啊!! 1 这是底图 2 这是加载geoserver中的地图效果 3源码 3.1 geoserver中的网络请求 http://192.168.10.10:8080/geoserver/ne/wms?SERVICEWMS&VERSION1.1.1&REQUESTGetMap&formatimage/png&TRANSPARENTtrue&STYL…

Linux--epoll(ET)实现Reactor模式

Linux–多路转接之epoll Reactor反应堆模式 Reactor反应堆模式是一种事件驱动的设计模式,通常用于处理高并发的I/O操作,尤其是在服务器或网络编程中。 基本概念 Reactor模式又称之为响应器模式,基于事件多路复用机制,使得单个…

网络与信息安全工程师最新报考介绍(工信部教育与考试中心)

文章目录 前言 网络与信息安全工程师职业介绍主要的工作内容职业技能要求网络与信息安全工程师职业前景怎么样网络与信息安全工程师工作方向网络与信息安全工程师适学人群 如何入门学习网络安全 【----帮助网安学习,以下所有学习资料文末免费领取!----】…

solidworks(sw)右侧资源栏变成英文,无法点击

sw右侧资源栏变成英文,无法点击,如图 使用xxclean 的扩展功能 SW右侧栏是英文 toolbox配置无效 这个按钮 修复完成之后重新打开软件查看是否变成中文。

[linux]快速入门

学习目标 通过学习能够掌握以下的linux操作 操作系统 按照应用领域的不同, 操作系统可以分为几类 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 不同领域的主流操作系统 桌面操作系统 Windows(用户数量最多)MacOS(操作体验好,办公人士首选)Linux…

Spring AI : Java写人工智能(LLM)的应用框架

Spring AI:为Java开发者提供高效集成大模型能力的框架 当前Java调用大模型时,面临缺乏优质AI应用框架的挑战。Spring作为资深的Java应用框架提供者,通过推出Spring AI来解决这一问题。它借鉴了langchain的核心理念,并结合了Java面…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用?二、为什么 Redis 要使用 IO 多路复用?三、Redis 如何实现 IO 多路复用?四、IO 多路复用的核心机制:epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

安装buildkit,并使用buildkit构建containerd镜像

背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

windows文件拷贝给wsl2的Ubuntu

参考: windows文件如何直接拖拽到wsl中_win 移到文件到wsl-CSDN博客 cp -r /mnt/盘名/目标文件 要复制到wsl中的位置e.g.cp -r /mnt/d/byt5 /home Linux文件复制、移动、删除等操作命令_linux移动命令-CSDN博客 Linux 文件、文件夹的复制、移动、删除 - Be-myse…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时,使用latest作为tag取到的并非最新版本,本文尝试用实际最新版本的版本号进行pull,从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台如何接入多样化设备

在实际的工程项目里,我们常常会面临这样的情况:项目管理者可能会决定使用多个品牌的视频监控摄像头,或者有需求将现有的、多种类型的监控系统进行整合。现在,让我们来探讨一下如何实现不同品牌摄像头的连接和使用。 1、GB/T281协议…

2024版最新148款CTF工具整理大全(附下载安装包)含基础环境、Web 安全、加密解密、密码爆破、文件、隐写、逆向、PWN

经常会有大学生粉丝朋友私信小强,想通过打CTF比赛镀金,作为进入一线互联网大厂的门票。 但是在CTF做题很多的时候都会用到工具,所以在全网苦寻CTF比赛工具安装包! 关于我 有不少阅读过我文章的伙伴都知道,我曾就职于…

SSM框架实战小项目:打造高效用户管理系统 day3

前言 在前两篇博客中,后台已经搭建完毕,现在需要设计一下前端页面 webapp下的项目结构图 创建ftl文件夹,导入css和js 因为我们在后台的视图解析器中,设置了页面解析器,跳转路径为/ftl/*.ftl,所以需要ftl文件…

JAVA开源项目 网上订餐系统 计算机毕业设计

本文项目编号 T 018 ,文末自助获取源码 \color{red}{T018,文末自助获取源码} T018,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

Pycharm通过ssh远程docker容器搭建开发环境

本地pycharm通过ssh方式远程连接服务器(Ubuntu)上的docker容器,搭建开发环境。实现功能:将环境依赖打包成docker镜像,并在远程服务器中启动容器(启动时做好端口映射和文件夹挂载),通…

负载箱的作用?

负载箱,顾名思义,就是用来承载电力设备的箱子。在电力系统中,负载箱的作用非常重要,它不仅可以模拟实际的电力负载,还可以对电力设备进行测试和调试,确保其正常运行。下面详细介绍负载箱的作用。 1. 模拟实…

15分钟学Go 第7天:控制结构 - 条件语句

第7天:控制结构 - 条件语句 在Go语言中,控制结构是程序逻辑的重要组成部分。通过条件语句,我们可以根据不同的条件采取不同的行动。今天我们将详细探讨Go语言中的两种主要条件结构:if语句和switch语句。理解这些控制结构对于编写…

复写零--双指针

一&#xff1a;题目描述 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理分析 三&#xff1a;代码编写 void duplicateZeros3(vector<int>& arr) {int dest -1, cur 0, n arr.size();//1.找到要复写的最后一个数字while …