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

news2025/3/19 10:09:08

文章目录

  • 引言
    • 一、 什么是支持向量机(SVM)
    • 二、 SVM的基本原理
    • 三、数学推导
      • 1.线性可分情况
      • 2. 非线性可分情况
      • 3. 核函数
    • 四、SVM的优缺点
      • 优点:
      • 缺点:
    • 五、 应用场景
    • 六、 Python实现示例
    • 七、 总结

引言

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

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

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

二、 SVM的基本原理

SVM的核心目标是找到一个最优超平面,使得两类数据点的间隔最大化。这个超平面可以表示为:
在这里插入图片描述

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

对于线性可分的数据,SVM的目标是找到 (w) 和 (b),使得所有样本点满足:
在这里插入图片描述

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

三、数学推导

1.线性可分情况

对于线性可分的数据,SVM的优化目标是最大化间隔。间隔的定义为:
在这里插入图片描述

因此,SVM的优化问题可以转化为:
在这里插入图片描述

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

2. 非线性可分情况

对于非线性可分的数据,SVM引入松弛变量 (\xi_i),允许部分样本点不满足约束条件。此时,优化问题变为:
在这里插入图片描述

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

3. 核函数

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

  • 线性核:在这里插入图片描述

  • 多项式核:在这里插入图片描述

  • 高斯核(RBF核):在这里插入图片描述

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

四、SVM的优缺点

优点:

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

缺点:

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

五、 应用场景

SVM广泛应用于以下领域:

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

六、 Python实现示例

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


import pandas as pd

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

"""可视化原始数据"""

import matplotlib.pyplot as plt

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)

from sklearn.model_selection import train_test_split

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


from sklearn.svm import SVC
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 决定了模型的决策边界

import numpy as np

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的训练速度较慢,且对参数选择敏感。在实际应用中,需要根据具体问题选择合适的核函数和参数。

希望本文能帮助你更好地理解SVM算法,并为你的机器学习之旅提供帮助!

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

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

相关文章

Linux系统移植篇(十一)Linux 内核启动流程

要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才 会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以 找到 Linux 内核的第一行程序是从哪里执行的。vmlinux.lds …

功能强大的电脑硬件检测及驱动安装工具

今天给大家带来一款超实用的电脑硬件检测软件——入梦工具箱。它是开源的,全程无广告干扰,使用起来清爽又安心。 打开入梦工具箱,进入“硬件信息”选项,电脑各个配件的详细参数一目了然。 无论是CPU的型号、频率,还是…

【Altium Designer】设计技巧

目录 技巧一:铺铜连接方式 技巧二:铺铜连接方式 技巧一:铺铜连接方式 Design -> Rules -> PolygonConnect 三种选择: 1)Relief Connect:十字连接,可选择是45还是90 2)Direct…

基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等

板卡简介: 本板为模拟量高速采样板(ADI),主要用于电机转速和相电流检测,以实现电机闭环控制。 性能规格: 电源:DC5V,DC3.3V,DC15V,DC24V FPGA:…

6. 顺序表和链表*****

目录 1. 顺序表 1.1 原理 1.2 常见的增删查改 1.3 顺序表的问题 2. 链表 2.1 原理 2.2 无头单向非循环的增删查改 2.3 链表面试题 1. 删除链表中等于给定值val的所有节点203. 移除链表元素 2. 链表逆置206. 反转链表(考的最多) 3.给你单链表的…

【AVRCP】蓝牙协议栈深度解析:AVCTP互操作性核心机制与实现细节

目录 一、事务标签(Transaction Label)机制 1.1 事务标签核心规则 1.2 事务标签作用域与并发性 1.3 实现建议与陷阱规避 1.4 协议设计思考 1.5 调试与验证 二、消息分片(Fragmentation)机制 2.1 分片触发条件 2.2 分片支…

【MySQL】基本查询(下)

文章目录 1.筛选分页结果2.Update3.Delete4.截断表5.插入查询结果6.聚合函数6.1什么是聚合函数6.2常见的聚合函数 7.group by7.1如何显示每个部门的平均工资和最高工资7.2显示每个部门的每种岗位的平均工资和最低工资7.3显示平均工资低于2000的部门和它的平均工资 8.总结 1.筛选…

Xpath Helper 替代 - XPath 测试器

Xpath Helper 最近开始(2025.03)无法使用了,选找了几款替代品,XPath 测试器 是目前看来最好的。 XPath 测试器 市场地址: https://chromewebstore.google.com/detail/xpath-测试器/cneomjecgakdfoeehmmmoiklncdiodmh …

C++学习之云盘项目nginx

1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…

JAVA学习*抽象类

抽象类 在Java中,被abstract关键字修饰的类被称为抽象类。 特点 1、当一个类继承了抽象类,一定要重写抽象方法!!! public abstract class Animal {public int age;public String name;//抽象方法public abstract v…

数据库管理-第303期 数据库相关硬件文章汇总(20250319)

数据库管理303期 2025-03-19 数据库管理-第303期 数据库相关硬件文章汇总(20250319)1 CPU & 内存2 SSD3 RDMA4 存储5 CXL6 硬件采购7 数据库一体机总结 数据库管理-第303期 数据库相关硬件文章汇总(20250319) 作者&#xff1…

OctoTools:一个具有复杂推理可扩展工具的智体框架

25年2月来自斯坦福大学的论文“OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning”。 解决复杂的推理任务可能涉及视觉理解、域知识检索、数值计算和多步骤推理。现有方法使用外部工具增强大语言模型 (LLM),但仅限于专业领域、有限的…

Canary

定义: Canary是一种用以防护栈溢出的保护机制。 原理: 是在一个函数的入口处,先从fs/gs寄存器中取出一个4字节(eax,四字节通常是32位的文件)或者8字节(rax,通常是64位的文件)的值…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分

checksec exeinfo 开启了全保护 64位 查看函数: 堆题 增删查改齐了 可以在编辑堆的时候重新设置大小 存在堆溢出 delete函数的指针清零了 无UAF 想法是通过unsorted bin泄露libc基址: from pwn import *p process(./babyheap) #p remote("node…

【C++指南】内存管理完全手册:new/delete

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C内存管理的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享…

Vue3组合式函数(滚动监测 useScroll)

主要用于实时监测目标元素滚动位置及状态 工具函数源码 /*** 组合式函数* 实时监测目标元素滚动位置及状态** 自定义钩子用于处理滚动事件和状态* param target 滚动目标元素,可以是 Ref、HTMLElement、Window 或 Document,默认为 window* param throt…

Vue.js+Element UI 登录界面开发详解【附源码】

成果图: 一、技术架构解析 本登录模块采用前后端分离架构,前端基于Vue.jsElement UI实现交互逻辑,主要包含以下技术要点: ​组件化开发 - 采用单文件组件形式组织代码​响应式设计 - 实现多终端适配​状态管理 - 使用sessionSto…