【Python/Pytorch 】-- SVM算法

在这里插入图片描述
文章目录

文章目录

  • 00 写在前面
  • 01 SVM算法简介
  • 02 SVM算法的基本原理
    • 线性SVM
    • 非线性SVM
  • 03 基于Python 版本的SVM算法
  • 04 优化目标表达式理解:
  • 05 约束条件表达式理解

00 写在前面

SVM算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化算法一起,进行回归预测或者分类预测。

01 SVM算法简介

支持向量机(Support Vector Machine, SVM)是一种用于分类和回归分析的监督学习模型。SVM的基本思想是通过寻找一个超平面,将不同类别的样本进行最大间隔分离。SVM在高维空间中表现出色,特别适用于小样本、非线性及高维数据的分类。

02 SVM算法的基本原理

SVM的核心目标是找到一个最优分离超平面,使得不同类别的样本之间的间隔(margin)最大化。SVM分为线性SVM和非线性SVM。

线性SVM

对于线性可分的数据集,SVM通过找到一个线性超平面来分离两类数据。假设我们有一个训练数据集 ( x i , y i ) (x_i, y_i) (xi,yi),其中 x i x_i xi 是特征向量, y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi{1,1} 是类别标签。SVM要找到一个超平面:
w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0使得所有正类样本和负类样本的间隔最大化。

目标函数
min ⁡ w , b 1 2 ∥ w ∥ 2 \min_{w,b}\frac{1}{2} \left \| w \right \| ^{2} w,bmin21w2

约束条件
y i ( w ⋅ x i + b ) ≥ 1 , ∀ i y_i (\mathbf{w} \cdot \mathbf{x_i} + b) \geq 1, \quad \forall i yi(wxi+b)1,i

通过求解上述优化问题,得到最优的权重向量 w \mathbf{w} w 和偏置 b b b,从而确定最优分离超平面。

非线性SVM

对于线性不可分的数据集,SVM使用核函数(Kernel Function)将数据映射到高维空间,使得在高维空间中可以找到线性可分的超平面。常用的核函数包括:

  • 多项式核(Polynomial Kernel):
    K ( x i , x j ) = ( x i ⋅ x j + c ) d K(x_i, x_j) = (\mathbf{x_i} \cdot \mathbf{x_j} + c)^d K(xi,xj)=(xixj+c)d

  • 高斯核(RBF核,Radial Basis Function Kernel):
    K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) K(x_i, x_j) = \exp(-\gamma \|\mathbf{x_i} - \mathbf{x_j}\|^2) K(xi,xj)=exp(γxixj2)

  • Sigmoid核:
    K ( x i , x j ) = tanh ⁡ ( α x i ⋅ x j + c ) K(x_i, x_j) = \tanh(\alpha \mathbf{x_i} \cdot \mathbf{x_j} + c) K(xi,xj)=tanh(αxixj+c)

使用核函数后,SVM的目标函数变为:
min ⁡ w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} \xi_i w,bmin21w2+Ci=1nξi

约束条件
y i ( w ⋅ ϕ ( x i ) + b ) ≥ 1 − ξ i , ξ i ≥ 0 , ∀ i y_i (\mathbf{w} \cdot \phi(\mathbf{x_i}) + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i yi(wϕ(xi)+b)1ξi,ξi0,i

其中, ξ i \xi_i ξi 是松弛变量,允许误分类的样本, C C C 是惩罚参数,控制模型复杂度和误分类的权衡。

03 基于Python 版本的SVM算法

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分类器
linear_clf = SVC(kernel='linear')
linear_clf.fit(X_train, y_train)
linear_pred = linear_clf.predict(X_test)
linear_accuracy = accuracy_score(y_test, linear_pred)
print(f'Linear Kernel Accuracy: {linear_accuracy:.2f}')# 创建和训练多项式核函数的SVM分类器
poly_clf = SVC(kernel='poly', degree=3)
poly_clf.fit(X_train, y_train)
poly_pred = poly_clf.predict(X_test)
poly_accuracy = accuracy_score(y_test, poly_pred)
print(f'Polynomial Kernel Accuracy: {poly_accuracy:.2f}')# 创建和训练RBF核函数的SVM分类器
rbf_clf = SVC(kernel='rbf', gamma='scale')
rbf_clf.fit(X_train, y_train)
rbf_pred = rbf_clf.predict(X_test)
rbf_accuracy = accuracy_score(y_test, rbf_pred)
print(f'RBF Kernel Accuracy: {rbf_accuracy:.2f}')# 创建和训练Sigmoid核函数的SVM分类器
sigmoid_clf = SVC(kernel='sigmoid')
sigmoid_clf.fit(X_train, y_train)
sigmoid_pred = sigmoid_clf.predict(X_test)
sigmoid_accuracy = accuracy_score(y_test, sigmoid_pred)
print(f'Sigmoid Kernel Accuracy: {sigmoid_accuracy:.2f}')

在这里插入图片描述

04 优化目标表达式理解:

超平面的一般形式 : 在 (n) 维空间中,超平面是一个 (n-1) 维的子空间。为了更好地理解这一点,考虑几种低维情况:

  1. 在二维空间中,一个超平面是一个一维的直线。
  2. 在三维空间中,一个超平面是一个二维的平面。

法向量 w \mathbf{w} w

法向量 w \mathbf{w} w 指向超平面正交(垂直)的方向。法向量的长度 ∣ ∣ w ∣ ∣ \mathbf{||w||} ∣∣w∣∣ 影响分类间隔的大小。

偏置 b b b

偏置 b b b 决定了超平面在法向量方向上的位置。改变 b b b 的值会平行地移动超平面。具体来说,当 b b b 增加时,超平面沿法向量的方向移动,反之亦然。

x \mathbf{x} x 到超平面的距离可以通过以下公式计算:

距离 = ∣ w ⋅ x + b ∣ ∥ w ∥ \text{距离} = \frac{|\mathbf{w} \cdot \mathbf{x} + b|}{\|\mathbf{w}\|} 距离=wwx+b

这个公式的推导过程如下:

假设有一个超平面,其方程为 w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0。要计算点 x 0 \mathbf{x_0} x0 到这个超平面的距离,我们可以通过以下步骤推导出公式。

  1. 超平面的几何意义

首先,我们知道一个超平面可以通过其法向量 w \mathbf{w} w 和偏置 b b b 来定义。超平面上的点 x \mathbf{x} x 满足:

w ⋅ x + b = 0 \mathbf{w} \cdot \mathbf{x} + b = 0 wx+b=0

  1. 投影向量

为了找到点 x 0 \mathbf{x_0} x0 到超平面的距离,我们可以先找到从点 x 0 \mathbf{x_0} x0 到超平面的垂直投影点 x 1 \mathbf{x_1} x1。这个投影点 x 1 \mathbf{x_1} x1 可以表示为:

x 1 = x 0 − λ w \mathbf{x_1} = \mathbf{x_0} - \lambda \mathbf{w} x1=x0λw

其中, λ \lambda λ 是一个标量,表示从点 x 0 \mathbf{x_0} x0 沿着法向量 w \mathbf{w} w 的距离。我们需要找到合适的 λ \lambda λ 使得 x 1 \mathbf{x_1} x1 落在超平面上。

  1. 投影点在超平面上

由于 x 1 \mathbf{x_1} x1 在超平面上,所以必须满足超平面的方程:

w ⋅ x 1 + b = 0 \mathbf{w} \cdot \mathbf{x_1} + b = 0 wx1+b=0

x 1 = x 0 − λ w \mathbf{x_1} = \mathbf{x_0} - \lambda \mathbf{w} x1=x0λw 代入得到:

w ⋅ ( x 0 − λ w ) + b = 0 \mathbf{w} \cdot (\mathbf{x_0} - \lambda \mathbf{w}) + b = 0 w(x0λw)+b=0

展开并整理得到:

w ⋅ x 0 − λ ∥ w ∥ 2 + b = 0 \mathbf{w} \cdot \mathbf{x_0} - \lambda \|\mathbf{w}\|^2 + b = 0 wx0λw2+b=0

解出 λ \lambda λ

λ = w ⋅ x 0 + b ∥ w ∥ 2 \lambda = \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} λ=w2wx0+b

  1. 距离公式

x 0 \mathbf{x_0} x0 到投影点 x 1 \mathbf{x_1} x1 的距离即为垂直距离:

距离 = ∥ x 0 − x 1 ∥ \text{距离} = \|\mathbf{x_0} - \mathbf{x_1}\| 距离=x0x1

x 1 \mathbf{x_1} x1 代入得到:

x 0 − x 1 = x 0 − ( x 0 − λ w ) = λ w \mathbf{x_0} - \mathbf{x_1} = \mathbf{x_0} - (\mathbf{x_0} - \lambda \mathbf{w}) = \lambda \mathbf{w} x0x1=x0(x0λw)=λw

因此,距离为:

距离 = ∥ λ w ∥ = ∣ λ ∣ ∥ w ∥ \text{距离} = \|\lambda \mathbf{w}\| = |\lambda| \|\mathbf{w}\| 距离=λw=λ∣∥w

λ = w ⋅ x 0 + b ∥ w ∥ 2 \lambda = \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} λ=w2wx0+b代入得到:

距离 = ∣ w ⋅ x 0 + b ∥ w ∥ 2 ∣ ∥ w ∥ = ∣ w ⋅ x 0 + b ∣ ∥ w ∥ \text{距离} = \left| \frac{\mathbf{w} \cdot \mathbf{x_0} + b}{\|\mathbf{w}\|^2} \right| \|\mathbf{w}\| = \frac{|\mathbf{w} \cdot \mathbf{x_0} + b|}{\|\mathbf{w}\|} 距离= w2wx0+b w=wwx0+b

对于最优分离超平面,两类样本的支持向量(即离超平面最近的样本)满足以下条件:

对于正类支持向量: w ⋅ x + b = + 1 \mathbf{w} \cdot \mathbf{x} + b = +1 wx+b=+1

对于负类支持向量: w ⋅ x + b = − 1 \mathbf{w} \cdot \mathbf{x} + b = -1 wx+b=1

这些支持向量定义了间隔边界。分类间隔(margin)是这两个边界之间的垂直距离。

对于正类支持向量, w ⋅ x + b = 1 \mathbf{w} \cdot \mathbf{x} + b = 1 wx+b=1,所以到超平面的距离为:

距离 = 1 ∥ w ∥ \text{距离} = \frac{1}{\|\mathbf{w}\|} 距离=w1

同样,对于负类支持向量, w ⋅ x + b = − 1 \mathbf{w} \cdot \mathbf{x} + b = -1 wx+b=1,到超平面的距离也是:

距离 = 1 ∥ w ∥ \text{距离} = \frac{1}{\|\mathbf{w}\|} 距离=w1

05 约束条件表达式理解

  • w ⋅ x i + b > 0 \mathbf{w} \cdot \mathbf{x}_i + b > 0 wxi+b>0,则 x i \mathbf{x}_i xi 被分类为正类。

  • w ⋅ x i + b < 0 \mathbf{w} \cdot \mathbf{x}_i + b < 0 wxi+b<0,则 x i \mathbf{x}_i xi 被分类为负类。

  • y i = + 1 y_i = +1 yi=+1 时, y i ( w ⋅ x i + b ) = w ⋅ x i + b y_i (\mathbf{w} \cdot \mathbf{x}_i + b) = \mathbf{w} \cdot \mathbf{x}_i + b yi(wxi+b)=wxi+b,表示正类样本与超平面的距离。

  • y i = − 1 y_i = -1 yi=1 时, y i ( w ⋅ x i + b ) = − ( w ⋅ x i + b ) y_i (\mathbf{w} \cdot \mathbf{x}_i + b) = -(\mathbf{w} \cdot \mathbf{x}_i + b) yi(wxi+b)=(wxi+b),表示负类样本与超平面的距离的相反数。

  • 约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 y i ( w ⋅ x i + b ) ≤ − 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \leq -1 yi(wxi+b)1能够清晰地定义正类和负类样本相对于超平面的位置关系。

为什么是大于1?(个人理解)

  1. 最大化分类间隔
    SVM的目标是找到一个超平面,使得所有数据点到超平面的距离(即 ∣ w ⋅ x i + b ∣ | \mathbf{w} \cdot \mathbf{x}_i + b | wxi+b)尽可能大。约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 确保了正类和负类样本离超平面的距离至少为1。这样做的好处是可以确保分类间隔最大化,因为超平面距离数据点的越远,分类间隔就越大。

  2. 避免分类错误
    如果约束条件是 y i ( w ⋅ x i + b ) ≥ 0 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 0 yi(wxi+b)0,则意味着只要数据点在超平面的正确一侧,就被认为是正确分类的。这种情况下,可能会出现分类间隔较小或者出现分类错误的情况,因为数据点可以非常接近超平面而仍然被认为是正确分类的。而约束条件 y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1 确保了只有在距离超平面足够远的情况下,数据点才被认为是正确分类的,从而提高了分类的准确性和泛化能力。

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

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

相关文章

OpenAPI

大家好我是苏麟 , 今天带来一个前端生成接口的工具 . 官网 : GitHub - ferdikoomen/openapi-typescript-codegen: NodeJS library that generates Typescript or Javascript clients based on the OpenAPI specification 安装命令 npm install openapi-typescript-codegen --sa…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 微生物数据具有一下的特点&#xff0c;这使得在做差异分析的时候需要考虑到更多的问题&…

在LangChain中,LLM(大型语言模型)和LLM Chain的区别是什么?

简单来说&#xff0c;LLM是一个大型语言模型&#xff0c;而LLM Chain是由多个LLM或其他组件组成的链式结构&#xff0c;用于在LangChain中构建复杂的自然语言处理流程。 Direct LLM Interface: 直接大型语言模型&#xff08;LLM&#xff09;接口&#xff1a; llm Open…

Okhttp响应Json数据

简介 OkHttp是一个高效、现代的HTTP客户端库&#xff0c;专为Android和Java应用程序设计&#xff0c;用于发送网络请求和处理响应。它支持HTTP/2和SPDY协议&#xff0c;允许连接复用&#xff0c;减少延迟&#xff0c;提高网络效率。OkHttp还处理了常见的网络问题&#xff0c;如…

电容的命名规则

给如下参数给采购&#xff0c;就可以获取 还有一些参数需要重视 容值随着环境温度而保持的程度 常规应用时是可以不用看材质&#xff0c;但是如果使用在新能源汽车和极端环境下的电子产品&#xff0c;就需要关注材质&#xff0c;曾有供应商把可用级电容供应车企&#xff0c;导致…

昇思25天学习打卡营第4天|数据变换Transforms

学习内容复盘 1.1 数据变换 什么是数据变换、为何要数据变换 通常情况下&#xff0c;直接加载的原始数据并不能直接送入神经网络进行训练&#xff0c;此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换&#xff08;Transforms&#xff09;&#xff0c;配合数…

学习VXLAN -- 报文结构、原理和配置

目录 VXLAN背景什么是VXLANVXLAN的优势VXLAN报文结构一些特定名词BDVBDIFVAPVSIVSI-InterfaceAC VXLAN的实现原理图VXLAN MAC地址表项MAC地址动态学习 VXLAN隧道VXLAN隧道工作模式L2 GatewayIP Gateway VXLAN隧道的建立与关联VXLAN隧道建立的方式VXLAN对到与VXLAN关联的方式 配…

低成本STC32G8K64驱动控制BLDC开源入门学习方案

低成本STC32G8K64驱动控制BLDC开源入门学习方案 ✨采用STC32G8K64单片机&#xff0c;参考梁工的STC32G12K128-LQFP48驱动方案制作&#xff0c;梁工BLDC相关的资料&#xff1a;https://www.stcaimcu.com/forum.php?modviewthread&tid7472&extrapage%3D1&#xff0c;在此…

python tarfile解压失败怎么解决

问题原因 在使用tarfile模块解压一份Linux服务器上的打包文件时&#xff0c;出现了错误提示&#xff1a;IOError&#xff1a;[Errno 22] invalid mode (wb) or filename. 经过检查&#xff0c;发现是因为打包文件中有文件名存在“&#xff1a;”符号&#xff0c;而window下的…

python rename报错怎么解决

刚接触python&#xff0c;写了一段简单的代码&#xff0c;功能就是重命名一个文件&#xff0c;代码如下&#xff1a; list_1os.listdir(".") for files in list_1:fopen(files)if f.name"01.txt":os.rename(01.txt,001.txt)elif f.name"05.txt":…

【Python机器学习】k均值聚类——k均值的失败案例

k均值可能不总能找到“正确”的簇个数&#xff0c;每个簇仅由其中心定义&#xff0c;这意味着每个簇都是凸形。因此&#xff0c;k均值只能找到相对简单的形状。k均值还假设所有簇在某种程度上具有相同的“直径”&#xff0c;它总是将簇之间的边界刚好画在簇中心的之间位置。有时…

找不到msvcr120.dll怎么办,msvcr120.dll丢失的多种解决方法

msvcr120.dll是微软Visual C 2013的可再发行组件包中的一个文件&#xff0c;它是许多程序运行所必需的。这个文件包含了Visual C库&#xff0c;这些库为使用C编写的软件提供支持。如果你的电脑中缺少msvcr120.dll文件&#xff0c;那么依赖这个文件运行的应用程序可能无法启动或…

WPF文本绑定显示格式StringFormat设置-数值类型处理

绑定显示格式设置 在Textblock等文本控件中&#xff0c;我们经常要绑定一些数据类型&#xff0c;但是我们希望显示的时候能够按照我们想要的格式去显示&#xff0c;比如增加文本前缀&#xff0c;后面加单位&#xff0c;显示百分号等等&#xff0c;这种就需要对绑定格式进行处理…

关于微信没有接入鸿蒙NEXT的思考

6月21日,纯血鸿蒙发布,国内的质疑声终于停止,不再被人喊叫换皮 Android 了.就连编程语言都是华为自研的。 可是发布会后微信却成了热点,因为余承东在感谢了一圈互联网企业,如:淘宝、支付宝、美团、京东、抖音、今日头条、钉钉、小红书、微博、B站、高德、WPS等等. 唯独没有感…

CSS基础学习记录(5)

目录 1、CSS语法 2、实例 3、CSS注释 4、id 选择器 5、class 类选择器 6、标签选择器 7、内联选择器 1、CSS语法 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器&#xff08;Selector&#xff09;通常是您需要改变样式的 HTML …

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

高级人工智能复习 中科大

参考&#xff1a; 中科大2023春季【高级人工智能】试题回顾 中国科学技术大学《高级人工智能》课程 重要知识点提纲 高级人工智能复习提纲 1.搜索 1.1 搜索问题的概念 搜索问题的五个要素&#xff1a;状态空间、后继函数、初始状态、目标测试和路径耗散。 用状态图描述搜索…

Codeforces Round 953 (Div. 2) A~F

A.Alice and Books&#xff08;思维&#xff09; 题意&#xff1a; 爱丽丝有 n n n本书。第 1 1 1本书包含 a 1 a_1 a1​页&#xff0c;第 2 2 2本书包含 a 2 a_2 a2​页&#xff0c; … \ldots …第 n n n本书包含 a n a_n an​页。爱丽丝的操作如下&#xff1a; 她把所有的…

L57---112.路径总和(广搜)---Java版

1.题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。叶子节点 是指…

力扣每日一题 6/23 字符串/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 520.检测大写字母【简单】 题目&#xff1a; 我们定义&#xff0c;在以下…