分类算法——支持向量机 详解

支持向量机(Support Vector Machine, SVM)的底层原理

        支持向量机是一种用于分类和回归的强大机器学习算法,最常见的是用于二分类任务。SVM 的核心思想是通过找到一个最优超平面,将数据集划分成不同的类别。SVM 尤其擅长处理高维数据,且能在数据少的情况下提供较好的分类效果。

1. SVM 的基本概念

在 SVM 中,主要有几个核心概念:

  • 超平面(Hyperplane):在特征空间中划分数据的决策边界。对于二维数据来说,超平面是一条线;对于三维数据来说,超平面是一个平面。
  • 支持向量(Support Vector):离决策边界最近的样本点。支持向量是定义超平面位置和方向的关键数据点。
  • 间隔(Margin):支持向量与超平面之间的距离。SVM 通过最大化间隔来优化超平面,使得分类更具泛化能力。
2. 线性可分的情况

        在数据线性可分的情况下,支持向量机旨在找到一个超平面来将不同类别的数据完全分开,且间隔最大化。对于一个线性可分的数据集,我们可以用以下决策函数来表示:

f(x)=w*x+b

其中,w 是法向量,b 是偏置。我们的目标是使得正负类样本点满足以下条件:

y_{i}\left ( w*x_{i} + b \right ) \geqslant 1

为了最大化间隔,我们要最小化 \left \| w \right \|,即解决以下优化问题:

min\frac{1}{2}\left \| w \right \|^{2}

同时满足约束条件:

y_{i}\left ( w*x_{i} + b \right ) \geqslant 1,i=1, ...,N

        这个优化问题可以通过 拉格朗日乘子法 转化为对偶问题,并使用 SMO 算法或其它优化算法求解。

3. 线性不可分的情况:软间隔与惩罚项

在实际应用中,数据往往并非线性可分。为此,我们引入 软间隔(Soft Margin) 和 惩罚项,允许少量样本出现在错误的分类区域内。

  • 定义松弛变量 ξiξi​,表示每个样本点偏离其正确分类的程度。
  • 优化目标变为最小化 \left \| w \right \| 和 \sum_{i=1}^{N}\xi _{i} 的加权和。

优化问题变为:

其中,C 是惩罚系数,平衡间隔最大化与分类错误之间的关系。

4. 核函数(Kernel Function)

        当数据在低维空间中不可分时,SVM 通过核函数将数据映射到更高维空间,在更高维度下寻找线性可分的超平面。常用的核函数包括:

  • 线性核:K(x,x′)=x⋅x′
  • 多项式核K(x,{x}')=\left ( x*{x}' + c \right )^{d}
  • 高斯核(RBF 核):K(x,x′)=exp⁡(-\gamma \left \| x-{x}' \right \|^{2})
  • Sigmoid 核:K(x,x′)=tanh⁡(αx⋅x′+c)

        核函数的作用是避免直接在高维空间中计算数据点的坐标,通过核技巧(Kernel Trick),可以在低维空间进行计算,降低计算复杂度

5. SVM 的优化算法

        SVM 的优化问题通常会通过 拉格朗日对偶 转换为对偶问题,从而简化求解过程。对于大规模数据集,SMO(Sequential Minimal Optimization) 是常用的优化算法,其基本思想是每次只优化两个变量,使得复杂的约束条件转换为二元约束问题,从而高效求解。

SVM 实现细节:Python 源码分析

        在 scikit-learn 中,SVM 算法使用 SVC(支持向量分类)类实现,以下是基于 scikit-learn 的 SVC 类的代码示例:

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

# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取两个特征方便可视化
y = iris.target
y = y[y != 2]  # 仅使用两类样本进行二分类
X = X[y != 2]

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 构建 SVM 模型
clf = SVC(kernel='linear', C=1.0)
clf.fit(X_train, y_train)

# 打印支持向量
print("支持向量:", clf.support_vectors_)

# 预测测试集
y_pred = clf.predict(X_test)

# 可视化决策边界
def plot_decision_boundary(clf, X, y):
    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, 0.01),
                         np.arange(y_min, y_max, 0.01))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('SVM Decision Boundary')
    plt.show()

plot_decision_boundary(clf, X, y)

源码分析

scikit-learn 的 SVC 类是对 libsvm 的封装,核心参数和方法包括:

  • kernel:指定核函数类型,包括 'linear''poly''rbf''sigmoid' 等。
  • C:惩罚系数,控制软间隔的程度。
  • fit(X, y):训练模型。
  • predict(X):对测试数据进行分类预测。
  • support_vectors_:返回支持向量。

        在 fit 方法中,scikit-learn 会调用 libsvm 的训练接口,根据给定的数据和参数进行支持向量求解,通过 SMO 或其他优化算法找到最优解。

SVM 的应用场景

        SVM 适用于高维数据集和样本量较小的数据集。在文本分类、人脸识别、生物信息学等领域,SVM 都得到了广泛应用。

SVM 的优缺点

优点:
  1. 分类效果好:适合高维数据,且对样本量少的数据有很好的分类效果。
  2. 高泛化能力:通过最大化间隔使得模型具有更强的泛化能力。
  3. 多样性:可通过不同的核函数应对非线性问题。
缺点:
  1. 计算复杂度高:对于大规模数据集训练速度较慢,尤其是使用非线性核函数时。
  2. 对参数敏感:核函数类型、惩罚系数 C、核函数参数等对模型影响较大,需要通过调参找到最优组合。
  3. 解释性弱:相比于决策树等模型,SVM 的决策过程不易理解和解释。

SVM 的总结

        SVM 是一种强大的分类算法,适用于高维和小样本数据。其主要思想是找到一个最优超平面,最大化不同类别数据的间隔。通过软间隔和核函数,SVM 可以处理线性不可分数据。优化算法主要使用 SMO 或对偶问题求解。虽然 SVM 在分类效果上表现出色,但训练复杂度较高,对参数敏感。

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

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

相关文章

系统集成项目管理工程师考试时间

系统集成项目管理基础知识考试信息 题量:共 75 道题。考试时间:该科目考试时间为上午 8:30 - 12:30(或下午 14:30 - 18:30,但通常为上午)。基础知识科目最短作答时长 90…

微服务实战系列之玩转Docker(十六)

导览 前言Q:基于容器云如何实现高可用的配置中心一、etcd入门1. 简介2. 特点 二、etcd实践1. 安装etcd镜像2. 创建etcd集群2.1 etcd-node12.2 etcd-node22.3 etcd-node3 3. 启动etcd集群 结语系列回顾 前言 Docker,一个宠儿,一个云原生领域的…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

API接口开放与安全管控 - 原理与实践

API安全是接口开放的前提条件 在API对外开放时,确保其安全性至关重要,因为API直接暴露给外部环境,容易成为攻击目标。一旦被恶意利用,可能导致数据泄露、服务滥用等严重后果。因此,通过API网关实施严格的接口安全管理…

python实现钉钉群机器人消息通知(消息卡片)

直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…

32位汇编——通用寄存器

通用寄存器 什么是寄存器呢? 计算机在三个地方可以存储数据,第一个是把数据存到CPU中,第二个把数据存到内存中,第三个把数据存到硬盘上。 那这个所谓的寄存器,就是CPU中用来存储数据的地方。那这个寄存器有多大呢&a…

强大的接口测试可视化工具:Postman Flows

Postman Flows是一种接口测试可视化工具,可以使用流的形式在Postman工作台将请求接口、数据处理和创建实际流程整合到一起。如下图所示 Postman Flows是以API为中心的可视化应用程序开发界面。它提供了一个无限的画布用于编排和串连API,数据可视化来显示…

JavaScript 实战技巧:让你成为前端高手的必备知识3(进阶版)

一、DOM概述 (一)DOM操作 是指使用‌JavaScript操作文档对象模型(Document Object Model)的过程。‌文档对象模型是一种表示网页文档结构的方式,它将整个网页文档表示为一个树形结构,每个元素都是一个节点…

Python 网络爬虫教程:从入门到高级的全面指南

Python 网络爬虫教程:从入门到高级的全面指南 引言 在信息爆炸的时代,网络爬虫(Web Scraping)成为了获取数据的重要工具。Python 以其简单易用的特性,成为了网络爬虫开发的首选语言。本文将详细介绍如何使用 Python …

【抖音】a_bogus参数逆向分析

抖音回复评论: 点击——展开xxx条回复﹀就会出现 https://www.douyin.com/aweme/v1/web/comment/list/reply 直接搜又搜不到 分析调用堆栈 可以看到这个栈是有请求相关的数据的 上面一个栈 所以就是在bdms.js里面生成的 就在这里打上日志断点:“T…

基于SpringBoot的宠物健康咨询系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,宠物健康知识信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件,如下: 1.2 添加 CSV数据文件设置 ,如下: 1.3 接口请求体设置变量,如下: 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

elasticsearch 8.x 插件安装(六)之Hanlp插件

elasticsearch 8.x 插件安装(六)之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…

2024Python安装与配置IDE汉化教程

【一】Python解释器下载【运行环境】 【1】Python官网 [https://www.python.org](官网进不去的可以点击点击领取,100%免费!安装包) 包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】! 【…

华为自研仓颉编程语言官网上线 首个公测版本开放下载

仓颉编程语言官网正式公开上线,同时首个公测版本开放下载。本次仓颉编程语言官网上线了首页、在线体验、文档、学习、下载、动态以及三方库共六个模块,可供开发和学习和体验。 据悉,仓颉编程语言是在今年6月的华为开发者大会上正式公布&…

论文翻译 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES

摘要 最近的信息检索研究主要集中在如何从一个任务(通常有丰富的监督数据)转移到其他各种监督有限的任务上,其隐含的假设是从一个任务可以泛化到所有其他任务。然而,这忽略了这样一个事实,即存在许多多样化和独特的检索…

Virtuoso使用layout绘制版图、使用Calibre验证DRC、LVS、PEX抽取RC

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后,在原理图界面点击Launch,点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面,选中“Instance”&#…

微信小程序服务通知

项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…

QT(图表)

目录 QChart的继承关系 基本组件和概念 常见图表类型及其系列类 常用的图表配置 一、折线图示例 二、柱状图示例 三、饼图示例 四、类波形图(折线图)示例 QChart 模块提供了直观的图表绘制接口,支持创建各种常见的图表类型&#xff0…