支持向量机 (SVM) 算法详解

支持向量机 (SVM) 算法详解

支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 特别适合高维数据,并且在处理复杂非线性数据时表现出色。本文将详细讲解 SVM 的原理、数学公式、应用场景及其在 Python 中的实现。

什么是支持向量机?

支持向量机的目标是找到一个最佳的决策边界(或称超平面)来最大限度地分隔不同类别的数据点。对于线性可分的数据,SVM 通过一个线性超平面进行分类;对于线性不可分的数据,SVM 可以通过核方法(Kernel Trick)将数据映射到高维空间,使其在高维空间中线性可分。

SVM 的基本原理

线性支持向量机

对于线性可分的数据,SVM 寻找一个超平面将数据集分隔成两个类别,同时最大化两个类别之间的边界(margin)。边界上的点称为支持向量(Support Vectors)。

数学公式

假设我们有一个训练数据集   ( x i , y i ) i = 1 n \ {(x_i, y_i)}_{i=1}^n  (xi,yi)i=1n , 其中   x i ∈ R d \ x_i \in \mathbb{R}^d  xiRd 表示第   i \ i  i个样本,   y i ∈ { − 1 , 1 } \ y_i \in \{-1, 1\}  yi{1,1},表示第 (i) 个样本的类别标签。

超平面的方程可以表示为:
  w ⋅ x + b = 0   \ w \cdot x + b = 0 \  wx+b=0 
其中   w \ w  w 是法向量,决定了超平面的方向,   b \ b  b 是偏置项,决定了超平面的距离。

目标是找到   w \ w  w   b \ b  b,使得所有样本点满足:
  y i ( w ⋅ x i + b ) ≥ 1   \ y_i (w \cdot x_i + b) \geq 1 \  yi(wxi+b)1 
同时,我们希望最大化边界,即最小化 (|w|),所以优化问题可以表示为:
  min ⁡ w , b 1 2 ∥ w ∥ 2   \ \min_{w,b} \frac{1}{2} \|w\|^2 \  w,bmin21w2 
约束条件为:
  y i ( w ⋅ x i + b ) ≥ 1 , ∀ i \ y_i (w \cdot x_i + b) \geq 1, \forall i  yi(wxi+b)1,i

非线性支持向量机

对于线性不可分的数据,SVM 通过引入核函数(Kernel Function)将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括:

  • 多项式核(Polynomial Kernel)
  • 径向基函数核(Radial Basis Function, RBF Kernel)
  • 高斯核(Gaussian Kernel)

核函数的表示为   K ( x i , x j ) = ϕ ( x i ) ⋅ ϕ ( x j ) \ K(x_i, x_j) = \phi(x_i) \cdot \phi(x_j)  K(xi,xj)=ϕ(xi)ϕ(xj),其中 (\phi) 是将数据映射到高维空间的映射函数。

松弛变量

为了处理噪声和异常值,SVM 引入了松弛变量 ξ i \xi_i ξi,使得优化问题变为:
  min ⁡ w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i \ \min_{w,b,\xi} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n \xi_i  w,b,ξmin21w2+Ci=1nξi
约束条件为:
  y i ( w ⋅ x i + b ) ≥ 1 − ξ i , ∀ i   ξ i ≥ 0 , ∀ i \ y_i (w \cdot x_i + b) \geq 1 - \xi_i, \forall i \ \xi_i \geq 0, \forall i  yi(wxi+b)1ξi,i ξi0,i

其中   C \ C  C 是惩罚参数,控制软间隔的宽度。

SVM 的优缺点

优点

  1. 有效处理高维数据:SVM 在高维空间中依然表现良好。
  2. 适合复杂非线性数据:通过核方法,SVM 能有效处理非线性数据。
  3. 鲁棒性强:SVM 对于部分噪声和异常值具有较强的鲁棒性。

缺点

  1. 计算复杂度高:尤其在大规模数据集上,训练时间较长。
  2. 参数选择敏感:核函数、惩罚参数   C \ C  C 等需要仔细调优。
  3. 结果不可解释性:相比于决策树等模型,SVM 的结果较难解释。

SVM 的 Python 实现

下面通过 Python 代码实现 SVM 算法,并以一个示例数据集展示其应用。

导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix

生成示例数据集

# 生成示例数据集
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='bwr')
plt.title('原始数据集')
plt.show()

在这里插入图片描述

应用 SVM 算法

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 应用 SVM 算法
svm = SVC(kernel='linear', C=1.0)
svm.fit(X_train, y_train)
y_pred = svm.predict(X_test)

# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

# 可视化决策边界
def plot_decision_boundary(X, y, model):
    h = .02
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap='bwr', alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='bwr')
    plt.title('SVM 决策边界')
    plt.show()

plot_decision_boundary(X_test, y_test, svm)

在这里插入图片描述

结果解释

在上面的示例中,我们生成了一个二分类的示例数据集,并使用 SVM 算法对其进行分类。最终,我们通过可视化展示了决策边界以及测试集上的分类结果。

总结

支持向量机是一种强大的监督学习算法,适用于处理复杂的高维和非线性数据。本文详细介绍了 SVM 的原理、数学公式、应用场景以及 Python 实现。虽然 SVM 在某些方面有其局限性,但通过合理选择参数和核函数,可以在许多实际应用中取得优异的效果。希望本文能帮助你更好地理解和应用支持向量机算法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装cuda、cudnn、Pytorch(用cuda和cudnn加速计算)

写在前面 最近几个月都在忙着毕业的事,好一阵子没写代码了。今天准备跑个demo,发现报错 AssertionError: Torch not compiled with CUDA enabled 不知道啥情况,因为之前有cuda环境,能用gpu加速,看这个报错信息应该是P…

基于百度飞桨PaddleOCR应用开发实践银行卡卡面内容检测识别系统

OCR相关的内容我在之前的工作中虽有所涉及,但是还是比较少的,最近正好需要用到OCR的一些技术,查了一些资料,发现国内的话百度这块做的还是比较全面系统深入的,抱着闲来无事学习了解的心态,这里花了点时间基…

八大排序————C语言版实现

Hello,各位未来的高级程序员们,大家好,今天我就来为大家讲解一下有关排序的内容,我们常见的排序就是我们接下来要讲的这八个排序,我们平常所说的排序有十大排序,我们这里的八大排序是我们生活中最为常见的八…

h5兼容问题 复制粘贴移动端无法粘贴复制内容

const selectText (textbox, startIndex, stopIndex) > {if (textbox.createTextRange) {//ieconst range textbox.createTextRange();range.collapse(true);range.moveStart(character, startIndex);//起始光标range.moveEnd(character, stopIndex - startIndex);//结束光…

西门子PLC1200--与电脑连接的TCP通讯

本例演示将PLC作为服务器,电脑作为客户端,进行通讯。 反过来也是一回事,就不啰嗦了。 二者进行TCP通讯,是基于网线的,电脑上用的是网口,PLC上用的是Profinet接口,即PN口。 软件工具准备 西门子…

SQL注入-下篇

HTTP注入 一、Referer注入 概述 当你访问一个网站的时候,你的浏览器需要告诉服务器你是从哪个地方访问服务器的。如直接在浏览器器的URL栏输入网址访问网站是没有referer的,需要在一个打开的网站中,点击链接跳转到另一个页面。 Less-19 判…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程(类的生命周期)3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

java:动态代理和cglib代理的简单例子

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89457803 # 项目代码 【pom.xml】 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version&…

ATA-2032高压放大器设计要求是什么内容

高压放大器是一种专门用于放大高电压信号的电子设备。它在许多领域都具有重要的应用&#xff0c;例如在医疗设备、科学研究、传感器驱动和测试测量等方面。设计一个高压放大器需要考虑多个因素&#xff0c;包括性能要求、安全性、稳定性和可靠性等方面。下面我们将详细讨论高压…

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…

差分数组汇总

本文涉及知识点 算法与数据结构汇总 差分数组 令 a[i] ∑ j : 0 i v D i f f [ i ] \sum_{j:0}^{i}vDiff[i] ∑j:0i​vDiff[i] 如果 vDiff[i1]&#xff0c;则a[i1…]全部 如果vDiff[i2]–,则a[i2…]全部–。 令11 < i2 &#xff0c;则&#xff1a; { a [ i ] 不变&…

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志&#xff0c;保存了事务发生之前的数据的一个版本&#xff0c;用于事务执行时的回滚操作&#xff0c;同时也是实现多版本并发控制&#xff08;MVCC&#xff09;下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性&#xff0c;也就是事务中的操作要…

【OpenHarmony开发】自定义系统应用之实践

前言 OpenHarmony系统应用是指预装在OpenHarmony操作系统中的应用程序&#xff0c;也称为系统应用。这些应用程序通常由操作系统开发者开发&#xff0c;包括系统设置、电话、短信、浏览器、相机、音乐、视频等常用应用程序。这些应用程序通常具有更高的权限和更深入的系统集成…

解决ERROR: Cannot uninstall ‘ipython-genutils‘.的方法

删除ipython-genutils-X-pyX.egg-info文件&#xff0c;X表示对应版本&#xff0c;问题解决。

昇思25天学习打卡营第1天|基本介绍及快速入门

1.第一天学习总体复盘 1&#xff09;成功注册昇思大模型平台&#xff0c;并成功申请算力&#xff1b; 2)在jupyter环境下学习初学入门/初学教程的内容&#xff1b; 在基本介绍部分&#xff0c;快速撸了一边内容&#xff0c;有了一个基本的了解&#xff08;没理解到位的计划采用…

Java | Leetcode Java题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…

spark 整合 yarn

spark 整合 yarn 1、在master节点上停止spark集群 cd /usr/local/soft/spark-2.4.5/sbin ./stop-all.sh 2、spark整合yarn只需要在一个节点整合, 可以删除node1 和node2中所有的spark文件 分别在node1、node2 的/usr/local/soft目录运行 rm -rf spark-2.4.…

前端 CSS 经典:边框转圈动画效果

前言&#xff1a;首先我们要知道 css 动画只对数值类的 CSS 属性起作用。要实现边框转圈动画效果&#xff0c;实际就是渐变背景的旋转。但是在以前&#xff0c;渐变背景是不支持动画的。现在我们可以利用浏览器新出的 Houdini API 来实现这个动画效果。Houdini API 特别强大&am…

数据结构_栈和队列

目录 一、栈 1.1 栈的使用 1.2 模拟实现栈 二、队列 2.1 队列的使用 2.2 环形队列 2.3 双端队列 总结 一、栈 栈是只允许在固定的一端进行元素的插入和删除操作的一种特殊线性表。其中进行元素的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈遵循先进后…

数据分析第十一讲:pandas应用入门(六)

pandas应用入门&#xff08;六&#xff09; 我们再来看看Index类型&#xff0c;它为Series和DataFrame对象提供了索引服务&#xff0c;有了索引我们就可以排序数据&#xff08;sort_index方法&#xff09;、对齐数据&#xff08;在运算和合并数据时非常重要&#xff09;并实现…