【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

Stack-Chan机器人完整指南:从入门到精通

Stack-Chan机器人完整指南:从入门到精通 【免费下载链接】stack-chanA JavaScript-driven M5Stack-embedded super-kawaii robot. 项目地址: https://gitcode.com/gh_mirrors/sta/stack-chan Stack-Chan是一款基于JavaScript驱动的M5Stack嵌入式超级可爱的机器人项目,集成了表情显示、面部追踪、语音交互等多种智能功能。无论你是嵌入式开发新手还是机器人爱好者,这份终极指南都将帮助你快速上手并充分发挥Stack-Chan的潜力。 🎯 Stack-Chan核心功能概览 Stack-Chan机器人最吸引人的地方在于它丰富的交互能力。通过M5Stack平台,这个可爱的小机器人可以: * 生动表情显示:通过屏幕展示各种可爱的面部表情 * 智能面部追踪:能够检测并跟踪人脸或特定目标 * 实时模仿功能:同步模仿用户的动作和表情变化 * 语音对话交流:支持语音输入输出,实现自然的人机对话 * 模块化扩展:轻松连接各种M5Unit扩展模块 🛠

安卓手机安装Termux+AstrBot+NapCat搭建QQ个人机器人【非官方】(简易版)

安卓手机安装Termux+AstrBot+NapCat搭建QQ个人机器人【非官方】(简易版)

前言        好久不见,亲爱的友友们,这次我来了!这次我学会了用旧安卓手机安装termux软件搭建了一个AstrBotQQ机器人(大模型可能跑不了),我使用的旧安卓手机是vivoY31s标准版,手机型号有点久,到时能用就行了。其实方法都通用差不多。 目录 目录 前言 目录 一、简介 1.Termux 2.AstrBot 3.NapCat  二、步骤 1. 安装Termux 2. 更新系统包打开 Termux,依次执行以下命令,更新软件源并安装基础工具。 换源 (可选) 3. 申请存储权限 正式部署 安装 proot-distro 及 其他必须组件 登录 Ubuntu环境 添加第三方PPA 安装 Python 克隆 AstrBot 仓库 运行 AstrBot

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw 多飞书机器人与多 Agent 团队实战复盘 这篇文章完整记录一次从单机安装到多机器人协作落地的真实过程: 包括 Windows 安装报错、Gateway 连通、模型切换、Feishu 配对、多 Agent 路由、身份错位修复,以及最终形成“产品-开发-测试-评审-文档-运维”团队。 一、目标与结果 这次实践的目标很明确: 1. 在 Windows 上稳定跑通 OpenClaw 2. 接入飞书机器人 3. 做到一个机器人对应一个 Agent 角色 4. 支持多模型并行(OpenAI + Ollama) 5. 最终形成可执行的多 Agent 团队 最终落地状态(已验证): * 渠道:Feishu 多账号在线 * 路由:按 accountId

FPGA光通信2——Aurora 64B/66B的开发使用

FPGA光通信2——Aurora 64B/66B的开发使用

可参考GZH:小蘇的FPGA         FPGA光通信的开发过程中,最简便的方式为Aurora 64B66B,开发人员无需关注2bit同步头,加解扰等过程,开放给开发人员的主要是AXI-Stream用户数据接口。         Aurora是一款可扩展的轻量级、高数据速率链路层高速串行通信协议,支持全双工或单工,支持64B/66B,8B/10B编码。 一、Aurora 64B/66B使用介绍         该核的使用架构主要如下:借助xilinx 核,开发人员可根据用户接口实现多通道间的光通信。最大支持16lane。 1.1 、IP核的介绍         参考PG074, 该核的内部结构如下:         其中,Lane logic:每个GT收发器由一个lane逻辑模块实例驱动,初始化每个收发器,处理控制字符的编解码,并执行错误检测。         Global logic: 全局逻辑模块执行通道绑定以进行通道初始化。在运行过程中,该通道跟踪Aurora 64B/66B协议定义的Not Ready空闲字符,并监控所有通道逻辑模块的错误。