跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

支持向量机(SVM)原理与 Python 代码实现:分类与回归详解

详细介绍支持向量机(SVM)的核心原理与应用。涵盖线性可分 SVM、软间隔正则化及核函数方法,解释分类与回归(SVR)的数学优化目标。通过二维分类和一维回归的手动案例,展示决策边界与支持向量的作用。提供基于 scikit-learn 的完整 Python 代码,包含数据构造、模型训练、可视化决策边界及 epsilon 带宽。最后总结 SVM 优缺点及工程建议,如特征标准化与参数调优。

接口猎人发布于 2026/4/6更新于 2026/10/24125 浏览
支持向量机(SVM)原理与 Python 代码实现:分类与回归详解

一、SVM 简介与应用场景

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

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

二、SVM 分类的数学原理

1. 线性可分 SVM

对于线性可分数据,SVM 目标是在特征空间中找到一个最优超平面(optimal separating hyperplane),使得两类样本间隔最大。

决策函数:$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 示例)

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()

七、流程小结

  • SVM 分类:先画点→找分界线→支持向量→可视化决策边界
  • SVR 回归:先画点→拟合回归线→画出 $\epsilon$ 带宽→可视化结果

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

优点:

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

缺点:

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

工程建议:

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

九、总结

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

目录

  1. 一、SVM 简介与应用场景
  2. 典型应用
  3. 二、SVM 分类的数学原理
  4. 1. 线性可分 SVM
  5. 2. 软间隔与正则化
  6. 3. 非线性 SVM 与核方法
  7. 4. SVM 分类的对偶问题与支持向量
  8. 三、SVM 回归(SVR, Support Vector Regression)原理
  9. 四、SVM 分类案例流程(手动二维数据)
  10. 1. 构造数据
  11. 2. 可视化原始数据
  12. 3. SVM 训练流程
  13. 4. 结果与决策边界
  14. 五、SVR 回归案例流程(手动一维数据)
  15. 1. 构造数据
  16. 2. 可视化原始数据
  17. 3. SVR 训练流程
  18. 4. 结果与回归曲线
  19. 六、完整 Python 代码实现(含数据、SVM 及 SVR 示例)
  20. SVM 分类案例
  21. 训练 SVM
  22. 可视化决策边界
  23. SVR 回归案例
  24. 训练 SVR
  25. 画出 epsilon 带宽
  26. 七、流程小结
  27. 八、SVM 的优缺点与工程建议
  28. 九、总结

更多推荐文章

查看全部
  • 人工智能时代前端开发者如何抓住机遇
  • 同花顺 API 收费模式与档位选择指南
  • Git 基础教程:从零理解版本控制与团队协作
  • Linux 进程替换详解:从 fork 到 exec 的完整链路
  • KAG 实战:基于 LLM 抽取知识图谱与 Neo4j 的图谱问答闭环
  • AUTOSAR 配置文件(ARXML)版本不一致的管理策略
  • 昇腾 NPU 部署 Llama 2 模型性能测试与优化
  • 黑客与程序员的本质区别及核心技能树解析
  • 【Flask+VUE】flask+vue开发web网页系统(详细安装使用范例)
  • 企业为何需要私有化部署专属大模型
  • OpenClaw Skills 合集开源,收录超 1700 个本地化 AI Agent 技能
  • 智能系统架构设计:对话式 AI、协同驾驶与 RAG 范式
  • 线性动态规划经典例题解析
  • 算法实战:归并排序与数组逆序对详解
  • 数据结构初阶:二叉树的链式存储结构
  • 基于 AI 辅助的在线图书借阅平台设计与实现
  • 普通人零基础进入 AIGC 大模型人形机器人赛道自学攻略与应用案例
  • 无人机航拍图像处理:目标跟踪与场景重建
  • 基于腾讯云 CVM 部署 Clawdbot 实现 Telegram 智能回复
  • 使用 llama.cpp 在普通电脑运行大模型实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online