支持向量机(SVMs)是强大的监督学习算法,用于分类和回归任务,尽管它们主要用于分类。由Vladimir Vapnik及其同事在1990年代引入,SVMs基于统计学习理论,特别适用于需要将数据点稳健分离到不同类别的任务。本博客深入探讨SVMs背后的理论、驱动它们的数学、实用的代码实现,并以测验问题结束来测试您的理解。

什么是支持向量机?

SVMs旨在找到最优超平面,以最大边距分离不同类别的数据点。"边距"指的是超平面与任一类别最近数据点之间的距离。通过最大化这个边距,SVMs实现了稳健的泛化,使它们对噪声和过拟合的敏感性低于决策树或k近邻等其他分类器。

对于数据不是线性可分的情况,SVMs使用"核技巧"将数据转换到更高维的空间,在那里可以建立线性边界。这种灵活性,结合其理论稳健性,使SVMs成为文本分类、图像识别和生物信息学等应用的首选。

SVMs理论

线性可分数据

对于二分类问题,考虑一个具有两个类别的数据集,标记为+1和-1。目标是找到一个由wTx+b=0\mathbf{w}^T \mathbf{x} + b = 0wTx+b=0定义的超平面,其中w\mathbf{w}w是权重向量,x\mathbf{x}x是输入向量,bbb是偏置项。这个超平面分离数据,使得:

  • 对于类别+1:wTxi+b>0\mathbf{w}^T \mathbf{x}_i + b > 0wTxi+b>0
  • 对于类别-1:wTxi+b<0\mathbf{w}^T \mathbf{x}_i + b < 0wTxi+b<0

边距定义为从超平面到最近数据点的距离,称为支持向量。最优超平面最大化这个边距,确保类别之间的最大可能分离。点x\mathbf{x}x到超平面的距离由下式给出:

距离=∣wTx+b∣∥w∥ \text{距离} = \frac{|\mathbf{w}^T \mathbf{x} + b|}{\|\mathbf{w}\|} 距离=wwTx+b

为了最大化边距,SVMs最小化∥w∥2\|\mathbf{w}\|^2w2(因为边距与1/∥w∥1/\|\mathbf{w}\|1/∥w成正比),受约束:

di(wTxi+b)≥1 d_i (\mathbf{w}^T \mathbf{x}_i + b) \geq 1 di(wTxi+b)1

其中di∈{+1,−1}d_i \in \{+1, -1\}di{+1,1}是第iii个样本的类别标签。

不可分数据

在真实世界的数据集中,由于噪声或重叠,完美的线性分离通常是不可能的。SVMs通过引入松弛变量ξi\xi_iξi来处理这个问题,这允许一些错误分类。优化问题变为:

min⁡w,b,ξ12∥w∥2+C∑i=1Nξi \min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^N \xi_i w,b,ξmin21w2+Ci=1Nξi

受约束:

di(wTxi+b)≥1−ξi,ξi≥0 d_i (\mathbf{w}^T \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0 di(wTxi+b)1ξi,ξi0

这里,CCC是一个超参数,控制最大化边距和最小化分类错误之间的权衡。大的CCC优先考虑正确分类,而较小的CCC允许更多错误分类以获得更宽的边距。

核技巧

对于非线性可分数据,SVMs使用核函数将输入数据映射到更高维的空间。常见的核包括:

  • 线性核K(xi,xj)=xiTxjK(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i^T \mathbf{x}_jK(xi,xj)=xiTxj
  • 多项式核K(xi,xj)=(xiTxj+c)dK(\mathbf{x}_i, \mathbf{x}_j) = (\mathbf{x}_i^T \mathbf{x}_j + c)^dK(xi,xj)=(xiTxj+c)d
  • 径向基函数(RBF)核K(xi,xj)=exp⁡(−γ∥xi−xj∥2K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma \|\mathbf{x}_i - \mathbf{x}_j\|^2K(xi,xj)=exp(γxixj2

核技巧允许SVMs在转换空间中计算点积,而无需显式计算转换,使其计算效率高。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_circles# Generate non-linearly separable data (concentric circles)
X, y = make_circles(n_samples=100, factor=0.3, noise=0.1, random_state=42)# Train SVM with RBF kernel
clf_rbf = svm.SVC(kernel='rbf', C=1.0, gamma='scale')
clf_rbf.fit(X, y)# Plot decision boundary and data points
def plot_decision_boundary(X, y, model):h = .02  # Step size in the meshx_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, 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=plt.cm.coolwarm, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, edgecolors='k')plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k', label='Support Vectors')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.title('SVM with RBF Kernel - Kernel Trick Example')plt.legend()plt.show()plot_decision_boundary(X, y, clf_rbf)

请添加图片描述

数学公式

原始问题

线性可分数据的原始问题是:

min⁡w,b12∥w∥2 \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 w,bmin21w2

受约束:

di(wTxi+b)≥1,i=1,…,N d_i (\mathbf{w}^T \mathbf{x}_i + b) \geq 1, \quad i = 1, \ldots, N di(wTxi+b)1,i=1,,N

对于不可分数据,如前所述引入松弛变量。

对偶问题

原始问题通常使用拉格朗日乘数αi\alpha_iαi在其对偶形式中求解。对偶问题是:

max⁡α∑i=1Nαi−12∑i=1N∑j=1NαiαjdidjK(xi,xj) \max_{\alpha} \sum_{i=1}^N \alpha_i - \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j d_i d_j K(\mathbf{x}_i, \mathbf{x}_j) αmaxi=1Nαi21i=1Nj=1NαiαjdidjK(xi,xj)

受约束:

∑i=1Nαidi=0,0≤αi≤C \sum_{i=1}^N \alpha_i d_i = 0, \quad 0 \leq \alpha_i \leq C i=1Nαidi=0,0αiC

权重向量则为:

w=∑i=1Nαidixi \mathbf{w} = \sum_{i=1}^N \alpha_i d_i \mathbf{x}_i w=i=1Nαidixi

支持向量是αi>0\alpha_i > 0αi>0的点。偏置bbb使用边距上的支持向量计算(其中0<αi<C0 < \alpha_i < C0<αi<C):

b=di−wTxi b = d_i - \mathbf{w}^T \mathbf{x}_i b=diwTxi

Karush-Kuhn-Tucker(KKT)条件

对于不可分数据,KKT条件确保最优性:

αi[di(wTxi+b)−1+ξi]=0 \alpha_i [d_i (\mathbf{w}^T \mathbf{x}_i + b) - 1 + \xi_i] = 0 αi[di(wTxi+b)1+ξi]=0
βiξi=0 \beta_i \xi_i = 0 βiξi=0
αi≥0,βi≥0 \alpha_i \geq 0, \quad \beta_i \geq 0 αi0,βi0

这些条件有助于识别支持向量并计算偏置项。

在Python中实现SVMs

让我们使用Python的scikit-learn库实现一个简单的SVM分类器。以下示例演示了在合成数据集上训练SVM并可视化决策边界。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_classification# 生成合成数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_clusters_per_class=1, random_state=42)# 使用线性核训练SVM
clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(X, y)# 绘制决策边界
def plot_decision_boundary(X, y, model):h = .02  # 网格中的步长x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, 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=plt.cm.coolwarm, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, edgecolors='k')plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k', label='支持向量')plt.xlabel('特征1')plt.ylabel('特征2')plt.title('SVM决策边界')plt.legend()plt.show()plot_decision_boundary(X, y, clf)# 打印支持向量
print("支持向量:\n", clf.support_vectors_)

这段代码生成合成数据集,训练线性SVM,并绘制决策边界以及支持向量。支持向量是最接近超平面的点,用黑色圆圈标记。

请添加图片描述
我来将这段关于核技巧的文本翻译成中文:

SVMs中的核技巧通过隐式地将数据映射到更高维空间来实现非线性分离,而无需显式计算转换。以下是它在提供代码中的工作原理:

  1. 数据:代码使用make_circles生成同心圆的2D数据集,这在2D空间(特征1,特征2)中是非线性可分的。

  2. 核技巧:SVM使用RBF(径向基函数)核(kernel='rbf')。这个核计算点之间的相似性,就像它们在更高维空间中一样。对于两个点xi\mathbf{x}_ixixj\mathbf{x}_jxj,RBF核为:

    K(xi,xj)=exp⁡(−γ∥xi−xj∥2) K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma \|\mathbf{x}_i - \mathbf{x}_j\|^2) K(xi,xj)=exp(γxixj2)

    这个核有效地将2D点映射到更高维空间,在那里线性边界(超平面)可以分离内圆和外圆。

  3. 为什么需要更高维度?:在2D中,没有直线可以分离这些圆。RBF核将数据转换到一个空间,其中在2D中较近的点(同一类别)具有高相似性,而相距较远的点(不同类别)具有低相似性。例如,2D圆可能被映射到3D空间,其中一个类别形成"碗"状,另一个形成"环"状,可以通过平面分离。核在这个空间中计算点积,而无需显式计算坐标。

  4. 代码机制

    • svm.SVC(kernel='rbf', C=1.0, gamma='scale'):使用RBF核训练SVM。gamma参数控制决策边界的形状。
    • plot_decision_boundary:在2D中可视化决策边界。等高线图显示了由核创建的非线性边界,它分离了这些圆。边界是更高维超平面在2D中的投影。
    • 支持向量(圆圈标记的点)是边界附近的关键点,它们定义了超平面。
  5. 为什么你看不到更高维度:核技巧避免了显式计算高维坐标,使其计算效率高。图保持在2D,显示决策边界为复杂曲线,这是更高维线性分离投影回2D的结果。

本质上,RBF核允许SVM"看到"数据,就像它在更高维空间中一样,在2D中创建非线性边界,完美地分离这些圆,如图中所示。

使用RBF核的非线性SVM

对于非线性可分数据,我们可以使用RBF核:

# 使用RBF核训练SVM
clf_rbf = svm.SVC(kernel='rbf', C=1.0, gamma='scale')
clf_rbf.fit(X, y)# 绘制决策边界
plot_decision_boundary(X, y, clf_rbf)

RBF核允许SVM创建非线性决策边界,这对于复杂数据集很有用。

实际考虑

  1. 选择核:核的选择取决于数据。线性核对于大型数据集更快,而RBF核对于非线性关系更好,但需要调整γ\gammaγ参数。
  2. 超参数调优:参数CCCγ\gammaγ显著影响性能。使用网格搜索或交叉验证找到最优值。
  3. 特征缩放:SVMs对特征尺度敏感。在训练前标准化或归一化特征。
  4. 计算复杂度:训练SVMs对于大型数据集可能在计算上很密集。考虑使用LIBSVM等库或近似方法以提高可扩展性。

SVMs的应用

SVMs广泛应用于:

  • 文本分类:用于垃圾邮件检测或情感分析等任务,其中高维特征空间很常见。
  • 图像分类:用于区分图像中的对象,如人脸识别。
  • 生物信息学:用于基于序列数据对蛋白质或基因进行分类。
  • 金融:用于信用评分或欺诈检测。

优势和局限性

优势

  • 由于边距最大化,对过拟合具有稳健性。
  • 在高维空间中有效。
  • 具有不同核函数的通用性。

局限性

  • 对于大型数据集计算昂贵。
  • 对特征缩放敏感。
  • 与决策树相比可解释性较差。

测验问题

  1. SVM在二分类任务中的主要目标是什么?
  2. 核技巧如何使SVMs能够处理非线性可分数据?
  3. 松弛变量ξi\xi_iξi在SVM优化问题中的作用是什么?
  4. 写出具有线性核的SVM的对偶问题公式。
  5. 解释KKT条件在SVM优化中的重要性。
  6. 超参数CCC如何影响SVM的性能?
  7. 在提供的Python代码中,plot_decision_boundary函数做什么?
  8. 为什么在使用SVMs时特征缩放很重要?
  9. 硬边距和软边距SVM之间有什么区别?
  10. 如何使用scikit-learn识别训练好的SVM模型中的支持向量?

本博客提供了SVMs的综合概述,融合了理论、数学和实际实现。通过理解概念并实验代码,您可以利用SVMs的力量来完成机器学习任务。

测验答案

  1. 找到最大化两个类别之间边距的超平面。
  2. 将数据映射到更高维空间进行线性分离,而无需显式转换。
  3. 允许不可分数据中的错误分类,平衡边距和错误。
  4. max⁡α∑i=1Nαi−12∑i,jαiαjdidjxiTxj\max_{\alpha} \sum_{i=1}^N \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j d_i d_j \mathbf{x}_i^T \mathbf{x}_jmaxαi=1Nαi21i,jαiαjdidjxiTxj,受约束∑i=1Nαidi=0\sum_{i=1}^N \alpha_i d_i = 0i=1Nαidi=00≤αi≤C0 \leq \alpha_i \leq C0αiC
  5. 确保最优性,识别支持向量,并计算偏置项。
  6. 控制权衡:大的CCC优先考虑正确分类,小的CCC扩大边距。
  7. 为2D数据集绘制SVM决策边界和支持向量。
  8. 确保特征贡献相等,因为SVMs对尺度差异敏感。
  9. 硬边距需要完美分离;软边距允许使用松弛变量的错误分类。
  10. 在scikit-learn的训练好的SVM模型中访问support_vectors_属性。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Navicat对PostgreSQL数据表添加列,自动记录当前行的添加日期

点开表设计&#xff0c;向如下这样一个字段&#xff1a; 字段名称可以自定义&#xff0c;博主这里叫做&#xff1a;add_date_time类型选择&#xff1a;timestamp长度写成&#xff1a;6默认值输入&#xff1a;CURRENT_TIMESTAMP 添加行&#xff1a;默认值&#xff1a;

VR协作海外云:跨国企业沉浸式办公解决方案

随着全球化进程加速&#xff0c;VR协作海外云正成为跨国企业数字化转型的核心解决方案。本文将深入解析这项技术如何突破地理限制&#xff0c;实现沉浸式远程协作&#xff0c;并探讨其在跨文化团队管理、实时3D数据交互等场景中的独特优势。 VR协作海外云&#xff1a;跨国企业沉…

[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)

ps:这是你为了点灯最繁琐的一次 1.软件下载 vscode下载地址&#xff1a;Documentation for Visual Studio Codeesp_idf下载地址&#xff1a;https://dl.espressif.cn/dl/esp-idf/?idf4.4 (从上往下第三&#xff09; 2.软件安装 可以均默认安装&#xff0c;但建议不要放在C盘&…

tailwindcss详解

Tailwind CSS 详解&#xff1a;实用主义的现代 CSS 框架 Tailwind CSS 是一个功能优先&#xff08;utility-first&#xff09;的 CSS 框架&#xff0c;它通过提供低级别的实用类来快速构建自定义设计&#xff0c;而无需离开 HTML 文件。以下是全面解析&#xff1a; 一、核心概念…

[spring6: TypeFilter MetadataReader MetadataReaderFactory]-源码解析

源码 MetadataReaderFactory MetadataReaderFactory 是用于创建 MetadataReader 实例的工厂接口&#xff0c;支持通过类名或资源读取类的元数据并可实现缓存优化。类型类/接口名功能描述是否需要加载类访问方式抽象接口AnnotatedTypeMetadata访问某类型&#xff08;类或方法&am…

基于redis的分布式session共享管理之销毁事件不生效问题

一、前言首先介绍下分布式session共享管理在Springboot项目中&#xff0c;经常提到分布式的概念&#xff0c;当实际部署应用后&#xff0c;多台服务器各自存储用户登录会话无法共享&#xff0c;导致操作A按钮还是正常&#xff0c;操作B按钮就提示登录过期需要重新登录。这是因为…

技术面试问题总结二

一、lvs的四种工作模式: LVS 有四种主要工作模式&#xff1a;NAT 模式、DR 模式、TUN 模式和Full-NAT 模式 1、NAT模式&#xff1a; 工作原理 LVS 作为客户端和真实服务器&#xff08;RS&#xff09;之间的中间节点&#xff0c;接收客户端请求后&#xff0c;修改请求的目标…

软考(软件设计师)软件工程-软件过程模型,敏捷开发

软件过程模型 瀑布模型 #mermaid-svg-daxck2eQmqfYelkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-daxck2eQmqfYelkV .error-icon{fill:#552222;}#mermaid-svg-daxck2eQmqfYelkV .error-text{fill:#552222;stro…

MySQL 中图标字符存储问题探究:成因、解决方案及单字段编码调整的利弊分析——仙盟创梦IDE

在 MySQL 数据库应用中&#xff0c;常出现无法正确保存图标字符&#xff0c;读出时显示为 “????” 的问题。本文深入剖析了该问题产生的原因&#xff0c;主要涉及字符编码设置不匹配等因素。同时&#xff0c;提出了全面的解决方案&#xff0c;包括全局和单字段的字符编码调…

快速上手UniApp(适用于有Vue3基础的)

作为一位有Vue3基础的开发者&#xff0c;学习UniApp将会是一个相对平滑的过程。UniApp是一个使用Vue.js开发跨平台应用的前端框架&#xff0c;可以编译到iOS、Android、H5以及各种小程序平台。 一、UniApp简介 UniApp是基于Vue.js的跨平台开发框架&#xff0c;具有以下特点&a…

background和background-color的区别

前言&#xff1a;由于全局切换变量时&#xff0c;发现空页面按钮变量颜色未生效&#xff0c;审查元素发现变量未定义。实际上是背景色由纯色变成了渐变色&#xff0c;而background-color不支持渐变色导致变量不生效特性backgroundbackground-color功能设置‌所有‌背景属性&…

Vue Vue-route (5)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route History模式和路由懒加载 目录 History模式 设置history模式 后端配置 Apache 路由懒加载 配置 总结 History模式 设置history模式 Vue-route默认hash模式——使用URL的hash来模拟一个完整的URL&#xff0c…

家用智能摄像机PRV文件删除的恢复方法

家用智能摄像头一般采用的是mp4或者mov视频方案&#xff0c;这一类方案文件通用性强、使用简单&#xff0c;以MP4为例无论是APP在线播放还是TF卡接电脑查看都很轻松。即便如此&#xff0c;有些厂商还是走上了“自定义”的道路&#xff0c;自定义的文件结构导致无法正常播放&…

聊下easyexcel导出

直接上干货&#xff0c;首先pom文件引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>接下来是java代码 public void export(List<Liquidity…

[Python] Flask 多线程绘图时报错“main thread is not in main loop”的解决方案

在构建基于 Flask 的后端服务过程中,使用 matplotlib 绘图时,很多开发者会遇到一个经典的运行时错误: RuntimeError: main thread is not in main loop这通常出现在服务开启多线程时调用 matplotlib,本文将从原理、解决方式到部署建议进行全面解析。 一、问题来源:matpl…

dbEaver连接hbase,各种问题的终极解决

网上有不少文章&#xff0c;但基本都不行&#xff0c;主要还是hbase版本和phoenix版本的问题&#xff0c;经我测试&#xff0c;如下方法保证能连接成功。 1、下载phoenix: https://phoenix.apache.org/download.html 要选择和你的hbase版本对应的版本。 2、解压phoenix-hbase-2…

selenium中find_element()用法进行元素定位

1. 导入必要的模块首先需要导入 By 类&#xff1a;from selenium.webdriver.common.by import By2. 常用定位方式(1) 通过ID定位element driver.find_element(By.ID, "username") element.send_keys("testuser") # 输入内容 (2) 通过Name定位element dr…

第八讲~~数据库技术

前言&#xff1a;什么是数据库&#xff1f;存储数据的仓库。常见的数据库有哪些&#xff1f;————SQL Server&#xff08;数据库较大 5G&#xff09;————Access————Oracle&#xff08;大型数据库700多兆-200多兆&#xff09;&#xff08;付费&#xff09;————My…

无人机雷达模块运行与技术解析

一、运行方式1. 传感器数据采集 雷达发射高频电磁波&#xff08;X/Ku波段或毫米波&#xff09;&#xff0c;接收无人机反射的回波信号。 多传感器协同&#xff1a;雷达与光电、无线电侦测、声学设备并行扫描空域&#xff0c;覆盖不同频段与物理特性&#xff08;如热信号、声纹…

STM32中ADC详解

前言 在嵌入式系统中&#xff0c;模拟信号与数字信号的转换是连接物理世界与数字系统的核心环节。ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09;作为实现这一转换的关键外设&#xff0c;被广泛应用于传感器数据采集&#xff08;如温湿度、光照…