【OpenCV-Python】教程:7-5 理解SVM

news2025/1/11 0:39:08

OpenCV Python SVM 学习

【目标】

  • 直观理解 SVM

【理论】

线性可分

下图有两种类型的数据,红色和蓝色。在kNN中,对于一个测试数据,我们用来测量它与所有训练样本的距离,并取距离最小的一个。测量所有的距离需要大量的时间,存储所有的训练样本需要大量的内存。但是考虑到图像中给出的数据,我们需要那么多吗?

在这里插入图片描述

考虑另一个想法。我们找到一条直线, f ( x ) = a x 1 + b x 2 + c f(x)=ax_1+bx_2+c f(x)=ax1+bx2+c,它将两个数据分为两个区域。当我们得到一个新的test_data X X X时,只需将它代入 f ( X ) f(X) f(X)。如果 f ( X ) > 0 f(X)>0 f(X)>0,它属于蓝色组,否则它属于红色组。我们可以称这条线为决策边界。这是非常简单、高效和节省内存的。这种可以用一条直线(或高维的超平面)分为两部分的数据称为线性可分数据。

所以在上图中,你可以看到有可能会有很多这样的线,我们到底选哪一个呢?直观地说,这条线应该离所有点越远越好。为什么?因为输入的数据中可能会有噪声。该数据不应影响分类精度。所以选择一条最远的线可以增强对噪音的免疫力。所以SVM所做的是找到一条与训练样本距离最小的直线(或超平面)。请看下图中穿过中心的粗体线。

在这里插入图片描述

为了找到这个决策边界,你需要训练数据。你都需要吗?不。只需要那些靠近相反类别的数据就足够了。在我们的图像中,它们是一个蓝色圆和两个红色方块。我们可以称它们为支持向量,穿过它们的直线称为支持平面。它们足以找到我们的决策边界。我们不需要担心所有的数据。它有助于减少数据。

结果是,找到了最能代表数据的前两个超平面。例如,蓝色数据用 w T x + b 0 > 1 w^Tx+b_0>1 wTx+b0>1表示,红色数据用 w T x + b 0 < − 1 w^Tx+b_0<−1 wTx+b0<1表示,其中 w w w为权重向量 ( w = [ w 1 , w 2 , … , w n ] ) (w=[w_1,w_2,…,w_n]) (w=[w1,w2wn]) x x x为特征向量 ( x = [ x 1 , x 2 , … , x n ] ) (x=[x_1,x_2,…,x_n]) (x=[x1,x2xn]) b 0 b_0 b0是偏置。权重向量决定决策边界的方向,偏置点决定决策边界的位置。现在决策边界被定义在这些超平面的中间,因此表示为 w T x + b 0 = 0 w^Tx+b_0=0 wTx+b0=0。支持向量到决策边界的最小距离为, d i s t a n c e s u p p o r t v e c t o r s = 1 ∣ ∣ w ∣ ∣ distance_{supportvectors}= \frac{1}{||w||} distancesupportvectors=∣∣w∣∣1。边距是这个距离的两倍。我们需要最大化这个边距(类别的边距,Margin)。即,我们需要最小化一个新函数 L ( w , b 0 ) L(w,b_0) L(w,b0),具有一些约束条件,可以表示为:

min ⁡   L ( w , b 0 ) = 1 2 ∣ ∣ w ∣ ∣   subject to    t i ( w T x + b 0 ) ≥ 1 ∀ i \min \, L(w,b_0)= \frac{1}{2}||w|| \, \text{subject to } \, t_i (w^Tx+b_0)≥1 \quad \forall i minL(w,b0)=21∣∣w∣∣subject to ti(wTx+b0)1i

其中:
t i t_i ti是类别标签,$t_i \in [-1, 1] $

线性不可分

假设有一些数据不能用一条直线将他们分成两部分。假如:-3,3 属于类别X, -1,1属于类别O,很明显,他们不能线性可分,但是也有一些方法可以解决这些问题,我们可以通过方程 f ( x ) = x 2 f(x)=x^2 f(x)=x2将数据映射,这样,9 分为X1 分为 O,就变成可分的了。

我们可以将一维数据转换为二维数据。我们可以用 f ( x ) = ( x , x 2 ) f(x)=(x,x^2) f(x)=(x,x2)函数来映射这个数据。然后X变成(-3,9)(3,9),而O变成(-1,1)(1,1)。这也是线性可分的。简而言之,低维空间中的非线性可分数据在高维空间中变为线性可分的可能性更大。

一般来说,可以将d维空间中的点映射到某个D维空间(D>d)来检验线性可分性的可能性。有一种思想可以通过在低维输入(特征)空间中进行计算来帮助计算高维(核)空间中的点积。我们可以用下面的例子来说明。

假设在二维空间里有两个点 p = ( p 1 , p 2 ) p=(p_1,p_2) p=(p1,p2) q = ( q 1 , q 2 ) q=(q_1,q_2) q=(q1,q2),设 ϕ \phi ϕ 为 映射函数,将二维数据映射到三维空间里,则有:

ϕ ( p ) = ( p 1 2 , p 2 2 , 2 p 1 p 2 ) \phi (p)=(p_1^2, p_2^2,\sqrt{2}p_1p_2) ϕ(p)=(p12,p22,2 p1p2)

ϕ ( q ) = ( q 1 2 , q 2 2 , 2 q 1 q 2 ) \phi (q)=(q_1^2, q_2^2,\sqrt{2}q_1q_2) ϕ(q)=(q12,q22,2 q1q2)

我们定义一个核函数 K ( p , q ) K(p,q) K(p,q)可以计算两点的点积。

K ( p , q ) = ϕ ( p ) ⋅ ϕ ( q ) = ϕ ( p ) T ϕ ( q ) = ( p 1 2 , p 2 2 , 2 p 1 p 2 ) ⋅ ( q 1 2 , q 2 2 , 2 q 1 q 2 ) = p 1 2 q 1 2 + p 2 2 q 2 2 + 2 p 1 q 1 p 2 q 2 = ( p 1 q 1 + p 2 q 2 ) 2 K(p,q)=\phi(p) \cdot \phi(q) = \phi(p)^T \phi(q) \\ =(p_1^2, p_2^2,\sqrt{2}p_1p_2) \cdot (q_1^2, q_2^2,\sqrt{2}q_1q_2) \\ = p_1^2q_1^2+p_2^2q_2^2+2p_1q_1p_2q_2 \\ = (p_1q_1+p_2q_2)^2 K(p,q)=ϕ(p)ϕ(q)=ϕ(p)Tϕ(q)=(p12,p22,2 p1p2)(q12,q22,2 q1q2)=p12q12+p22q22+2p1q1p2q2=(p1q1+p2q2)2

ϕ ( p ) ⋅ ϕ ( q ) = ( p ⋅ q ) 2 \phi(p) \cdot \phi(q) = (p \cdot q)^2 ϕ(p)ϕ(q)=(pq)2

这意味着,三维空间中的点积可以用二维空间中的平方点积来实现。这可以应用到高维空间。所以我们可以用低维来计算高维特征。一旦我们把它们映射出来,我们就得到了一个高维空间。

除了这些概念之外,还有错误分类的问题。因此,仅仅找到具有最大Margin的决策边界是不够的。我们还需要考虑分类错误的问题。有时,可能会找到一个边际较小,但错误分类较少的决策边界。无论如何,我们需要修改我们的模型,使其能够找到最大边际的决策边界,但错误分类较少。最小化准则修改为:

min ⁡ ∣ ∣ w ∣ ∣ 2 + C ( distance of misclassified samples to their correct regions ) \min ||w||^2+C(\text{distance of misclassified samples to their correct regions}) min∣∣w2+C(distance of misclassified samples to their correct regions)

下图显示了这个概念。为每个训练数据样本定义一个新的参数 ξ i ξ_i ξi 。它是对应的训练样本到正确决策区域的距离。对于那些没有被错误分类的,它们落在相应的支撑平面上,所以它们的距离为零。

在这里插入图片描述

所以新的优化问题是:

min ⁡   L ( w , b 0 ) = ∣ ∣ w ∣ ∣ 2 + C ∑ i ξ i   subject to   y i ( w T x i + b 0 ) ≥ 1 − ξ i   a n d   ξ i > 0   ∀ i \min \,L(w,b_0)=||w||^2+C\sum_i \xi_i \, \text{subject to} \, y_i(w^Tx_i+b_0)≥ 1-\xi_i \, and \: \xi_i>0 \, \forall i minL(w,b0)=∣∣w2+Ciξisubject toyi(wTxi+b0)1ξiandξi>0i

参数 C C C应该如何选择?很明显,这个问题的答案取决于训练数据的分布方式。虽然没有普遍的答案,但考虑以下规则是有用的:

  • 较大的 C C C值给出的解错误分类错误较小,但边际较小。考虑到在这种情况下,错误分类的代价是昂贵的。由于优化的目的是使参数最小,因此不允许出现很少的误分类错误。
  • C C C值越小,解的余量越大,分类误差越大。在这种情况下,最小化没有考虑那么多的和项,所以它更专注于找到一个有大Margin的超平面。

【参考】

  1. OpenCV: Understanding SVM
  2. NPTEL notes on Statistical Pattern Recognition, Chapters 25-29.

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

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

相关文章

计算距离春节还有多长时间

你知道距离春节&#xff0c;还剩下多少时间吗&#xff1f; 或许你已经在默默心算了。 可是&#xff0c;如果我想要精确一点的结果&#xff0c;比如精确到多少分钟、多少秒呢&#xff1f; 要怎么计算呢&#xff1f; 这里可以使用Python进行计算。 首先&#xff0c;需要导入…

Opencv项目实战:18 人体姿态检测

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码讲解与介绍 Basics.py PoseModule.py Example.py 人体姿态图​编辑 4、项目资源 5、项目总结 0、项目介绍 mediapipe中有人体姿态检测的功能&#xff0c;今天我们就将实现最最基础的人体姿态估计项目&#xff0c;它…

【C++】深拷贝和浅拷贝

目录 浅拷贝 深拷贝 字符串的构造 例有两个类的深拷贝&#xff1a; 浅拷贝 在类中&#xff0c;若我们不写拷贝构造函数&#xff0c;则程序会提供一个默认的拷贝构造函数&#xff0c;该函数为浅拷贝。 //默认拷贝构造 ---浅拷贝--值复制 类名(const 类名& 形参名) {成…

【实时数仓】DWS层之商品主题计算、地区主题表(FlinkSQL)

文章目录一 DWS层-商品主题计算1 把JSON字符串数据流转换为统一数据对象的数据流&#xff08;1&#xff09;转换订单宽表流数据&#xff08;2&#xff09;转换支付宽表流数据2 把统一的数据结构流合并为一个流&#xff08;1&#xff09;代码&#xff08;2&#xff09;测试3 设定…

216. 组合总和 III

216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是&#xff0c;通过激光测距仪进行斜距测量&#xff0c;与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值&#xff08;如…

编译原理——正规式、NFA构造DFA

一、DFA和NFA的区别 NFA&#xff1a;非确定有限自动机 DFA&#xff1a;确定有限自动机 NFA在同一状态&#xff0c;可以有多条出边&#xff0c;DFA在同一状态&#xff0c;只能有一条出边&#xff1b; NFA的初态可以具有多个&#xff0c;DFA的初态是唯一的&#xff1b; 比如这个…

数据结构入门——栈和队列详解

栈和队列详解1 栈1.1 栈的概念及结构1.2 栈的实现1.3 支持动态增长的栈1.3.1 结构声明1.3.2 栈的初始化和销毁1.3.3 入栈和出栈操作1.3.4 栈的判空和元素个数2 队列2.1 队列的概念及结构2.2 队列的实现2.3 链表实现队列2.3.1 结构声明2.3.2 队列的初始化和销毁2.3.3 队列入队和…

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路&#xff1a;跟回退一样的思路一样&#xff0c;直接从当前节点跳到结束节点&#xff08;EndEvent&#xff09; /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

Tomcat学习

文章目录1、Tomcat是什么&#xff1f;2、Tomcat安装部署java环境部署tomcat目录结构介绍webapps目录bin目录tomcat启停方式3、Tomcat配置文件tomcat-users.xmlserver.xml结构组件详情配置文件注释4、Tomcat端口5、JVM调优6、Tomcat启动慢解决7、Tomcat面试题目1.Tomcat的默认端…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、问题描述 首次用vscode运行vue项目时&#xff0c;报错&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 二、解决 我的解决过程&#xff1a;检查是否安装node.js环境 已安装node 这样一来&#xff0c;真不知道怎么回事了。环境也没有…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

数据结构与算法java实战篇--高级排序

目录 一.希尔排序 二.划分 三.快速排序 1. 快速排序的算法 2.选择枢纽 一.希尔排序 希尔排序是基于插入排序的算法来实现的&#xff0c;不同的是希尔排序是采用n-增量来实现排序&#xff0c;如下是希尔排序的图解&#xff1a; 希尔排序会先以n个增量对元素进行划分&#xf…

原神私服 grasscutter搭建及食用教程 v3.3

本教程搭建过程食用vmware虚拟机服务端搭建过程及其简单。照着教程操作即可。本次对应的版本是3.3的版本&#xff0c;后期会持续更新。 一.资源下载准备&#xff1a; 1.vmwera16虚拟机下载安装自己百度吧&#xff0c;非常简单。一路next安装完后再输入一个百度来的秘钥即可。…

【kafka】学习笔记(二)

学习笔记五、Kafka Broker5.1、在zookeeper的服务端存储的Kafka相关信息5.2、Kafka Broker 总体工作流程5.3、Kafka Broker 节点服役和退役5.3.1、节点服役5.3.2、节点退役5.4、Kafka Broker 副本5.4.1、副本信息5.4.3、Leader 选举流程5.4.3、 Leader 和 Follower 故障处理细节…

【OpenCV-Python】教程:7-6 SVM识别手写字符

OpenCV Python SVM 识别手写字符 【目标】 用 SVM 识别手写字符 【代码】 在kNN中&#xff0c;直接用的是像素亮度值&#xff0c;这次&#xff0c;我们将使用 Histogram of Oriented Gradients (HOG) 作为特征向量 import cv2 import numpy as npSZ 20 bin_n 16 # Numbe…

Python pandas有几千个库函数,你用过几个?(5)

上一篇链接&#xff1a; Python pandas有几千个库函数&#xff0c;你用过几个&#xff1f;&#xff08;4&#xff09;_Hann Yang的博客-CSDN博客 12个pandas子模块又包含310个库函数&#xff08;含类、方法、子模块&#xff09;&#xff1a; import pandas as pd funcs [_ …

【C与数据结构】——寒假提高每日练习Day1

一共16日的练习&#xff0c;分为选择题与编程题&#xff0c;涵盖了C语言所学以及数据结构的重点&#xff0c;以及一些秋招、春招面试的高频考点&#xff0c;难度会随着天数而上升。 &#xff08;建议在电脑客户端进行&#xff0c;将鼠标选中被遮挡的地方&#xff0c;即可看到解…

aws codepipeline创建跨账户的cicd

参考资料 Building a Cross-account CI/CD Pipeline Create a pipeline in CodePipeline that uses resources from another AWS account 通常来说&#xff0c;我们会将代码和pipeline配置不同的账户中&#xff0c;在codepipeline的source阶段指定为另一个账号的codecommit仓…

将扩散模型应用到文本领域

前言 扩散模型在文生图领域可谓是大显身手&#xff0c;效果棒棒&#xff5e; 每当一个idea有效之时&#xff0c;便会有更多相关的研究跟进尝试&#xff0c;今天就给大家介绍一篇将扩散模型应用到文本生成领域的工作&#xff0c;这也是一篇比较新的paper&#xff0c;其中还用到了…