机器学习作业6——svm支持向量机

目录

一、理论

概念:

线性可分:

支持向量:

间隔:

目标:

软间隔:

梯度下降法:

别的方法:

拉格朗日函数:

SMO算法:

核函数:

二、代码

说明:

三、结果:

优缺点分析:

遇到的问题:


一、理论

svm的目的是找到一个最优的划分超平面或者决策边界,从而实现对数据的有效分割或者拟合。

超平面:

在二维情况下,上图的线就是超平面,而若特征有3维,则超平面就是一个平面,而高维情况很多,就统一叫作超平面。

所以当有了一个数据集后,主要的问题就是如何找出这个最优的超平面

概念:

线性可分:

现在先假设一个数据集是线性可分的。

因为超平面都可以用一个线性方程表示w^T x + b = 0,其中:w是超平面的法向量。x是数据点的特征向量。b是偏置。

有了这个概念,线性可分就可以定义为:

当标签为正类(y=1)时,w \cdot x_i + b \geq 0

当标签为负类(y=-1)时,w \cdot x_i + b < 0

将这两个式子合起来,简写为:y_i (w \cdot x_i + b) \geq 0,使得式子统一

支持向量:

由数学知识得到,假设一个平面为Ax+By+Cz+D=0, 那么将这个平面乘以一个数后,平面还是同一个平面,所以可以通过控制乘的这个数,使得w \cdot x_i + b \geq 1,y = +1,w \cdot x_i + b \leq -1,y = -1,化简一下变为:

y_i (w \cdot x_i + b) \geq 1

通过这样的缩放变换,当一个样本点使得w \cdot x_i + b = \pm 1,这个样本点就是距离这个超平面最近的点,我们把这些点称作支持向量。

虚线上的点就是支持向量

间隔:

在样本空间中,任意点到超平面的距离为:d = \frac{​{|w \cdot x + b|}}{\left \| w \right \|}

例如在三位空间中,点到平面距离公式为:d = \frac{​{|Ax_0 + By_0 + Cz_0 + D|}}{​{\sqrt{​{A^2 + B^2 + C^2}}}}

在支持向量中,{|w \cdot x + b|}这项是为1的,所以两个虚线之间的距离为:2*\frac{1}{\left \| w \right \|},这一项被称之为间隔

目标:

有了以上概念,我们的目标是:

希望最大化间隔\frac{2}{\left \| w \right \|},并且超平面满足约束条件y_i (w \cdot x_i + b) \geq 1,i = 1, 2, \ldots, n

而最大化间隔\frac{2}{\left \| w \right \|},可以等价为最小化\left \| w \right \|,又因为\left \| w \right \|始终为正值,但是带根号,所以简化为找到\frac{1}{2} || w ||^2的最小值(1/2的系数是为了方便求导)。

所以优化目标为:

\min_{w, b} \frac{1}{2} ||w||^2

软间隔:

当然以上条件都是在数据集线性可分的基础之上,才能这么去想的,而实际上,很少有数据集可以完美的符合线性可分的条件,所以要引入软间隔。

引入软间隔后,约束条件从y_i (w \cdot x_i + b) \geq 1,变成了y_i (w \cdot x_i + b) \geq 1- \xi_i,其中\xi_i叫做松弛变量

有了松弛变量后,就允许了一部分点可以被错误的分类。当然,我们希望松弛变量也是越小越好。

具体点说就是:

\xi_i<=0时,代表该样本点是正确分类的。

0<\xi_i<1时,代表该样本点分类虽然时正确的,但是是在自己标签的分离间隔和超平面之间的。

\xi_i=1时,代表该样本点在超平面上,无法正确分类。

\xi_i>1时,代表该样本点被错误分类了。

所以目标函数就变为:

\min_{w, b, \xi} \frac{1}{2} ||w||^2 + C \sum_{i=1}^{N} \xi_i,其中C是认为给出的正则化参数,用于控制\xi_i的大小。
把这个式子写成损失函数,就变成了以下形式,我们最小化损失函数即可。

L(y, f(x)) = \lambda \cdot ||w||^2 + \max(0, 1 - y \cdot f(x)),其中f(x) = w \cdot x + b

对w求偏导,

1 - y \cdot f(x) \leq 0时,\max(0, 1 - y \cdot f(x))=0,所以梯度为\lambda \text{w}

1 - y \cdot f(x) > 0时,\max(0, 1 - y \cdot f(x))=1- y \cdot f(x),所以梯度为-y \cdot x+\lambda \text{w}

梯度下降法:

若使用梯度下降法的SVM,权重更新式子为:

1 - y \cdot f(x) \leq 0时,\text{weights} \mathrel{-}= learningrate \times \lambda \text{w}

1 - y \cdot f(x) > 0时,weights \mathrel{-}= learningrate \times (\lambda \text{w}-y \cdot x)

别的方法:

拉格朗日函数:

线性不可分的支持向量机的拉格朗日函数可以写为:

L(w, b, \xi, \alpha, \beta) = \frac{1}{2} ||w||^2 + C \sum_{i=1}^{N} \xi_i - \sum_{i=1}^{N} \alpha_i (y_i (w \cdot x_i + b) - 1 + \xi_i) - \sum_{i=1}^{N} \beta_i \xi_i

原始问题:

\min_{w, b,\xi } \max_{\alpha}L(w, b, \xi, \alpha, \beta)

因为满足KKT条件(不去深究),所以可以将这个原始问题转化为对偶问题

\max_{\alpha}\min_{w, b,\xi } L(w, b, \xi, \alpha, \beta),意思是先对w, b,\xi求极小值,在对\alpha求极大值。

为了让L得到极小值,接下来分别求偏导,并且令偏导数=0。

w求偏导得到:

\frac{\partial L}{\partial w} = w - \sum_{i=1}^{N} \alpha_i y_i x_i = 0w = \sum_{i=1}^{N} \alpha_i y_i x_i

b求偏导得到:

\frac{\partial L}{\partial b} = -\sum_{i=1}^{N} \alpha_i y_i = 0\sum_{i=1}^{N} \alpha_i y_i = 0

\xi求偏导得到:

\frac{\partial L}{\partial \xi_i} = C - \alpha_i - \beta_i = 0\alpha_i = C - \beta_i

将上述3个结果代入原式,得到这个式子:

\max_{\alpha} \sum_{i=1}^{N} \alpha_i - \frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_i \alpha_j y_i y_j x_i \cdot x_j,并且满足:0 \leq \alpha_i \leq C, \quad i=1,2,...,N\sum_{i=1}^{N} \alpha_i y_i = 0

在上述条件下,解出\alpha,将其代入w和b中,就可以解出w和b了

SMO算法:

解出上面的\alpha就是SMO算法优化的地方。

SMO 算法通过不断选择两个变量进行优化,固定其他变量,然后在选定的两个变量上优化目标函数,从而实现对目标函数的最大化。这个过程中,SMO 算法会不断地更新拉格朗日乘子 α,直到达到收敛条件,最终求出α。

理论过程对本人来说太难了,写不出来,望老师见谅。

核函数:

核函数的作用是将输入空间中的数据映射到一个高维特征空间,从而产生了新的特征矩阵,使得原始数据在新的特征空间中变得线性可分或更容易进行线性划分。这样做的目的是为了解决原始特征空间中线性不可分的问题。

有:线性核函数(Linear Kernel),多项式核函数(Polynomial Kernel),高斯核函数(Gaussian Kernel 或 RBF Kernel),其中高斯核函数是最常用的。

二、代码

梯度下降法:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2]  # 只使用两个特征
y = iris.target# 将标签转换为二元分类问题(假设类别 0 作为正例,其他类别作为负例)
y = np.where(y == 0, 1, -1)# 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 初始化模型参数
np.random.seed(42)
w = np.random.randn(X_train.shape[1])  # 权重
b = 0                                   # 偏置项
lr = 0.01                               # 学习率
epochs = 100                          # 迭代次数
lmd = 0.1# 定义损失函数(hinge loss)
def hinge_loss(X, y, w, b):loss = 1 - y * (np.dot(X, w) + b)return np.maximum(0, loss)# 训练 SVM 模型
cnt = 0
for epoch in range(epochs):for i, x_i in enumerate(X_train):if y_train[i] * (np.dot(x_i, w) + b) >= 1:  # 判断是否分类正确dw = 2 * lmd * w  else:dw = 2 * lmd * w - np.dot(y_train[i], x_i)  # 对于错误分类的样本,更新权重和偏置项db = -y_train[i]w -= lr * dwb -= lr * dbcnt+=1if cnt%100 == 0:print(repr('更新了第') + repr(cnt) + repr('次') + repr('W:') + repr(w) + repr('    b:') + repr(b))# 绘制决策边界
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 创建网格以绘制决策边界
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50),np.linspace(ylim[0], ylim[1], 50))
Z = np.dot(np.c_[xx.ravel(), yy.ravel()], w) + b
Z = np.sign(Z)
Z = Z.reshape(xx.shape)# 绘制决策边界
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'], interpolation='nearest')plt.xlabel('x1')
plt.ylabel('x2')
plt.title('result')   
plt.show()y_pred_train = np.sign(np.dot(X_train, w) + b)
y_pred_test = np.sign(np.dot(X_test, w) + b)accuracy_train = np.mean(y_pred_train == y_train)
accuracy_test = np.mean(y_pred_test == y_test)
print("训练集准确率:", accuracy_train)
print("测试集准确率:", accuracy_test)

说明:

if y_train[i] * (np.dot(x_i, w) + b) >= 1:  dw = 2 * lmd * w  
else:dw = 2 * lmd * w - np.dot(y_train[i], x_i)  db = -y_train[i]w -= lr * dwb -= lr * db

最关键的部分就是这里了,但是这里在上面理论部分的梯度下降法里头说明了,dw是L对w求偏导,db同理,lr是学习率,这个条件的意义是:当在当前超平面下,分割出来的当前这个样本点如果是正确的,并且处于间隔外,在惩罚中就不需要加入松弛参数变出的那一项。

三、结果:

可以看到,在更新次数为9000左右的时候,参数就稳定下来了。

训练结果如下图:

可以看到,有一个点虽然被错误分类了,但关系到总体,情况还是很好的。

优缺点分析:

梯度下降SVM:

优点:

  1. 全局最优解:梯度下降算法可以收敛到全局最优解(如果学习率合适,并且损失函数是凸函数),从而得到最佳的分类超平面。
  2. 易于实现:梯度下降算法的实现相对简单,只需计算损失函数关于模型参数的梯度,并根据梯度方向更新参数即可。
  3. 扩展性强:梯度下降算法可以轻松地扩展到大规模数据集和高维特征空间。

缺点:

  1. 学习率选择:梯度下降算法的性能高度依赖于学习率的选择。学习率太小会导致收敛速度慢,学习率太大可能会导致震荡或无法收敛。
  2. 局部最优解:在非凸损失函数的情况下,梯度下降算法可能会陷入局部最优解,而无法找到全局最优解。
  3. 对初始值敏感:梯度下降算法的性能受初始参数值的影响,不同的初始值可能会导致不同的收敛结果。

遇到的问题:

一开始把梯度下降法和SMO算法混起来了,主要是对梯度下降的损失函数和W的更新式子不知道怎么得出的,然后先去学了一遍拉格朗日函数,在看SMO理论的时候,感觉很难,不太像是梯度下降,回头多看了看最开始得出的目标函数\min_{w, b, \xi} \frac{1}{2} ||w||^2 + C \sum_{i=1}^{N} \xi_i,发现将松弛参数用超平面代入,再对W求偏导就可以得出W的更新式子了,梯度下降的问题就解决了。

关于SMO,理不清楚原理,还是不写了。。(上次实验课腾讯会议里头的代码应该是梯度下降法)

参考的视频:

视频1

视频2

视频3


 

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

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

相关文章

python代码中参数的默认值

python中的函数&#xff0c;可以给形参指定默认值。 带有默认值的参数&#xff0c;可以在调用的时候不传参。 如上图所示&#xff0c;在给函数设定形参的时候可以给函数形参设定默认值&#xff0c;当然默认参数的形参应该在非默认形参的后面。 如果在调用函数的时候&#xff…

Linux云计算架构师涨薪班就业服务有哪些?

学员一站式就业服务:一次学习&#xff0c;薪资翻倍 简历制作与指导 学员在培训期间&#xff0c;人才顾问会提供简历制作和指导服务&#xff0c;帮助学员制作出一份专业、有吸引力的简历。简历是求职者给招聘单位的第一印象&#xff0c;因此非常重要 模拟面试与技巧指导 为了让…

WebGPU 引领前端未来,互动渲染如何驱动小红书业务增长?

在大前端时代&#xff0c;浏览器能力得到显著的增强&#xff0c;为前端开发带来了更多的可能性和挑战。作为一套全新的 Web API 标准&#xff0c;WebGPU 旨在提供高性能的 3D 图形和数据并行计算能力&#xff0c;其在游戏、虚拟现实、机器学习等多个行业和应用场景中展现出潜力…

嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性

目录 1 文件有哪些属性 2 stat函数 2.1 stat函数简介 2.2 struct stat 结构体 2.3 struct timespec 结构体 2.4 示例程序 3 fstat 和 lstat 函数 3.1 fstat 函数 3.2 lstat 函数 1 文件有哪些属性 Linux文件属性是对文件和目录的元数据描述&#xff0c;包括文件类型…

30-unittest生成测试报告(HTMLTestRunner插件)

批量执行完测试用例后&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。本文使用第三方HTMLTestRunner插件生成测试报告。 一、导入HTMLTestRunner模块 这个模块下载不能通过pip安装&#xff0c;只能下载后手动导入&#xff0c;下载地址是&#xff1a;ht…

应用广义线性模型一|线性模型

文章目录 一、统计学及思维模式二、未知现象的数学描述三、线性模型&#xff08;一&#xff09;线性模型的定义&#xff08;二&#xff09;线性模型的参数估计&#xff08;三&#xff09;线性模型的应用&#xff08;四&#xff09;离散解释变量的设计向量构建方法 四、线性模型…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例

前言 在次之前&#xff0c;我们已经做了图像加雾的一些研究&#xff0c;这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集&#xff0c;通过读取EXR格式的…

【实盘】第二十期:2024-06月~第一周

一、每周净值 01 CTA投资组合 CTA多品种全覆盖全天候策略2024年2月至2024年5月底实盘总收益12.753%&#xff0c;当前浮动净值为1.1407&#xff0c;当前平仓净值为1.12753。 月度最大本金回撤0.3%(资金曲线为平仓盈亏,总体回撤应加入浮动持仓的盈亏总体计算,实际当前净值见棕色…

各种空气能热泵安装图

空气能热泵安装图 循环式空气能热泵安装图 直热循环式空气能热泵安装图 泳池空气能热泵安装图 循环式水源热泵热安装系统原理图 直热循环式水源热泵安装系统图 空气水源热泵安装图

flutter as连接网易模拟器

网易模拟器下载 Mac 使用MuMu模拟器调试 Flutter开发 Android Studio 安装第三方模拟器—网易MuMu Mac 安卓Studio使用外部模拟器 Mac电脑&#xff1a;Android Studio 连接 MUMU 网易模拟器 Mac 上 Android Studio 链接网易 MuMu 模拟器调试 在 .zshrc 中设置 adb 二进制文…

重构某测试站点

一、计算校验值 校验值结果&#xff1a; 文件名称&#xff1a;培训用centos.rar&#xff0c;文件大小&#xff1a;1,335,759,953&#xff0c;MD5&#xff1a;534EC38CDA7DA2196C84AC8F6092514B&#xff0c;SHA1&#xff1a;FD35D86A27A007AE10872980C48653A110DF6067&#xf…

EverWeb 强大的零基础Mac网页设计制作软件

搜索Mac软件之家下载EverWeb 强大的零基础Mac网页设计制作软件 EverWeb 4.2是非专业网页设计师的绝佳网页制作工具&#xff0c;无需编码即可创建美观、响应迅速的网站。只需拖放自己的图像、文本和其他任何html元素到网页布局的任何位置。 EverWeb的功能特性&#xff1a; 下…

C++模板编程—学习C++类库的编程基础

课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践&#xff1a;实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义&#xff1a;对类型也可以进行参数化了 // 也可以用template<class T>&#xff0c;但class容易和类…

适用于 Windows 的 8 大数据恢复软件

数据恢复软件可帮助您恢复因意外删除或由于某些技术故障&#xff08;如硬盘损坏等&#xff09;而丢失的数据。这些工具可帮助您从硬盘驱动器 (HDD) 中高效地恢复丢失的数据&#xff0c;因为这些工具不支持从 SSD 恢复数据。重要的是要了解&#xff0c;您删除的数据不会被系统永…

NodeJs实现脚本:将xlxs文件输出到json文件中

文章目录 前期工作和依赖笔记功能代码输出 最近有一个功能&#xff0c;将json文件里的内容抽取到一个xlxs中&#xff0c;然后维护xlxs文件。当要更新json文件时&#xff0c;就更新xlxs的内容并把它传回json中。这个脚本主要使用NodeJS写。 以下是完成此功能时做的一些笔记。 …

【面试八股总结】内存页面置换算法

参考资料&#xff1a;小林coding、阿秀 缺页中断 在 CPU 里访问一条 Load M 指令&#xff0c;然后 CPU 会去找 M 所对应的页表项。如果该页表项的状态位是「有效的」&#xff0c;那 CPU 就可以直接去访问物理内存了&#xff0c;如果状态位是「无效的」&#xff0c;则 CPU 则会…

stanfordcorenlp+python做中文nlp任务,得到的结果中全是空字符串,而不是中文字符串

问题描述 代码&#xff1a; from stanfordcorenlp import StanfordCoreNLP import logging#中文中的应用&#xff0c;一定记得下载中文jar包&#xff0c;并标志lang‘zh’ nlp_zh StanfordCoreNLP(rD:\stanford-corenlp-full-2016-10-31, port8094, langzh,quietFalse,logg…

GiantPandaCV | 提升分类模型acc(一):BatchSizeLARS

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提升分类模型acc(一)&#xff1a;BatchSize&LARS 在使用大的bs训练情况下&#xff0c;会对精度有一定程度的损失&#xff0c;本文探讨了训练的b…

Java Web学习笔记24——Vue项目开发流程

import是引入文件。 export是将对象导出为模块。 new Vue({ router, router: h > h(App) }).$mount(#app) App.vue: vue的组成文件以.vue结尾&#xff0c;每个组件由三个部分组成&#xff1a;<template>、<script>、<style>。 <template><d…