当前位置: 首页 > news >正文

支持向量机算法(一):像讲故事一样讲明白它的原理及实现奥秘

1、支持向量机算法介绍

支持向量机(Support Vector Machine,SVM)是一种基于统计学习理论的模式识别方法, 属于有监督学习模型,主要用于解决数据分类问题。SVM将每个样本数据表示为空间中的点,使不同类别的样本点尽可能明显地区分开。通过将样本的向量映射到高维空间中,寻找最优区分两类数据的超平面,使各分类到超平面的距离最大化,距离越大表示SVM的分类误差越小。通常SVM用于二元分类问题,对于多元分类可将其分解为多个二元分类问题,再进行分类,主要的应用场景有图像分类、文本分类、面部识别、垃圾邮件检测等领域。

☀关于支持向量机的理解,有3个问题,请进一步解释。

☀(1)空间中的点,这个空间是什么?

在支持向量机(SVM)的语境中,这个“空间”是特征空间。假设我们有一个数据集,每个样本有多个特征。例如,在一个简单的二维数据集(如判断一个水果是苹果还是橙子),我们可能有两个特征:水果的大小和颜色深浅。如果把水果的大小作为x轴,颜色深浅作为y轴,那么每个水果样本就可以用这个二维平面(空间)中的一个点来表示。
当有更多的特征时,比如再加上水果的甜度、硬度等特征,这个空间就会变成三维、四维甚至更高维度。这个空间的维度取决于数据集中样本的特征数量。一般来说,空间中的每个维度对应着一个特征,这样就可以通过这些维度来定位样本在这个空间中的位置,也就是用空间中的点来表示样本数据。

☀(2)怎么将样本的向量映射到高维空间中,高维空间是什么?

①高维空间的概念:高维空间是相对于我们日常所熟悉的二维或三维空间而言的。在SVM中,高维空间是一个数学抽象概念。以一个简单的例子来说明,如果我们在二维平面中有一些线性不可分的数据,比如一个圆内的点属于一类,圆外的点属于另一类。在二维空间中,很难找到一个直线(超平面)来划分这两类数据。但是如果我们把这些数据映射到三维空间,通过一个合适的函数(比如),在三维空间中这些数据可能就变得线性可分了。高维空间就是具有更多维度的空间,其维度数量取决于我们使用的映射函数和数据的特性。
②映射方法:通常使用核函数(Kernel Function)来将样本向量映射到高维空间。常见的核函数有线性核函数、多项式核函数、高斯径向基核函数(RBF)等。对于线性核函数,它在一定程度上可以看作是一种简单的映射,在某些线性可分的数据情况下可以很好地工作。而对于高斯径向基核函数,它能够将数据映射到一个无穷维的空间。这个函数通过计算两个样本点之间的距离,将其转换为一个新的表示形式,从而实现了从低维空间到高维空间(这里是无穷维)的映射。

☀(3)什么是超平面,如何寻找 ?

超平面的概念:在二维空间中,超平面是一条直线,它可以将平面分成两个部分。例如,对于一个简单的二元分类问题,在平面上的直线就是一个超平面,直线一侧的点可以被归为一类,另一侧的点归为另一类。在三维空间中,超平面是一个平面,如。一般地,在维空间中,超平面是一个维的子空间。它的方程可以写成,其中是权重向量,是样本向量,是偏置项。
寻找超平面的方法:SVM的目标是找到一个最优的超平面,使得两类数据之间的间隔(Margin)最大化。这个间隔是指从超平面到最近的样本点(支持向量)的距离。通过求解一个优化问题来找到这个超平面。具体来说,我们要最小化,同时满足约束条件。这个优化问题可以通过一些优化算法,如序列最小优化(Sequential Minimal Optimization,SMO)算法来求解,从而得到最优的超平面。

2、支持向量机算法实现

支持向量机模型由简单到复杂分为以下三种:

线性可分支持向量机(Linear Support Vector Machine In Linearly Separable Case),有一些苹果和橙子,把它们的大小、颜色深浅当作特征,在二维平面上,能找到一条直线将苹果和橙子完全分开,每个水果都能精准归类,这就是线性可分,这条直线就是分类超平面,此为硬间隔最大化,这便是线性可分支持向量机的作用。

线性支持向量机(Linear Support Vector machine),有一堆水果,多数苹果和橙子能用一条直线大致分开,但有几个坏果混在对面堆里。这时引入松弛因子,允许少量分错,找到一条尽量分对多数水果的直线,实现软间隔最大化,得到的就是线性支持向量机,应对近似线性可分样本。

③非线性支持向量机(Non-Linear Support Vector Machine),看一群形状各异的云朵和飞鸟,在平面上画直线根本分不开。利用核技术,将它们 “变” 到高维空间,在那可能云朵聚一堆、飞鸟聚一堆,再用软间隔最大化找到个曲面分开它们,这就是非线性支持向量机,处理非线性可分样本。

在实际应用中很少有线性问题,支持向量机模型应用最多的是第三种模型。然而,复杂模型是简单模型的改进,而且通过核函数映射就能将低维的非线性问题转化为高维空间的线性问题。

(1)线性可分支持向量机

首先假设有两分类数据,如下图所示。

现在要找出一条最佳的分割线,将两类数据分隔开。对于线性可分两分类数据,支持向量机就是条直线,对于高维数据点就是一个超平面,下图所示的三条直线都可以将上图中的两类数据分开。 

除了a、b、c外还有无数条分割线,那么,在这些分割线中哪条是最完美的呢?目标是选择一条具有较强分类能力的直线,即较稳定的分类结果和较强的抗噪声能力。

假如在上图中又增加了一些数据,如下图所示。

由于新增了样本数据,相对于直线b而言,直线a与c对样本变化的适应性变差,使用直线a进行分类,标记的圆形点会被分到三角形中,使用直线c进行分类,标记的三角形点会被分到圆形中。 如何找到最优分类数据的分割线,使得具有最优的数据分类能力呢?这条分界线要尽可能地远离两类数据点,即数据集的边缘点到分界线的距离d最大,这里虚线穿过的边缘点就叫作支持向量,分类间隔2d,如下图所示。

(下图中,虚线共穿过了3个点,那么共有3个支持向量)

这里的数据点到超平面的距离就是间隔(margin),当间隔越大,这条分割线(分类器)也就越健壮,当有新的数据点的时候,使用这条分割线得到的分类结果也就越可信。

假设b为最优分割线,那么此分割线方程为: 

转化成向量形式:

只是在二维形式上的表示,如果扩展到n维,那么将变成:

 ①x代表样本的特征向量,n表示特征的数量,不同的应用场景下特征的数量和具体内容会有所不同。

②w代表权重向量,这些权重值反映了各个特征在分类决策中的重要程度。

③γ是偏置项,用于调整超平面的位置,使得超平面能够更好地对不同类别的样本进行分类。

可以将超平面方程写成更一般的表达形式: 

 本次线性可分支持向量机的内容已讲解完毕,下次继续支持向量机知识点的讲解。

相关文章:

支持向量机算法(一):像讲故事一样讲明白它的原理及实现奥秘

1、支持向量机算法介绍 支持向量机(Support Vector Machine,SVM)是一种基于统计学习理论的模式识别方法, 属于有监督学习模型,主要用于解决数据分类问题。SVM将每个样本数据表示为空间中的点,使不同类别的…...

力扣-数组-35 搜索插入位置

解析 时间复杂度要求,所以使用二分的思想,漏掉了很多问题,这里记录 在left-right1时,已经找到了插入位置,但是没有赋值,然后break,所以导致一直死循环。 if(right - left 1){result right;b…...

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素…...

HashMap和HashTable区别问题

并发:hashMap线程不安全,hashTable线程安全,底层在put操作的方法上加了synchronized 初始化:hashTable初始容量为11,hashmap初始容量为16 阔容因子:阔容因子都是0.75 扩容比例: 补充 hashMap…...

mysql -> 达梦数据迁移(mbp大小写问题兼容)

安装 注意后面初始化需要忽略大小写 初始化程序启动路径 F:\dmdbms\tool dbca.exe 创建表空间,用户,模式 管理工具启动路径 F:\dmdbms\tool manager.exe 创建表空间 创建用户 创建同名模式,指定模式拥有者TEST dts 工具数据迁移 mysql -&g…...

leetcode热门100题1-4

第一天 两数之和 //暴力枚举 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] nums[j] target) {return {i, j};}}}return {…...

作业:IO:day2

题目一 第一步&#xff1a;创建一个 struct Student 类型的数组 arr[3],初始化该数组中3个学生的属性 第二步&#xff1a;编写一个叫做save的函数&#xff0c;功能为 将数组arr中的3个学生的所有信息&#xff0c;保存到文件中去&#xff0c;使用fread实现fwrite 第三步&#xf…...

UVM: TLM机制

topic overview 不建议的方法&#xff1a;假如没有TLM TLM TLM 1.0 整个TLM机制下&#xff0c;底层逻辑离不开动作发起者和被动接受者这个底层的模型基础&#xff0c;但实际上&#xff0c;在验证环境中&#xff0c;任何一个组件&#xff0c;都有可能成为动作的发起者&#xff0…...

flink的EventTime和Watermark

时间机制 Flink中的时间机制主要用在判断是否触发时间窗口window的计算。 在Flink中有三种时间概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在数据抵达算子产生的时间&#xff08;Flink默认使用ProcessTime&#xff09; IngestionT…...

arcgis的合并、相交、融合、裁剪、联合、标识操作的区别和使用

1、相交 需要输入两个面要素&#xff0c;最终得到的是两个输入面要素相交部分的结果面要素。 2、合并 合并能将两个单独存放的两个要素类的内容&#xff0c;汇集到一个要素类里面。 3、融合 融合能将一个要素类内的所有元素融合成一个整体。 4、裁剪 裁剪需要输入两个面要…...

【Leetcode 热题 100】20. 有效的括号

问题背景 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s s s&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每…...

比较procfs 、 sysctl和Netlink

procfs 文件系统和 sysctl 的使用: procfs 文件系统(/proc) procfs 文件系统是 Linux 内核向用户空间暴露内核数据结构以及配置信息的一种方式。`procfs` 的挂载点是 /proc 目录,这个目录中的文件和目录呈现内核的运行状况和配置信息。通过读写这些文件,可以查看和控制内…...

Leetcode 3413. Maximum Coins From K Consecutive Bags

Leetcode 3413. Maximum Coins From K Consecutive Bags 1. 解题思路2. 代码实现 题目链接&#xff1a;3413. Maximum Coins From K Consecutive Bags 1. 解题思路 这一题的话思路上整体上就是一个遍历&#xff0c;显然&#xff0c;要获得最大的coin&#xff0c;其选取的范围…...

MakeFile使用指南

文章目录 1. MakeFile 的作用2. 背景知识说明2.1 程序的编译与链接2.2 常见代码的文档结构 3. MakeFile 的内容4. Makefile的基本语法5. 变量定义5.1 一般变量赋值语法5.2 自动化变量 6. 通配符 参考&#xff1a; Makefile教程&#xff1a;Makefile文件编写1天入门 Makefile由浅…...

矩阵碰一碰发视频的视频剪辑功能源码搭建,支持OEM

在短视频创作与传播领域&#xff0c;矩阵碰一碰发视频结合视频剪辑功能&#xff0c;为用户带来了高效且富有创意的内容产出方式。这一功能允许用户通过碰一碰 NFC 设备触发视频分享&#xff0c;并在分享前对视频进行个性化剪辑。以下将详细阐述该功能的源码搭建过程。 一、技术…...

VB.NET CRC32 校验

在 VB.NET 中实现 CRC32 校验并在校验失败时退出程序&#xff0c;你可以按照以下步骤进行&#xff1a; ‌实现 CRC32 计算函数‌&#xff1a;首先&#xff0c;你需要一个函数来计算给定数据的 CRC32 值。 ‌比较计算的 CRC32 值‌&#xff1a;然后&#xff0c;你需要将计算出的…...

冒充者综合征上线了

背景 今天干了一件蠢事儿&#xff0c;上周末咸鱼上有人拍了之前发布的一个java程序&#xff0c;基于 JWT 实现的一个五子棋游戏的源代码。想着反正又没事&#xff0c;就找到了移动硬盘拷贝出那个源代码上传网盘发货了。 今天买家找我说解压不了&#xff0c;我电脑解压正常。就…...

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…...

Redis相关面试

以下是一些在面试中关于 Redis 最常被问到的问题&#xff0c;涵盖了 Redis 的基础概念、数据结构、持久化、主从复制、哨兵、集群、应用场景以及常见的缓存问题等。可以根据自身实际项目经验&#xff0c;结合下面的要点进行深入讲解。 1. Redis 基础与特点 Redis 是什么&#x…...

使用强化学习训练神经网络玩俄罗斯方块

一、说明 在 2024 年暑假假期期间&#xff0c;Tim学习并应用了Q-Learning &#xff08;一种强化学习形式&#xff09;来训练神经网络玩简化版的俄罗斯方块游戏。在本文中&#xff0c;我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

SpringCloud优势

目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术点解析 第一轮&#xff1a;基础概念问题 请解释Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; 程序员JY回答&#xff1a;Spring框架的核心容器是IoC容器&#xff08;控制反转…...

Unity VR/MR开发-开发环境准备

视频讲解链接&#xff1a; 【XR马斯维】UnityVR/MR开发环境准备【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac

针对 shellcode 混淆(Shellcode Obfuscation) 的实战手段还有很多,如下表所示: 类型举例目的编码 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改变字节特征,避开静态签名或 YARA结构伪装PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起来像合法文件/数据,弱…...

CMake系统学习笔记

CMake系统学习笔记 基础操作 最基本的案例 // code #include <iostream>int main() {std::cout << "hello world " << std::endl;return 0; }// CMakeLists.txt cmake_minimum_required(VERSION 3.0)# 定义当前工程名称 project(demo)add_execu…...