【AI深究】支持向量机(SVM, Support Vector Machine)全网最详细全流程详解与案例(附Python代码演示)|SVM、SVR|分类、回归任务流程|优、缺点|例子案例及数据演示

【AI深究】支持向量机(SVM, Support Vector Machine)全网最详细全流程详解与案例(附Python代码演示)|SVM、SVR|分类、回归任务流程|优、缺点|例子案例及数据演示

大家好,我是爱酱。继前几篇系统讲解了集成方法、GMM、DBSCAN等主流算法,这一篇我们来聊聊机器学习中极为经典且实用的模型——支持向量机(SVM)。SVM不仅能做分类,还能做回归、异常检测等任务。本文将围绕SVM的核心原理、数学公式、不同用途(分类/回归)、常见核函数、实际案例与代码实现等,详细分步骤讲解,便于你直接用于技术文档和学习。

注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!


一、SVM简介与应用场景

支持向量机(SVM)是一种基于统计学习理论的监督学习模型,最初用于二分类问题,但已广泛应用于多分类、回归、异常检测等场景。其核心思想是:在特征空间中寻找一个最优超平面,将不同类别的样本分开,并最大化类别间的间隔(margin)

典型应用

  • 文本/垃圾邮件分类
  • 图像识别与人脸检测
  • 基因/蛋白质分类、生物信息学
  • 手写数字识别
  • 金融风控、异常检测
  • 回归预测(SVR)

二、SVM分类的数学原理

1. 线性可分SVM

对于线性可分数据,SVM目标是在特征空间中找到一个最优超平面(optimal separating hyperplane) 

$w^T x + b = 0$

,使得两类样本间隔最大

决策函数:

f(x) = \mathrm{sign}(w^T x + b)

最优间隔的数学表达:

\min_{w, b} \frac{1}{2} \|w\|^2

约束条件:

y_i (w^T x_i + b) \geq 1, \quad \forall i

支持向量:距离超平面最近的样本点,决定了分类边界的位置。


2. 软间隔与正则化

实际数据往往不可完全线性分割,引入松弛变量

$\xi_i$

和正则化参数

$C$

,允许部分样本被误分:

\min_{w, b, \xi} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n \xi_i

约束:

y_i (w^T x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0
$C$

控制间隔最大化与误分类惩罚的权衡。


3. 非线性SVM与核方法

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

常见核函数:

高斯径向基核(RBF)

K(x, x') = \exp\left(-\gamma \|x - x'\|^2\right)

多项式核

K(x, x') = (x^T x' + c)^d

线性核

K(x, x') = x^T x'

核方法让SVM能处理复杂的非线性分类问题。


4. SVM分类的对偶问题与支持向量

SVM最终可转化为对偶问题,只有支持向量(即

$\alpha_i > 0$

的样本)参与决策:

\max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j K(x_i, x_j)

约束:

0 \leq \alpha_i \leq C, \quad \sum_{i=1}^n \alpha_i y_i = 0

最终分类函数:

f(x) = \mathrm{sign}\left(\sum_{i=1}^n \alpha_i y_i K(x_i, x) + b\right)

三、SVM回归(SVR, Support Vector Regression)原理

SVM不仅能做分类,还能做回归(SVR)。其目标是找到一个对大多数样本误差在$\epsilon$范围内的回归函数。

SVR优化目标:

\min_{w, b, \xi, \xi^*} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*)

约束:

\begin{cases} y_i - (w^T x_i + b) \leq \epsilon + \xi_i \\ (w^T x_i + b) - y_i \leq \epsilon + \xi_i^* \\ \xi_i, \xi_i^* \geq 0 \end{cases}

SVR同样可结合核函数实现非线性回归。


四、SVM分类案例流程(手动二维数据)

1. 构造数据

假设我们有如下二维点:

$x_1$$x_2$类别
A231
B331
C221
D78-1
E88-1
F77-1

类别1用红色,类别-1用蓝色。

2. 可视化原始数据

  • 用散点图画出这6个点,不同类别不同颜色。
  • 你会看到两组点在二维空间中分布明显。

3. SVM训练流程

  • 目标:找到一条直线(超平面)将两类点分开,并让两类点距离这条线的“间隔”最大。
  • SVM自动确定这条线的位置和方向。
  • 训练后,距离分界线最近的点就是“支持向量(Support Vector)”,它们决定了分类边界。

4. 结果与决策边界

  • SVM会输出决策边界(分界线),并标出支持向量。
  • 你可以用网格点可视化SVM的分界线和每个点的分类区域。

五、SVR回归案例流程(手动一维数据)

1. 构造数据

假设我们有如下回归样本:

$x$$y$
-2-1.1
-1-0.8
00.1
10.9
21.2

2. 可视化原始数据

  • 用散点图画出$x$与$y$的关系。

3. SVR训练流程

  • 目标:找到一条曲线或直线,使得大部分点落在“$\epsilon$带宽”内(即误差在$\epsilon$以内)。
  • 带宽外的点会产生惩罚,模型会平衡拟合度和间隔宽度。
  • 支持向量是那些正好落在$\epsilon$带宽边界上的点。

4. 结果与回归曲线

  • SVR会输出拟合曲线和$\epsilon$带宽(上下两条虚线)。
  • 可视化时,回归曲线穿过数据点,大部分点在带宽内,极少数点在带宽外。

六、完整Python代码实现(含数据、SVM及SVR示例)

注:记得要先 pip install scikit-learn Library喔~还有请大家复制并在本地执行喔~

import numpy as np import matplotlib.pyplot as plt from sklearn.svm import SVC, SVR # SVM分类案例 X_cls = np.array([[2,3],[3,3],[2,2],[7,8],[8,8],[7,7]]) y_cls = np.array([1,1,1,-1,-1,-1]) plt.figure(figsize=(6,5)) plt.scatter(X_cls[y_cls==1,0], X_cls[y_cls==1,1], color='red', label='Class 1') plt.scatter(X_cls[y_cls==-1,0], X_cls[y_cls==-1,1], color='blue', label='Class -1') plt.xlabel('x1') plt.ylabel('x2') plt.title('Raw Data (SVM Classification)') plt.legend() plt.show() # 训练SVM clf = SVC(kernel='linear', C=100) clf.fit(X_cls, y_cls) # 可视化决策边界 w = clf.coef_[0] b = clf.intercept_[0] xx = np.linspace(1, 9, 100) yy = -(w[0]*xx + b)/w[1] plt.figure(figsize=(6,5)) plt.scatter(X_cls[y_cls==1,0], X_cls[y_cls==1,1], color='red', label='Class 1') plt.scatter(X_cls[y_cls==-1,0], X_cls[y_cls==-1,1], color='blue', label='Class -1') plt.plot(xx, yy, 'k-', label='Decision Boundary') plt.scatter(clf.support_vectors_[:,0], clf.support_vectors_[:,1], s=120, facecolors='none', edgecolors='k', linewidths=1.5, label='Support Vectors') plt.xlabel('x1') plt.ylabel('x2') plt.title('SVM Decision Boundary & Support Vectors') plt.legend() plt.show() # SVR回归案例 X_reg = np.array([[-2],[-1],[0],[1],[2]]) y_reg = np.array([-1.1, -0.8, 0.1, 0.9, 1.2]) plt.scatter(X_reg, y_reg, color='blue', label='Data') plt.xlabel('x') plt.ylabel('y') plt.title('Raw Data (SVR Regression)') plt.legend() plt.show() # 训练SVR svr = SVR(kernel='linear', C=10, epsilon=0.1) svr.fit(X_reg, y_reg) X_plot = np.linspace(-2.5, 2.5, 100).reshape(-1,1) y_pred = svr.predict(X_plot) plt.scatter(X_reg, y_reg, color='blue', label='Data') plt.plot(X_plot, y_pred, color='red', label='SVR Prediction') plt.xlabel('x') plt.ylabel('y') plt.title('SVR Regression with Epsilon-Tube') # 画出epsilon带宽 plt.plot(X_plot, y_pred + svr.epsilon, 'k--', lw=1) plt.plot(X_plot, y_pred - svr.epsilon, 'k--', lw=1) plt.legend() plt.show() 
共四页图解

1. SVM分类原始数据分布(SVM RAW DATA)

  • 内容:二维平面上红色点(Class 1)和蓝色点(Class -1),分别对应你手动输入的6个点。
  • 用途:展示SVM分类前各类别样本的空间分布。

2. SVM决策边界与支持向量

  • 内容:红色和蓝色点分布,与上图一致;黑色实线为SVM学到的分类决策边界(超平面);用黑色空心圆圈特别标出了支持向量(即决定分类边界的样本点)。
  • 用途:直观展示SVM如何找到最优分界线,以及哪些点是支持向量。

3. SVR回归原始数据(SVR RAW DATA)

  • 用途:展示回归前数据的分布情况。

内容:一维自变量

$x$

与目标

$y$

的蓝色散点图,展示你输入的5个回归样本。

4. SVR回归拟合与

$\epsilon$

带宽

用途:直观展示SVR拟合效果,以及

$\epsilon$

带宽内外的数据点分布。

内容:蓝色散点为原始数据点,红色曲线为SVR拟合出来的回归直线,黑色虚线为

$\epsilon$

带宽(即允许误差范围)。


七、流程小结

  • SVM分类:先画点→找分界线→支持向量→可视化决策边界

SVR回归:先画点→拟合回归线→画出

$\epsilon$

带宽→可视化结果


八、SVM的优缺点与工程建议

优点:

  • 理论基础扎实,泛化能力强
  • 能处理高维、非线性、复杂边界数据
  • 支持多种核函数,灵活性高
  • 仅依赖支持向量,模型稀疏

缺点:

  • 对参数(C、gamma)和特征缩放敏感
  • 训练时间长,难以扩展到超大数据集
  • 对多分类支持有限(需用一对多/一对一策略)

工程建议:

  • 特征需标准化或归一化
  • 小中型数据、特征维度高时优先尝试SVM
  • 通过网格搜索等方法调优C和gamma
  • 分类、回归、异常检测等任务均可尝试SVM

九、总结

支持向量机(SVM)是机器学习中极具代表性的基础模型之一,广泛应用于分类、回归、异常检测等任务。其最大间隔、核方法、支持向量等思想为后续众多算法奠定了理论基础。实际工程中,建议结合特征工程、参数调优和业务需求,灵活选择SVM的不同用途和核函数,发挥其最大价值。


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!

Read more

Vivado使用教程:图解说明管脚分配全过程

Vivado管脚分配实战指南:从原理到避坑全解析 你有没有遇到过这样的情况?逻辑代码写得完美无缺,仿真波形也完全正确,结果下载到FPGA板子上——灯不亮、通信失败、甚至芯片发热异常。排查半天,最后发现是某个引脚接错了电压标准? 别笑,这在FPGA开发中太常见了。 尤其是在初学阶段,很多人把注意力都放在Verilog或VHDL的语法和状态机设计上,却忽略了 一个比代码更底层、更关键的环节:管脚分配 。 今天我们就来彻底拆解这个“隐形杀手”——用最贴近工程实践的方式,带你一步步搞懂 Vivado中的管脚分配全过程 ,不只是点几下鼠标那么简单,而是理解背后的电气规则、约束机制与系统级影响。 为什么管脚分配不是“随便连一下”? FPGA不像MCU那样有固定的外设映射。它的每个IO引脚都是可编程的,这意味着你可以自由定义哪个引脚做时钟输入、哪个输出控制LED。但自由的背后是责任: 每一个引脚配置都必须符合物理世界的电气法则 。 举个真实案例: 某工程师将一个来自3.3V系统的复位信号接入Bank 14(VCCO=1.8V),没有加电平转换。虽然一开始功能似乎正常,但在高温环境下

无人机遥感航拍巡检数据集 无人机遥感图像识别 无人机视角山区泥石流和滑坡图像识别数据集-数据集第10067期

无人机遥感航拍巡检数据集 无人机遥感图像识别 无人机视角山区泥石流和滑坡图像识别数据集-数据集第10067期

滑坡检测数据集核心信息介绍 ** 这个滑坡检测数据集主要用于目标检测任务,整体数据规模和细节都比较明确。从数量上看,数据集总共包含 1660 张图像, 往期热门主题 主题搜两字"关键词"直达 代码数据获取: 获取方式:***文章底部卡片扫码获取*** 覆盖了YOLO相关项目、OpenCV项目、CNN项目等所有类别, 覆盖各类项目场景(包括但不限于以下----欢迎咨询定制): 项目名称项目名称基于YOLO+deepseek 智慧农业作物长势监测系统基于YOLO+deepseek 人脸识别与管理系统基于YOLO+deepseek 无人机巡检电力线路系统基于YOLO+deepseek PCB板缺陷检测基于YOLO+deepseek 智慧铁路轨道异物检测系统基于YOLO+deepseek 102种犬类检测系统基于YOLO+deepseek 人脸面部活体检测基于YOLO+deepseek 无人机农田病虫害巡检系统基于YOLO+deepseek 水稻害虫检测识别基于YOLO+deepseek 安全帽检测系统基于YOLO+deepseek 智慧铁路接触网状态检测系统基于YOLO+

Trae x Vizro:低代码构建专业数据可视化仪表板的高效方案

Trae x Vizro:低代码构建专业数据可视化仪表板的高效方案

声明:文章为本人真实测评博客,非广告,并没有推广该平台 ,为用户体验文章 目录 * 前言 * 一.核心工具与优势解析 * 低代码高效开发 * 专业视觉设计 * 高度灵活可定制 * AI赋能创新 * 二.操作步骤:从安装到生成效果 * 第一步. 获取MCP配置代码 * 第二步:下载 * 第三步:在 Trae 中导入 MCP 配置并建立连接 * 三. 实战:用Vizro MCP快速构建仪表板 * 1. 提出需求 * 2.智能体生成代码 * 3.查看运行结果 * 4.优化与部署 * 四.Vizro MCP核心功能解析 * get_vizro_chart_or_dashboard_plan * get_model_json_

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

适用读者:机器人二次开发者、科研人员 开发环境:Ubuntu 20.04(推荐) 机器人型号:Unitree G1 EDU+ 前言 宇树 G1 是一款面向科研与商业应用的高性能人形机器人,支持丰富的二次开发接口。在正式进行算法调试与功能开发之前,首要任务是建立稳定的开发连接。本文将详细介绍两种主流连接方式:有线(网线直连) 与 无线(WiFi + SSH),并附上完整的配置流程,帮助开发者快速上手。 一、有线连接(推荐新手优先使用) 有线连接通过网线直接将开发电脑与 G1 机器人相连,具有延迟低、稳定性高、不依赖外部网络的优势,是新手入门和底层调试的首选方式。 1.1 前置条件 所需物品说明开发电脑推荐安装 Ubuntu 20.04,或在 Windows 上使用虚拟机宇树 G1 机器人确保已开机且处于正常状态网线(