机器学习(5)——支持向量机

1. 支持向量机(SVM)是什么?

支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面,使得不同类别的样本间隔(Margin)最大化,从而提高模型的泛化能力。

2. SVM的基本原理

2.1. 核心思想

  • 目标: 在特征空间中找到一个超平面(决策边界),使得两类样本的间隔最大化
  • 关键概念:
    • 支持向量(Support Vectors): 距离超平面最近的样本点,决定超平面的位置。这些点在定义分类边界时起着至关重要的作用,因此称为“支持向量”
    • 间隔(Margin): 支持向量到超平面的距离,越大表示分类器鲁棒性越强。SVM通过最大化这个间隔来选择最佳超平面。

3. 线性可分和非线性可分

  • 线性可分: 如果数据可以通过一个直线(二维空间)或超平面(高维空间)分开,则称数据是线性可分的。在这种情况下,SVM能够找到一个线性决策边界。

  • 非线性可分: 当数据不是线性可分时,我们可以通过核函数将数据映射到更高维的空间,使得在这个高维空间中数据变得线性可分。这个过程称为核技巧。

4. SVM的数学基础

4.1. 线性可分情况(硬间隔 SVM)

4.1.1. 间隔最大化

  • 在二维空间中,我们用一个线性决策边界(直线)来将数据分开。假设数据点可以被线性分开,则可以表示为:
    w ⋅ x + b = 0 w⋅x+b=0 wx+b=0

  • 其中:

    • w w w 是法向量,决定超平面的方向。
    • b b b 是偏置项,控制超平面与原点的距离。
    • x x x 是数据点。
  • 目标是找到一个决策边界,使得不同类别的数据点到该边界的距离尽量远。最大化间隔可以转化为如下的优化问题:

m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximizew2

  • 其中, ∥ w ∥ \|w\| w是法向量的范数,优化的目标是使这个范数最小化,从而间隔最大化。

4.1.2. SVM 的优化目标

  • 假设数据线性可分,SVM 的优化目标是:
    最大化间隔 等价于 最小化 1 2 ∥ w ∥ 2 最大化间隔 \ 等价于 \ 最小化 \frac {1}{2}\|w\|^2 最大化间隔 等价于 最小化21w2

  • 约束条件: y i ( w T x i + b ) ≥ 1 , ∀ i y_i(w^T x_i + b) \geq 1, \quad \forall i yi(wTxi+b)1,i

  • 其中

    • w w w:是法向量。
    • b b b :是偏置项。
    • y i ∈ − 1 , + 1 y_i∈{−1,+1} yi1,+1:样本标签。
  • 几何解释:

    • 超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0

    • 支持向量满足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi(wTxi+b)=1

3. 线性不可分情况(软间隔 SVM)

当数据存在噪声或轻微重叠时,引入松弛变量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi0,允许部分样本违反约束:
最大化间隔 等价于 min ⁡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化间隔 \ 等价于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化间隔 等价于min21w2+Ci=1Nξi

  • ξ i \xi_i ξi是松弛变量,表示第 i i i个样本点与分类边界的偏差。

约束条件:
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi(wTxi+b)1ξi,ξi0

  • 参数 C C C:控制分类严格性:

    • C C C 大 → 更严格(可能过拟合)。

    • C C C 小 → 允许更多错误(提高泛化性)。

4. 非线性 SVM(核方法)

当数据非线性可分时,通过核函数(Kernel)将数据映射到高维空间,使其线性可分。

常用核函数

  • 线性核(无映射):
    K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi,xj)=xiTxj
  • 线性核(无映射):
    K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi,xj)=(xiTxj+c)d
  • 高斯核(RBF)(最常用):
    K ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp \left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi,xj)=exp(2σ2xixj2)
    • σ 控制样本间影响范围(小 → 过拟合,大 → 欠拟合)。
  • Sigmoid 核:
    K ( x i , x j ) = tanh ⁡ ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi,xj)=tanh(αxiTxj+c)

核技巧(Kernel Trick)

  • 无需显式计算高维映射 ϕ ( x ) ϕ(x) ϕ(x),直接通过核函数计算内积:
    ϕ ( x i ) T ϕ ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ϕ(xi)Tϕ(xj)=K(xi,xj)

5. 优化方法(对偶问题)

原始问题转化为拉格朗日对偶问题,通过求解:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmaxi=1nαi21i,jαiαjyiyjK(xi,xj)
约束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1nαiyi=0,0αiC

α i α_i αi:拉格朗日乘子,非零 α i α_i αi 对应支持向量。

最终决策函数:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(iSVαiyiK(xi,x)+b)

6. 优缺点

  • ✅ 优点

    • 高维数据有效(尤其适合文本、图像)。

    • 核方法处理非线性问题。

    • 泛化能力强(最大化间隔)。

    • 对过拟合有一定鲁棒性(通过 C C C 控制)。

  • ❌ 缺点

    • 计算复杂度高(训练时间随样本数增长)。

    • 对参数( C C C、核参数)敏感。

    • 不直接提供概率输出(需额外校准)。

7. Python 示例(Scikit-learn)

7.1. 线性 SVM

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 训练线性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)# 评估
print("Accuracy:", model.score(X_test, y_test))

7.2. 非线性 SVM(RBF 核)

from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler# 标准化数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 训练RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)# 预测
print("Accuracy:", model.score(X_test_scaled, y_test))

7.3. 支持向量可视化

import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay# 仅用前两特征简化可视化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)disp = DecisionBoundaryDisplay.from_estimator(model, X_2d, response_method="predict",plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()

8. 关键参数调优

  • C C C:平衡分类严格性与泛化能力。

    • 网格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
  • 核函数选择

    • 线性:kernel=‘linear’

    • RBF:kernel=‘rbf’(需调 gamma)

  • γ γ γ(RBF核):

    • 小 → 决策边界平滑,大 → 复杂(过拟合风险)。

9. 总结

  • SVM 核心:最大化间隔的超平面,支持核方法处理非线性。

  • 关键参数:

    • 正则化参数 C C C

    • 核函数类型(RBF/线性/多项式)。

    • RBF 核的 γ γ γ

  • 适用场景:

    • 中小规模高维数据(如文本分类、图像识别)。

    • 需强泛化能力的分类任务。

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

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

相关文章

从零到一:网站设计新手如何快速上手?

从零到一:网站设计新手如何快速上手? 在当今数字化时代,网站已成为企业、个人展示信息、提供服务的重要窗口。对于想要涉足网站设计领域的新手而言,如何快速上手并掌握必要的技能成为首要任务。本文将从基础知识、软件工具、设计…

蓝桥杯2024国B数星星

小明正在一棵树上数星星,这棵树有 n 个结点 1,2,⋯,n。他定义树上的一个子图 G 是一颗星星,当且仅当 G 同时满足: G 是一棵树。G 中存在某个结点,其度数为 ∣VG​∣−1。其中 ∣VG​∣ 表示这个子图含有的结点数。 两颗星星不相…

Django从零搭建卖家中心登陆与注册实战

在电商系统开发中,卖家中心是一个重要的组成部分,而用户注册与登陆则是卖家中心的第一步。本文将详细介绍如何使用Django框架从零开始搭建一个功能完善的卖家注册页面,包括前端界面设计和后端逻辑实现。 一、项目概述 我们将创建一个名为sel…

Opencv使用cuda实现图像处理

main.py import os import cv2 print(fOpenCV: {cv2.__version__} for python installed and working) image cv2.imread(bus.jpg) if image is None:print("无法加载图像1") print(cv2.cuda.getCudaEnabledDeviceCount()) cv2.cuda.setDevice(0) cv2.cuda.printCu…

如何编制实施项目管理章程

本文档概述了一个项目管理系统的实施计划,旨在通过统一的业务规范和技术架构,加强集团公司的业务管控,并规范业务管理。系统建设将遵循集团统一模板,确保各单位项目系统建设的标准化和一致性。 实施范围涵盖投资管理、立项管理、设计管理、进度管理等多个方面,支持项目全生…

B端可视化方案,如何助力企业精准决策,抢占市场先机

在当今竞争激烈的商业环境中,企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘,帮助企业管理层和业务人员快速理解数据背后的业务逻辑,从而做出精准决策。本文将深入探讨B端可视化方…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Android基础教程 - 学习完成记录

视频学习教程 视频链接:2022 最新 Android 基础教程,从开发入门到项目实战,看它就够了,更新中_哔哩哔哩_bilibili 学习下来,有遇到很多问题,在 chatgpt、claude 和 Android Studio 插件通义千问的帮助下&…

Web开发-JavaEE应用原生和FastJson反序列化URLDNS链JDBC链Gadget手搓

知识点: 1、安全开发-JavaEE-原生序列化-URLDNS链分析 2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析 利用链也叫"gadget chains",我们通常称为gadget: 1、共同条件:实现Serializable或者Externalizable接口&…

OpenCV操作函数

1、cv2.imread() 2、 cv2.imshow() 3、 cv2.waitKey() 4、cv2.imwrite() 5、cv2.selectROI() 6、 cv2.VideoCapture() 7、cv2.cvtColor(&#xff…

AI编程新纪元:GitHub Copilot、CodeGeeX与VS2022的联合开发实践

引言:AI编程时代的到来 在软件开发领域,我们正站在一个历史性的转折点上。GitHub Copilot、CodeGeeX等AI编程助手的出现,结合Visual Studio 2022的强大功能,正在重塑代码编写的本质。这不仅是工具层面的革新,更是开发范式的根本转变。能够有效利用这些AI工具的开发者将跨…

[特殊字符] MySQL MCP 开发实战:打造智能数据库操作助手

💡 简介:本文详细介绍如何利用MCP(Model-Control-Panel)框架开发MySQL数据库操作工具,使AI助手能够直接执行数据库操作。 📚 目录 引言MCP框架简介项目架构设计开发环境搭建核心代码实现错误处理策略运行和…

Dify部署过程中的错误和解决方案汇总

本文仅限于记录Dify部署及使用过程中的BUG和解决方案 1. Dify配置SearXNG时报错: 报错内容: PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message":"Error 4…

C#中async await异步关键字用法和异步的底层原理

目录 C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结 C#异步编程 一、异步编程基础 异步编程是啥玩意儿 就是让程序在干等着某些耗时操作(比如等网络响应、读写文件啥的)的时候,能把线程腾出来…

安全教育知识竞赛答题小程序怎么做

以下是制作安全教育知识竞赛答题小程序的一般步骤: 一、准备阶段 注册小程序账号:前往微信公众平台,注册一个小程序账号,主体类型可根据实际情况选择个人或企业等,注册成功后登录获取appid。 下载安装开发工具&#x…

记录待办事项的便签软件有没有推荐的?

在快节奏的现代生活中,我们每天都要处理大量的工作任务和生活琐事,稍有不慎就可能遗漏重要事项。你是否经常遇到这样的情况:明明记得有件事要做,却怎么也想不起来是什么;或者手头同时有好几项任务,却不知道…

实验四 中断实验

一、实验目的 掌握中断服务程序的编写。 二、实验电路 三、实验内容 1.实验用PC机内部的中断控制器8259A,中断源用TPC-ZK实验箱上的单脉冲电路,将单脉冲电路的输出接中断请求信号IRQ,每按一次单脉冲按键产生一次…

React 项目src文件结构

SCSS 组件库 SCSS为预处理器 支持除原生CSS外的其他语句 别名路径 在项目下的第一级目录就加入craco.config.js文件并且修改packpage.js 中的部分 // 扩展webpage的配置const path require(path)module.exports {// exports配置webpack:{// 配置别名alias:{:path.resolve(__d…

Cursor入门教程-JetBrains过度向

Cursor使用笔记 **前置:**之前博主使用的是JetBrains的IDE,VSCode使用比较少,所以会尽量朝着JetBrains的使用习惯及样式去调整。 一、设置语言为中文 如果刚上手Cursor,那么肯定对Cursor中的众多选项配置项不熟悉,这…

Linux上位机开发实践(SoC和MCU的差异)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 soc一般是指跑linux的芯片,而mcu默认是跑rtos的芯片,两者在基本原理方面其实差异不大。只不过,前者由于性能的原…