支持向量机(Support Vector Machine,SVM)是一种经典的监督学习算法,主要用于分类任务,也可扩展到回归问题(称为支持向量回归,SVR)。其核心思想是通过寻找一个最优超平面,最大化不同类别数据之间的间隔(Margin),从而实现高效分类。

一、核心思想

  SVM的目标是找到一个决策边界(超平面),将不同类别的数据分开,并确保该边界到最近数据点(支持向量)的距离最大。这种“最大化间隔”的策略使得模型具有更好的泛化能力。

超平面(Hyperplane):

  在n维空间中,一个超平面是n-1维的子空间。对于二维数据,超平面是一条直线;三维数据中是一个平面。

支持向量(Support Vectors):

  距离最优超平面最近的样本点称为支持向量,它们是决定超平面位置的关键样本。其他样本的位置对超平面无影响,这也是“SVM”名称的由来。

间隔(Margin):

  超平面到两类最近支持向量的距离之和。SVM的目标是最大化间隔。

设超平面方程为\(w\cdot x+b=0\)(其中\(w\)是权重向量,\(b\)是偏置),则单个样本点\(x_i\)到超平面的距离为:\(距离=\frac{\left| w\cdot x_i+b \right|}{\left| \left| w \right| \right|}\)。

  最优超平面需满足:对于正类样本,有\(w\cdot x_i+b\geq1\);对于负类样本,有\(w\cdot x_i+b\leq-1\) 。此时,间隔为 \(\frac{2}{\left| \left| w \right| \right|}\),最大化间隔等价于最小化\(\left| \left| w \right| \right|^{2}\)。

二、线性可分情况(硬间隔SVM)

  假设数据线性可分,SVM的优化问题可表示为

    \(\min_{w,b}{\frac{1}{2}\left| \left| w \right| \right|^{2}}\)   s.t. \(y_i(w\cdot x_i+b)\geq1 \quad (\forall i)\)

  目标:最小化\(\left| \left| w \right| \right|\)(等价于最大化间隔\(\frac{2}{\left| \left| w \right| \right|}\))。

  约束:确保所有样本被正确分类且位于间隔边界之外。

三、非线性可分情况(软间隔SVM)

  当样本无法被线性超平面分隔时,SVM 通过以下方法处理:

1. 引入松弛变量(Slack Variables)

  允许部分样本跨越超平面,但需在优化目标中加入惩罚项(即正则化参数\(C\)),平衡间隔最大化和分类错误最小化

    \(\min_{w,b}{\frac{1}{2}\left| \left| x \right| \right|^{2}}+C\sum_{i}{\xi_i}\)   s.t. \(y_i(w\cdot x_i+b)\geq 1-\xi_i,\quad \xi_i\geq0\)

  \(C\)的作用:控制分类错误的惩罚力度。\(C\)越大,模型越严格(可能过拟合);\(C\)越小,允许更多错误(可能欠拟合)。

2. 核技巧(Kernel Trick)

  对于非线性可分数据,SVM通过核函数将原始空间映射到高维特征空间,使数据在新空间中线性可分。常见核函数有

  线性核:\(K(x_i,x_j)=x_i\cdot x_j\)

  多项式核:\(K(x_i,x_j)=(x_i\cdot x_j+c)^{d}\)

  高斯径向基核(RBF):\(K(x_i,x_j)=exp(-\gamma \left| \left| x_i-x_j \right| \right|^{2})\)

  Sigmoid核: \(K(x_i,x_j)=tanh(\alpha x_i\cdot x_j+c)\)

四、优化与求解

  SVM通常转化为对偶问题,利用拉格朗日乘子法求解:

    \(max_{\alpha}{\sum_{i}{\alpha_i}}-\frac{1}{2}\sum_{i,j}{\alpha_i\alpha_jy_iy_jK(x_i,x_j)}\)  s.t. \(0\leq\alpha_i\leq C,\sum_{i}{\alpha_iy_i=0}\)

  通过拉格朗日对偶性转化为对偶问题,优势在于:

    a) 将高维空间中的内积运算转化为核函数计算(避免直接处理高维数据);

    b) 解的形式仅依赖于支持向量,计算效率更高。

五、Python实现示例

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score # 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data # 特征
y = iris.target # 标签 # 划分训练集和测试集
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') # 使用线性核函数 # 训练模型
clf.fit(X_train, y_train) # 预测
y_pred = clf.predict(X_test) # 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}") # 预测新样本
new_samples = [[5.1, 3.5, 1.4, 0.2], [6.3, 3.3, 4.7, 1.6]]
predictions = clf.predict(new_samples)
print(f"新样本预测结果: {[iris.target_names[p] for p in predictions]}")

End.

支持向量机(SVM)分类的更多相关文章

  1. 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...

  2. 支持向量机 (SVM)分类器原理分析与基本应用

    前言 支持向量机,也即SVM,号称分类算法,甚至机器学习界老大哥.其理论优美,发展相对完善,是非常受到推崇的算法. 本文将讲解的SVM基于一种最流行的实现 - 序列最小优化,也即SMO. 另外还将讲解 ...

  3. 支持向量机(SVM)入门

    一.简介 支持向量机,一种监督学习方法,因其英文名为support vector machine,故一般简称SVM. 通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器, ...

  4. 【IUML】支持向量机SVM

    从1995年Vapnik等人提出一种机器学习的新方法支持向量机(SVM)之后,支持向量机成为继人工神经网络之后又一研究热点,国内外研究都很多.支持向量机方法是建立在统计学习理论的VC维理论和结构风险最 ...

  5. [转]支持向量机SVM总结

    首先,对于支持向量机(SVM)的简单总结: 1. Maximum Margin Classifier 2. Lagrange Duality 3. Support Vector 4. Kernel 5 ...

  6. 机器学习:Python中如何使用支持向量机(SVM)算法

    (简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...

  7. Python中的支持向量机SVM的使用(有实例)

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn也集成了SVM算法. 一.简要介绍一下sklearn Scik ...

  8. 以图像分割为例浅谈支持向量机(SVM)

    1. 什么是支持向量机?   在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...

  9. 机器学习实验一SVM分类实验

    一.实验目的和内容 (一)实验目的 1.熟悉支持向量机SVM(Support Vector Machine)模型分类算法的使用. 2.用svm-train中提供的代码框架(填入SVM分类器代码)用tr ...

  10. 机器学习算法 - 支持向量机SVM

    在上两节中,我们讲解了机器学习的决策树和k-近邻算法,本节我们讲解另外一种分类算法:支持向量机SVM. SVM是迄今为止最好使用的分类器之一,它可以不加修改即可直接使用,从而得到低错误率的结果. [案 ...

随机推荐

  1. 从客户端(XXX)中检测到有潜在危险的 Request.Form 值

    维护别人的某功能模块的时候,页面返回如下错误信息: [HttpRequestValidationException (0x80004005): 从客户端(TextBox1="<?xml ...

  2. spring项目使用EMQX,使用@Autowired注入失败报错空指针问题记录

    目录 java客户端使用MQTT订阅消息大致流程 MQTTConnect部分代码 MQTTListener部分代码 问题分析 问题原因 解决方法 总结 参考 java客户端使用MQTT订阅消息大致流程 ...

  3. Google Adsense中文设置

    1. 入口 https://www.google.com/adsense 2. 菜单 Account -> settings -> Personal settings 3. 切换语言 Di ...

  4. Nginx日志拆分(linux环境下)

    1.新增shell脚本[nginx_log.sh],进行每日自动切割一次,存储在nginx文件夹下的logs下 #!/bin/bash #设置日志文件存放目录 LOG_HOME="/app/ ...

  5. 一、Java语言介绍

    1.硬件知识介绍 2.常用dos命令以及快捷键 1 /** 2 *@desc: 复习 3 *@Description: 4 * dir:列出当前文件目录下的所有文件; 5 * md:创建一个新目录; ...

  6. GeoIP库商业版调研-支持IPV6

    背景 因需要支持ipv6网络,目前所使用的GeoIP库无法解析或者很少量的能解析出IPV6的IP地址位置信息,所以需要更新最新的GeoIP库文件.目的配置在Nginx或者服务直接调用使用,从而获取城市 ...

  7. nim 语言实现迭代器

    nim语言默认是支持 for x in items 这样的迭代的,而且一个类如果要支持迭代,可以用 yield 关键字,其实在 nim 主页上第二个例子就已经重点介绍了. # Thanks to Ni ...

  8. 抽象方法(abstract)、虚方法(virtual)及接口(interface)

    抽象方法(abstract).虚方法(virtual)及接口(interface) 抽象方法(abstract) 定义:abstract关键词标记的方法--抽象方法 特征: 抽象方法只能定义在抽象类里 ...

  9. 代码随想录第三天 | Leecode 203. 移除链表元素、707. 设计链表、206. 翻转链表

    Leecode 203 移除链表元素 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/ 题目描述 给你一个链表的头节点 he ...

  10. 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解

    出错代码: MSBuildWorkspace workspace = CreateWorkspace(); Solution solution = workspace.OpenSolutionAsyn ...