【支持向量机(SVM)】:相关概念及API使用

文章目录

  • 1 SVM相关概念
    • 1.1 SVM引入
      • 1.1.1 SVM思想
      • 1.1.2 SVM分类
      • 1.1.3 线性可分、线性和非线性的区分
    • 1.2 SVM概念
    • 1.3 支持向量概念
    • 1.4 软间隔和硬间隔
    • 1.5 惩罚系数C
    • 1.6 核函数
  • 2 SVM API使用
    • 2.1 LinearSVC API 说明
    • 2.2 鸢尾花数据集案例
    • 2.3 惩罚参数C的影响

1 SVM相关概念

1.1 SVM引入

1.1.1 SVM思想

看一个故事,故事是这样子的:

在很久以前的情人节,一位大侠要去救他的爱人,但魔鬼需要大侠先攻克他设置的防线,于是和他玩了一个游戏game。

魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”
在这里插入图片描述

于是大侠这样放,干的不错?

在这里插入图片描述

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

在这里插入图片描述

大侠苦思冥想似乎记得学过SVM技术,于是就采用SVM试试。

这里的 SVM就试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。
在这里插入图片描述

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。
在这里插入图片描述
​ 在SVM 工具箱中有另一个更加重要的 trick(招式) 。 魔鬼看到大侠已经学会了前面一个trick,于是魔鬼给了大侠一个新的挑战。
在这里插入图片描述
​ 现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?当然又想起了放大招—SVM。像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠练就的轻功,大侠抓起一张纸,插到了两种球的中间。样本在二维空间线性不可分,二维空间总解决不掉,将样本映射到更高维的空间,需要采用核函数。

在这里插入图片描述

​ 现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。
在这里插入图片描述

最后,魔鬼被折服了

再之后,无聊的大人们,把这些球叫做 「data」 ,把棍子叫做 「classifier」 , 最大间隙trick 叫做 「optimization」 , 拍桌子叫做 「kernelling」 , 那张纸叫做 「hyperplane」。

概念:

  • 超平面:划分类别的边界
  • 类别之间的间隔:样本到超平面的距离
  • 支持向量:与超平面距离最近的向量(样本)
  • 核函数:将样本映射到更高维空间的函数

1.1.2 SVM分类

支持向量机的基本模型是定义在特征空间上的间隔最大的线性分类器。它是一种二分类的模型当采用了核技巧之后,支持向量机可以用于非线性分类。不同类型的支持向量机解决不同问题:

(1)线性可分支持向量机(硬间隔支持向量机):

当训练数据线性可分的时候,通过硬间隔最大化,学习得到一个线性可分支持向量机。在分类间隔中,没有划分错误的样本。

(2)线性支持向量机(软间隔支持向量机):

当训练数据近似线性可分时,通过软间隔最大化,学习一个线性支持向量机。在分类间隔中,允许一部分样本划分错误。

(3)非线性支持向量机:

当训练数据线性不可分的时候,通过使用核技巧以及软间隔最大化,学得一个非线性支持向量机。

1.1.3 线性可分、线性和非线性的区分

第一个图是线性可分,我们借助线性可分支持向量机完成分类。第二个图是不能完全线性可分,我们通过线性支持向量机解决。第三个图是完全线性不可分的,需要借助非线性支持向量机分类。

在这里插入图片描述
通过上述描述,我们抽象其中的蓝球和红球,并将两种颜色的球转化为二维平面上的点坐标,篮球映射为黑球,红球映射为白球。使用直线H1,H2和H3分类这两类颜色的球,图中的H1不能很好的区分黑球和白球,可以看到H2和H3都能很好的区分这两种颜色的球。

在这里插入图片描述

区分数据集:

  • H2和H3这样的直线一样可以区分两种颜色的球体有很多种条直线,虽然他们都能够很好的分类已经存在的黑球和白球,也就是我们之前讲到的训练集分类效果很好,训练误差为0。

  • 但是不能保证这些超平面在未知的实例上运行效果会很好,和上面魔鬼和大侠的例子一样,当魔鬼放置更多的黑球或白球的时候,我们提到的这些平面还能很好的让这些未知的球得到很好的分类吗?

  • 考虑泛化误差的影响。 根据在检验样本上的运行效果,分类器必须从这些分类超平面中选择一个来表示它的决策边界

  • 满足这个条件的很多,但是使得泛化误差最小的条件就是边际margin最大的情况。如左图的边际不及右边的边际margin大,我们选择右边的图作为边界最好的划分。因为 在有新的点出现的时候左边图的边际会错误分类一些点,而右侧就能很好的分类。
    在这里插入图片描述

1.2 SVM概念

SVM全称是supported vector machine(支持向量机),即寻找到一个超平面使样本分成两类,并且间隔最大。
在这里插入图片描述
超平面最大间隔
在这里插入图片描述

SVM学习的目的在于找到具有最大边缘的超平面。

原因:因为最大边缘超平面可以使得我们的训练误差很小的情况下,当有新数据的到来时也能使得测试误差达到最小。

1.3 支持向量概念

所有坐落在边际两边的超平面上的点被称作” 支持向量 (support vectors)"。

如下图,这两个特殊点是支撑我们构建最大边缘超平面的。这些点所在的边缘超平面上的点,称为支持向量。下图中红色的点对右图中的红色的直线或平面有支撑作用,这些点是关键点。而其点对最优超平面都没有影响。

在这里插入图片描述

1.4 软间隔和硬间隔

  • 硬间隔指的是让所有的样本都不在最大间隔之间,并位于正确的一边,这就是硬间隔。如果出现异常值、或者样本不能线性可分,此时硬间隔无法实现。
    在这里插入图片描述
    在这里插入图片描述
  • 软间隔指的是我们容忍一部分样本在最大间隔之内,甚至在错误的一边。相对来说,软间隔可以应用在一些线性不可分的场景。
    • 目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡。
    • 通过惩罚系数C来控制这个平衡:C值越小,则间隔越宽,但是间隔违例也会越多。
      在这里插入图片描述

1.5 惩罚系数C

在硬间隔的情况下,我们只考虑如何使得间隔达到最大。在软间隔的情况,我们即要考虑最大化间隔,也要考虑到那些限制间隔违例的样本带来的损失。

C越大说明, 违反限制间隔的样本点带来的损失就越大,就要减少这些样本的数量,所以间隔就要越小。

在这里插入图片描述

C越小说明, 违反限制间隔的样本点带来的损失就越小,可以适当增大间隔,以增加模型的泛化能力。

在这里插入图片描述

1.6 核函数

核函数将原始输入空间映射到新的特征空间,使得原本线性不可分的样本在核空间可分
在这里插入图片描述

2 SVM API使用

2.1 LinearSVC API 说明

class sklearn.svm.LinearSVC(C=1.0)

  • C:惩罚系数,类似于线性回归中的正则化系数

LinearSVC API的使用方式:

from sklearn.svm import LinearSVC
mysvc = LinearSVC(C=30)
mysvc.fit(X_standard, y)
print(mysvc.score(X_standard, y))

2.2 鸢尾花数据集案例

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from plot_util import plot_decision_boundary# 1.加载数据
X,y=load_iris(return_X_y=True)# print(y.shape)
# print(X.shape)# 选择前0和1类的前两个特征
x = X[y<2,:2  ]
# 选择 0和1类
y = y[y<2]
# print(y.shape)# 绘制原数据图像分布
plt.scatter(x[y==0,0],x[y==0,1],c='red')
plt.scatter(x[y==1,0],x[y==1,1],c='blue')
plt.show()# 2.数据的预处理
# 进行数据标准化
transform = StandardScaler()
x_tran=transform.fit_transform(x)# 3.模型训练
# 设置惩罚系数
model=LinearSVC(C=10)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)print(accuracy_score(y_pred,y))# 4.可视化
plot_decision_boundary(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()

鸢尾花数据展示
在这里插入图片描述
LinearSVC分类边界
在这里插入图片描述

2.3 惩罚参数C的影响

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from plot_util import plot_decision_boundary,plot_decision_boundary_svc# 1.加载数据
X,y=load_iris(return_X_y=True)# print(y.shape)
# print(X.shape)
x = X[y<2,:2]
y = y[y<2]
# print(y.shape)plt.scatter(x[y==0,0],x[y==0,1],c='red')
plt.scatter(x[y==1,0],x[y==1,1],c='blue')
plt.show()# 2.数据的预处理
transform = StandardScaler()
x_tran=transform.fit_transform(x)# 3.模型训练
model=LinearSVC(C=30)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)print(accuracy_score(y_pred,y))# 4.可视化
plot_decision_boundary_svc(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()# 3.模型训练
model=LinearSVC(C=0.01)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)print(accuracy_score(y_pred,y))# 4.可视化
plot_decision_boundary_svc(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()

C = 0.01
在这里插入图片描述
C = 10
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某校园网登录界面前端加密绕过

前言 尝试对学校校园网登录框进行爆破&#xff0c;发现密码在前端被加密了 Burp抓包 抓包信息 DDDDD2022***&upass3d5c84b6fb1dc75987884f39c05b0e6a123456782&R10&R21&para00&0MKKey123456&v6ip From表单提交上来的文本这些参数&#xff0c;DDDD是…

网络基础(3)https和加密

http其它的报头 直接看图片&#xff1a; 上图中的第一个和第二个类型之前已经使用过了也就不多做说明了&#xff0c;第三个报头类型使用的很少了。第四个报头类型主要就使用在一些灰度更新的应用上&#xff0c;确定用户使用的软件的版本不让其访问该版本不能访问的功能。下一个…

macOS 的目录结构

文章目录 根目录 (/)常见目录及其用途示例目录结构注意事项根目录 (/)主要目录及其含义其他目录总结 macOS 的目录结构无论是在 Intel 架构还是 ARM 架构的 Mac 电脑上都是相同的。macOS 的目录结构遵循 Unix 和 BSD 的传统&#xff0c;具有许多标准目录。以下是一些主要目录及…

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误&#xff1a; 这个特性是在Prism 8中引入的&#xff0c;如果你的应用目标是早期版本&#xff0c;则不适用。 1.2. 异常发生的原因&#xff1a; 开发者可能会遇到多种原因导致的异常&#xff0c;常见的错误包括…

集群聊天服务器(11)客户端开发

目录 首页面功能开发添加好友和聊天帮助和添加好友聊天功能创建群组添加群组群组聊天退出 测试问题一对一聊天第一次发送两个离线消息只收到一个创建和加入群组 首页面功能开发 #include "json.hpp" #include <iostream> #include <thread> #include &l…

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义

Pytest-Bdd-Playwright 系列教程&#xff08;10&#xff09;&#xff1a;配置功能文件路径 & 优化场景定义 前言一、功能文件路径的配置1.1 全局设置功能文件路径1.2. 在场景中覆盖路径 二、避免重复输入功能文件名2.1 使用方法2.2 functools.partial 的背景 三、应用场景总…

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作&#xff0c;每种操作的功能和区别是什么&#xff0c;本章将进行讲解&#xff0c;作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…

Leetcode 回文数

下面是解决这个回文数问题的一个Java解法&#xff1a; 代码解释 特殊情况处理&#xff1a; 如果数字是负数&#xff0c;直接返回false&#xff0c;因为负数不可能是回文数。如果数字以0结尾&#xff0c;但不是0本身&#xff0c;也不可能是回文数&#xff08;例如10不是回文数…

笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)

1. 基本信息 论文标题: 《Rethinking Local Perception in Lightweight Vision Transformer》中文标题: 《重新思考轻量化视觉Transformer中的局部感知》作者单位: 清华大学发表时间: 2023论文地址: https://arxiv.org/abs/2303.17803代码地址: https://github.com/qhfan/CloF…

JVM垃圾回收详解(重点)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&…

深入探索Python集合(Set)的高效应用:数据处理、性能优化与实际案例分析

文章目录 前言&#x1fa81;一、 定义集合1.1 使用大括号 {} 定义集合1.2 使用 set() 函数定义集合 &#x1fa81;二、添加元素2.1 使用 add() 方法2.2 使用 update() 方法 &#x1fa81;三、移除元素3.1 使用 remove() 方法3.2 使用 discard() 方法3.3 使用 pop() 方法3.4 使用…

STM32单片机CAN总线汽车线路通断检测-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…

Javaweb梳理17——HTMLCSS简介

Javaweb梳理17——HTML&CSS简介 17 HTML&CSS简介17.1 HTML介绍17.2 快速入门17.3 基础标签17.3 .1 标题标签17.3.2 hr标签17.3.3 字体标签17.3.4 换行17.3.8 案例17.3.9 图片、音频、视频标签17.3.10 超链接标签17.3.11 列表标签17.3.12 表格标签17.3.11 布局标签17.3.…

【支持向量机(SVM)】:算法原理及核函数

文章目录 1 SVM算法原理1.1 目标函数确定1.2 约束条件优化问题转换1.3 对偶问题转换1.4 确定超平面1.5 计算举例1.6 SVM原理小节 2 SVM核函数2.1 核函数的作用2.2 核函数分类2.3 高斯核函数2.3 高斯核函数API2.4 超参数 γ \gamma γ 1 SVM算法原理 1.1 目标函数确定 SVM思想…

mysql bin log分析

centos7 部署collabora office (yum版 与 docker)_collabora office部署-CSDN博客 1.下载polardb的bin log文件 show binary logs; mysqlbinlog -u 用户名 -p -h 地址 --read-from-remote-server --raw mysql-bin.001768 mysqlbinlog --no-defaults --databasexxx --base64-…

初识进程——Linux

目录 概述 进程控制块 指令知识补充 标识符函数 /proc 目录介绍 /proc/&#xff08;pid&#xff09; cwd exe&#xff1a; fork 结束语 概述 进程是程序执行的实体&#xff0c;两者之间有着密切联系。程序是静态的代码与指令集合&#xff0c;每次运行程序都会创建新的进程…

湘潭大学软件工程算法设计与分析考试复习笔记(三)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09; 前言 现在继续开始复习。每天复习一点点&#xff0c;嘿嘿。今天本来准备写一个动态规划的题的&#xff0c;感觉半懂不懂…

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…