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

embedded/2024/11/20 7:45:37/

文章目录

  • 1 SVM算法原理
    • 1.1 目标函数确定
    • 1.2 约束条件优化问题转换
    • 1.3 对偶问题转换
    • 1.4 确定超平面
    • 1.5 计算举例
    • 1.6 SVM原理小节
  • 2 SVM核函数

1 SVM算法原理

1.1 目标函数确定

SVM思想:要去求一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合
在这里插入图片描述
样本空间中任意点x到超平面(w,b)的距离可写成:
在这里插入图片描述
欲找到具有最大间隔的划分超平面,也就是要找到能满足下式中约束的参数w和b,使得间隔γ最大。
在这里插入图片描述

  • y为正例的时候取值为1,y为负例的时候取值为-1
    距离超平面最近的几个训练样本点使上式等号成立,他们被称为“支持向量”,两个异类支持向量到超平面的距离之和为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 约束条件优化问题转换

在这里插入图片描述

1.3 对偶问题转换

在这里插入图片描述
在这里插入图片描述

此时,求解当 α 是什么值时,该值会变得很大,当求出 α 值,再求解 w, b 值。此时,就变成了极大极小值问题。

1.4 确定超平面

在这里插入图片描述

1.5 计算举例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6 SVM原理小节

  1. 支持向量机公式推导最主要找到 w、b 的求解方法
  2. α 非0的样本为支持向量

2 SVM核函数

2.1 核函数的作用

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

2.2 核函数分类

当存在线性不可分的场景时,我们需要使用核函数来提高训练样本的维度、或者将训练样本投向高维
在这里插入图片描述

  1. 线性核:一般是不增加数据维度,而是预先计算内积,提高速度
  2. 多项式核:一般是通过增加多项式特征,提升数据维度,并计算内积
  3. 高斯核(RBF、径向基函数):一般是通过将样本投射到无限维空间,使得原来不可分的数据变得可分。高斯核函数使用的最多。

在这里插入图片描述
SVM 默认使用 RBF 核函数,将低维空间样本投射到高维空间,再寻找分割超平面。

2.3 高斯核函数

高斯核 Radial Basis Function Kernel (径向基函数,又称RBF核)
在这里插入图片描述

  • γ = 1 2 σ 2 \gamma=\frac {1}{2\sigma^2} γ=2σ21
  • γ \gamma γ是超参数,作用与标准差相反
  • γ \gamma γ越大,高斯分布越窄,数据越集中; γ \gamma γ越小,高斯分布越宽,数据越分散

在这里插入图片描述

2.3 高斯核函数API

from sklearn.svm import SVC
SVC(kernel="rbf",gamma=gamma)
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from plot_util import plot_decision_boundary# 获取数据
x,y=make_moons(noise=0.15)
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()# 构建函数
def RBFsvm(gamma=0.1):return Pipeline([('std_scalar',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])# 实验
# svc1 =RBFsvm(0.5)
# x_std=svc1['std_scalar'].fit_transform(x)
# svc1.fit(x_std,y)
# plot_decision_boundary(svc1,axis=[-3,3,-3,3])
# plt.scatter(x_std[y==0,0],x_std[y==0,1])
# plt.scatter(x_std[y==1,0],x_std[y==1,1])
# plt.show()svc1 =RBFsvm(1.0)
svc1.fit(x,y)
plot_decision_boundary(svc1,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()svc2 =RBFsvm(100)
svc2.fit(x,y)
plot_decision_boundary(svc2,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()svc3 =RBFsvm(0.1)
svc3.fit(x,y)
plot_decision_boundary(svc3,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()

在这里插入图片描述

2.4 超参数 γ \gamma γ

在这里插入图片描述


http://www.ppmy.cn/embedded/139011.html

相关文章

力扣题解3243 新增道路查询后的最短距离 I

题目&#xff1a; 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&#xff09;。 queries[i] [ui, vi] 表示新建一条从城市 ui 到城市…

【前端学习笔记】Javascript学习二(运算符、数组、函数)

一、运算符 运算符&#xff08;operator&#xff09;也被称为操作符&#xff0c;是用于实现赋值、比较和执行算数运算等功能的符号。 JavaScript中常用的运算符有&#xff1a; 算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符 算数运算符&#xff1a; 、-…

刷题训练之深搜(DFS)-----(二叉树的所有路径,全排列,子集)

二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 题目分析&#xff1a; 题目要我们找到一个课的所有路径&#xff0c;就是要找到从根节点到每一个叶子节点的路径 终止条件就是当遇到叶子节点的时候 用…

【RabbitMQ】10-抽取MQ工具

1. Nacos共享配置 shared-mq.yaml spring:rabbitmq:host: ${hm.mq.host:*.*.*.*} # 你的虚拟机IPport: ${hm.mq.port:5672} # 端口virtual-host: ${hm.mq.vhost:/hmall} # 虚拟主机username: ${hm.mq.un:hmall} # 用户名password: ${hm.mq.pw:***} # 密码2. Common包下引入依…

Flutter开发者进阶:接入安卓原生页面

Flutter开发者进阶&#xff1a;接入安卓原生页面 前言 在 Flutter APP 的开发过程中&#xff0c;有时不仅需要使用 Flutter 提供的组件&#xff0c;还需要使用原生的组件。 例如在对接外部 SDK 时&#xff0c;如果自己重新实现 SDK 的逻辑&#xff0c;无疑是本末倒置。 在这…

多邻国网页版怎么登录?

我之前一直用APP&#xff0c;最近才发现还有多邻国网页版&#xff0c;感觉网页版的多邻国使用感觉比APP舒服好多&#xff0c;而且很多功能只有网页版才有&#xff0c;多邻国网页版登录其实很简单&#xff0c;直接在官网www.duolingo.cn登录就可以。 一、多邻国是什么&#xff1…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在城市化进…

算法——环形链表(leetcode141)

判断一个链表是否是环形链表&#xff0c;这题可以用快慢指针来解决&#xff0c;首先令快慢指针fastIndex、slowIndex等于head头节点,接着来一个循环 循环体是fastIndex步进两个单位slowIndex步进一个单位判断如果slowIndex等于fastIndex则是有环 因为fastIndex走的比slowIndex快…