SVM(支持向量机)

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博客

代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于neo4j的新冠治疗和新冠患者轨迹的知识图谱问答系统

毕业设计还在苦恼选题?想做一个兼具前沿性和实用性的技术项目?了解下这款基于Neo4j的新冠治疗和患者轨迹的知识图谱问答系统吧! 系统可以实现两大功能模块:新冠医疗信息和患者活动轨迹的展示与问答。通过图谱技术,你可…

VBA技术资料MF219:创建一个新的类型模块

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

【方波转正弦波谐波二阶】2022-6-10

缘由怎么用555时基电路将方波转换为正弦波?-其他-CSDN问答 可参带通滤波器电路图大全(三款带通滤波器电路设计原理图详解) - 全文 - 应用电子电路 - 电子发烧友网

《关于构图问题》

这是一本讲绘画技巧的书,但仔细琢磨体现出不易察觉的东方哲学思想。中国画讲究意境与留白,留白不代表“空”,而是代表对“实”的延伸,留下瞎想空间,实现对“有限(实)”的超越。 总论 文艺是人们…

演员王丹妮化身岛屿姐姐 开启少年们的欢乐挑战之旅

全民海岛真人秀《岛屿少年》正在持续热播中,少年们迎来了“茶嵛饭后”⻩⻥馆的开业日,知名演员王丹妮以岛屿姐姐的身份,悄然降临此地,为岛屿少年们带来了一场别开生面的考验。 在餐厅正式开业前夕,王丹妮巧妙地伪装成普…

【Spark+Hive大数据】基于spark抖音数据分析预测舆情系统(完整系统源码+数据库+开发笔记+详细部署教程)✅

目录 【SparkHive大数据】基于spark抖音数据分析预测舆情系统(完整系统源码数据库开发笔记详细部署教程)✅ 一、项目背景 二、研究目的 三、项目意义 四、项目功能 五、项目创新点​​​​​​​ 六、算法介绍 七、项目展示 八、启动文档 九、…

Android Kotlin中协程详解

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家, 👉点击跳转到教程 前言 Kotlin协程介绍: Kotlin 协程是 Kotlin 语言中的一种用于处理异步编程的机制。它提供了一…

Chromium127调试指南 Windows篇 - 安装C++扩展与配置(五)

前言 在前面的文章中,我们已经安装了Visual Studio Code(VS Code)并配置了基本的扩展。现在,我们将进一步优化我们的开发环境,重点关注C相关的依赖扩展。这些扩展对于在VS Code中高效开发和调试Chromium项目至关重要。…

如何在 Linux 中对 USB 驱动器进行分区

如何在 Linux 中对 USB 驱动器进行分区 一、说明 为了在 Linux 上访问 USB 驱动器,它需要有一个或多个分区。由于 USB 驱动器通常相对较小,仅用于临时存储或轻松传输文件,因此绝大多数用户会选择只配置一个跨越整个 USB 磁盘的分区。但是&a…

基于Django+python的车牌识别系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

Unity C#脚本的热更新

以下内容是根据Unity 2020.1.0f1版本进行编写的   目前游戏开发厂商主流还是使用lua框架来进行热更,如xlua,tolua等,也有的小游戏是直接整包更新,这种小游戏的包体很小,代码是用C#写的;还有的游戏就是通过…

【mysql进阶】4-5. InnoDB 内存结构

InnoDB 内存结构 1 InnoDB存储引擎中内存结构的主要组成部分有哪些? 🔍 分析过程 从官⽹给出的InnoDB架构图中可以找到答案 InnoDB存储引擎架构链接:https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html ✅ 解答问题 InnoD…

ECharts饼图-富文本标签,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个饼图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供详…

虚拟光驱软件 PowerISO v8.7.0 中文激活版

PowerISO 是一款虚拟光驱工具及强大的光盘映像文件制作工具。支持创建、编辑、提取、压缩、加密和转换ISO/BIN图像文件。同时自带DISM工具,支持ESD/ISO/WIM/ESD格式转换,制作镜像文件制作U盘启动,支持ISO/BIN/IMG/DAA/WIM等各种常见文件类型。…

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案

【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案 当使用Jellyfin播放视频时出现“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”,这是与硬件解码和ffmpeg设置有关系,具体…

机器学习新领域:联邦学习方法——分布式机器学习

联邦学习是一种分布式机器学习方法,旨在保护数据隐私并提高模型的训练效率。以下是对联邦学习的详细介绍,包括其基本概念、应用场景以及面临的挑战。 一、介绍 1. 基本概念 联邦学习的核心思想是将模型训练过程分散到多个数据源上,而不需要…

生产级AI智能体开发实践【旅行规划】

在我最近的博客文章《使用 LangChain 代理创建多模式聊天机器人的开发人员指南》中,讨论了 AI 代理的作用,并演示了使用 LangChain 框架的实现。虽然它适用于概念验证 (POC),但它不适合生产环境。 在这篇文章中,我将提供一种更适…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.C++11(1)

1. 自动类型推导 (auto) C11 引入了 auto 关键字&#xff0c;可以根据初始值的类型自动推导变量的类型&#xff0c;从而减少了手动声明类型的繁琐。例如&#xff1a; std::vector<int> vec {1, 2, 3, 4}; auto it vec.begin(); // 自动推导类型为 std::vector<in…

C语言程序设计:现代设计方法习题笔记《chapter5》下篇

第七题 题目分析&#xff1a;求最大最小值转换为条件判断问题&#xff0c;最大值有四种可能&#xff0c;最小值相应有三种情况&#xff0c;给出下列代码。 示例代码&#xff1a; #include <stdio.h>int main() {int num1, num2, num3, num4; // 定义四个变量来存储输入…

【项目实战】HuggingFace教程,初步实战,使用HF做一些小型任务

Huggingface教程 一、前期准备工作二、学习pipline2.1.试运行代码&#xff0c;使用HuggingFace下载模型2.2. 例子1&#xff0c;情感检测分析(只有积极和消极两个状态)2.3. 例子2&#xff0c;文本生成 三、学会使用Tokenizer & Model3.1.tokenizer&#xff08;分词器&#x…