支持向量机(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. linux中安装firebird

    本在树莓派上安装sqlite,因为sqlite的多用户需要自己控制读写.最终选择稳定够用的fb2.5. 嵌入式无论哪一种fb都差不多. 1.安装 sudo apt-get install firebi ...

  2. 配置QtJambi编译环境

    所有代码都是以C++ GUI Qt 4编程(第二版)为准,只是重新用Java + QtJambi重写了. 当前编译IDE是intellij idea 2024, 系统win 11 LTSC.需要配置的 ...

  3. 『Plotly实战指南』--散点图绘制进阶篇

    在数据分析的世界里,散点图是一种极为重要的可视化工具. 它能够直观地展示两个或多个变量之间的关系,帮助我们快速发现数据中的模式.趋势和异常点. 无论是探索变量之间的相关性,还是寻找数据中的潜在规律,散 ...

  4. 字符串处理,push pop路径,组合命令,for

    字符串处理字符串截取.命令嵌套命令格式:%变量名:~ m,n%,其中,m表示开始位置(默认开头),n表示从m位置开始向后截取的字符个数(默认到结尾),若n为负数则表示向前截取个数,作用:将命令中的某段 ...

  5. (转)python批量提取PDF第一页输出为图片

    一:步骤 1.使用input输入路径 2.生成图片存户路径同存放路径 3.生成图片为PNG格式 4.支持自定义截取页数,建议为第一页 二:安装扩展类 pip install PyMuPDF 三:示例代 ...

  6. eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...

  7. 机器人操作系统ROS2之简介

    什么是ROS2? ROS(机器人操作系统)是用于机器人应用的开源软件开发工具包.ROS 为各行业的开发者提供了一个标准的软件平台,帮助他们从研究和原型设计一直推进到部署和生产,从驱动程序到最先进的算法 ...

  8. 备注一下,SolidColorBrush,自定义颜色

    new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27212B"))

  9. nim 语言实现迭代器

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

  10. 通过Linux包管理器提升权限

    免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 前言 在Linux系统中,apt和yum ...