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

机器学习:支持向量机(SVM)算法详解

综述由AI生成支持向量机(SVM)是一种经典的监督学习算法,用于分类和回归问题。其核心思想是通过寻找最优超平面最大化样本间隔,利用核函数处理非线性问题。文章介绍了 SVM 的数学推导、优缺点及应用场景,并提供了基于 Scikit-learn 的 Python 实现示例,展示了数据可视化及模型训练过程。

黑客帝国发布于 2026/3/24更新于 2026/5/2028K 浏览
机器学习:支持向量机(SVM)算法详解

引言

支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,广泛应用于分类和回归问题。SVM 以其强大的数学基础和优异的性能在机器学习领域占据重要地位。本文将详细介绍 SVM 的原理、数学推导、应用场景以及 Python 实现。

一、什么是支持向量机(SVM)

支持向量机是一种二分类模型,其基本思想是找到一个超平面,将不同类别的数据分隔开,并且使得两类数据点到超平面的距离(即间隔)最大化。SVM 不仅可以处理线性可分问题,还可以通过核函数处理非线性可分问题。

二、SVM 的基本原理

SVM 的核心目标是找到一个最优超平面,使得两类数据点的间隔最大化。这个超平面可以表示为:$w^T x + b = 0$

其中,$w$ 是法向量,决定了超平面的方向;$b$ 是偏置项,决定了超平面的位置。

对于线性可分的数据,SVM 的目标是找到 $w$ 和 $b$,使得所有样本点满足:

在这里插入图片描述

其中,$y_i$ 是样本的标签(取值为 +1 或 -1),$x_i$ 是样本特征。

三、数学推导

1. 线性可分情况

对于线性可分的数据,SVM 的优化目标是最大化间隔。间隔的定义为:

在这里插入图片描述

因此,SVM 的优化问题可以转化为:

在这里插入图片描述

这是一个凸二次规划问题,可以通过拉格朗日乘子法求解。

2. 非线性可分情况

对于非线性可分的数据,SVM 引入松弛变量 $\xi_i$,允许部分样本点不满足约束条件。此时,优化问题变为:

在这里插入图片描述

其中,$C$ 是正则化参数,用于控制分类错误和间隔的平衡。

3. 核函数

对于非线性问题,SVM 通过核函数将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括:

  • 高斯核(RBF 核): $$K(x, z) = \exp(-\gamma ||x - z||^2)$$

  • 多项式核: $$K(x, z) = (x^T z + c)^d$$

  • 线性核: $$K(x, z) = x^T z$$

核函数的选择对 SVM 的性能有重要影响。

四、SVM 的优缺点

优点:

  • 在高维空间中表现优异。
  • 适用于小样本数据集。
  • 通过核函数可以处理非线性问题。

缺点:

  • 对大规模数据集训练速度较慢。
  • 对参数和核函数的选择敏感。
  • 难以直接用于多分类问题(需要通过组合多个二分类器实现)。

五、应用场景

SVM 广泛应用于以下领域:

  • 文本分类(如垃圾邮件过滤)
  • 图像分类(如手写数字识别)
  • 生物信息学(如基因分类)
  • 金融风控(如信用评分)

六、Python 实现示例

以下是使用 Python 和 Scikit-learn 库实现 SVM 的示例代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

data = pd.read_csv("iris.csv", header=None)

# 可视化原始数据
data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原始数据是四维,无法展示,选择两个进行展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')

# 使用 SVM 进行训练
x = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]

# 标准化数据
# from sklearn.preprocessing import StandardScaler
# scaler = StandardScaler()
# x = scaler.fit_transform(x)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(x_train, y_train)

# 可视化 SVM 结果
# 参数 w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项 [原始数据为一维数组]
b = svm.intercept_[0]
# w 和 b 决定了模型的决策边界

x1 = np.linspace(0, 7, 300)
# 在 0 到 7 之间生成 300 个等间距的点
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]

# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')

# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 5)

# 找到支持向量 [二维数组] 可视化支持向量
# svm.support_vectors_是 SVM 模型中的一个属性,返回所有支持向量。
# vets 是一个二维数组,每一行表示一个支持向量的特征值。
vets = svm.support_vectors_
# vets[:, 0] 和 vets[:, 1] 分别表示支持向量的第一个和第二个特征值(假设数据是二维的)。
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
plt.show()

七、总结

支持向量机是一种强大且灵活的机器学习算法,适用于多种分类和回归问题。通过核函数,SVM 能够处理非线性数据,并在高维空间中表现出色。然而,SVM 的训练速度较慢,且对参数选择敏感。在实际应用中,需要根据具体问题选择合适的核函数和参数。

目录

  1. 引言
  2. 一、什么是支持向量机(SVM)
  3. 二、SVM 的基本原理
  4. 三、数学推导
  5. 1. 线性可分情况
  6. 2. 非线性可分情况
  7. 3. 核函数
  8. 四、SVM 的优缺点
  9. 优点:
  10. 缺点:
  11. 五、应用场景
  12. 六、Python 实现示例
  13. 可视化原始数据
  14. 原始数据是四维,无法展示,选择两个进行展示
  15. 使用 SVM 进行训练
  16. 标准化数据
  17. from sklearn.preprocessing import StandardScaler
  18. scaler = StandardScaler()
  19. x = scaler.fit_transform(x)
  20. 可视化 SVM 结果
  21. 参数 w[原始数据为二维数组]
  22. 偏置项 [原始数据为一维数组]
  23. w 和 b 决定了模型的决策边界
  24. 在 0 到 7 之间生成 300 个等间距的点
  25. 超平面方程
  26. 上超平面方程
  27. 下超平面方程
  28. 可视化超平面
  29. 进行坐标轴限制
  30. 找到支持向量 [二维数组] 可视化支持向量
  31. svm.supportvectors是 SVM 模型中的一个属性,返回所有支持向量。
  32. vets 是一个二维数组,每一行表示一个支持向量的特征值。
  33. vets[:, 0] 和 vets[:, 1] 分别表示支持向量的第一个和第二个特征值(假设数据是二维的)。
  34. 七、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Spring Boot 集成 MyBatis-Plus 数据库操作与完整 CRUD 示例
  • Spring Boot 消息队列与异步通信
  • 大模型辅助开发:人类与 AI 的职责边界及协作指南
  • Android WebView 内核升级方案与 H.265 兼容性实践
  • 清华智谱发布 AutoGLM 技术报告:AI 自主操作手机与网页
  • 毕业论文写作困境分析与智能辅助工具应用
  • Trae 集成图片素描 MCP 工具实现多风格转换
  • 二分查找经典例题实战解析
  • Python 汉字转拼音库 pypinyin 使用指南与实战案例
  • OpenClaw:让 AI 拥有“眼睛和双手”,实现自主执行任务
  • 【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言
  • Git 国内镜像源配置指南与跨平台工具开发
  • 应对高 AIGC 率检测:学术论文写作与优化的技术解析
  • GitHub Copilot 不支持自定义模型 API 配置
  • YOLO-DRONE:无人机低空巡检模型实测与电力部署解析
  • Python 初学者必会的常用代码示例与算法解析
  • C++ 搜索引擎实战:日志宏封装与 Server 交互逻辑
  • Python 编程语言现状与核心应用领域解析
  • C++ STL string 模拟实现(下):字符串操作与运算符重载
  • Spring Web MVC 核心概念与实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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