《机器学习》——支持向量机(SVM)
文章目录
- 什么是支持向量机?
- 基本原理
- 数学模型
- 支持向量机模型
- 模型参数
- 属性信息
- 支持向量机实例(1)
- 实例步骤
- 读取数据
- 可视化原始数据
- 使用支持向量机训练
- 可视化支持向量机结果
- 完整代码
- 支持向量机实例(2)
- 实例步骤
- 导入数据
- 处理数据
- 切分划分数据
- 创建SVM模型
- 训练数据
- 测试数据
- 自测
- 测试集测试
- 得到分类报告及准确率
- 完整代码
- 与KNN算法准确率做对比
- KNN完整代码
什么是支持向量机?
- 支持向量机(Support Vector Machine,SVM)是一种监督式学习的分类算法,也可用于回归分析。它的主要目标是在特征空间中找到一个最优的超平面,从而将不同类别的数据点尽可能分开。这个超平面被定义为能够使两类数据之间的间隔(Margin)最大的平面。
基本原理
- 线性可分情况
-
假设有两类数据点,分别标记为正类和负类。在二维空间中,这些数据点可以用平面直角坐标系中的点来表示。如果这些数据是线性可分的,那么可以找到一条直线(在高维空间中是超平面)将这两类数据分开。
-
-
支持向量机在寻找这个分离超平面时,不仅要找到能分开两类数据的平面,还要使这个平面到两类数据中最近的数据点的距离最大。这些最近的数据点就被称为支持向量。
-
- 非线性可分情况
-
当数据在原始空间中不是线性可分的时候,支持向量机通过使用核函数(Kernel Function)将原始数据映射到一个高维空间,使得在高维空间中数据变得线性可分。
-
-
例如,在二维平面上有一个圆形分布的数据,正类在圆内,负类在圆外,这在二维空间中无法用直线分开。但是通过核函数将其映射到三维空间后,就可能找到一个平面将它们分开。常用的核函数有线性核、多项式核、高斯核(径向基函数核)等。
-
数学模型
- 目标函数
- 拉格朗日乘子法求解
支持向量机模型
模型参数
重要的参数有:C、kernel、degree、gamma。
- C:
- 惩罚因子【浮点数,默认为1.】【软间隔】
- (1)C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱;
- (2)C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
- ->>建议通过交叉验证来选择
- kernel:
- 核函数【默认rbf(径向基核函数|高斯核函数)】
- 可以选择线性(linear)、多项式(poly)、sigmoid
- ->>多数情况下选择rbf
- degree:
- 【整型,默认3维】
- 多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
- ->>按默认【选择rbf之后,此参数不起作用】
- 指上面式子中的n
- gamma:
- ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。
- (1)如果gamma是’auto’,那么实际系数是1 / n_features,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)
- (2)在sklearn0.22版本中,默认为’scale’,此时gamma=1 / (n_features*X.var())#X.var()数据集所有值的方差。
- <1>gamma越大,过拟合风险越高
- <2> gamma越小,过拟合风险越低
- ->>建议通过交叉验证来选择
- coef0:
- 核函数中的独立项。多项式的偏置项。它只在’poly’和’sigmoid’中很重要。
- probability :
- 是否启用概率估计。允许在模型训练完成后,使用predict_proba方法来预测每个类别的概率,而不是仅仅给出类别的预测结果。必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False
- ->>按默认即可【选择rbf之后,不起作用】
- cache_size:
- 核函数cache缓存大小,默认为200MB
- ->>不用调整
- class_weight:
- 类别的权重,字典形式传递。默认’balanced’
- ->>按默认设置
属性信息
- support_vectors_ 【支持向量】
- 以数组的形式储存
- n_support_ 【每个类别支持向量的个数】
- int类型
- coef_ 【参数w】
- 数组的形式储存
- intercept_ 【偏置项参数b】
- 数组的形式储存
支持向量机实例(1)
实例要求:从鸢尾花数据中,对鸢尾花进行分类。
数据内容:数据中共有100条样本数据,6列,其中第一列为编号数据,最后一列为标签数据,其余4列为特征数据。且前50行数据的标签为0,后50行数据标签为1.
数据:通过网盘分享的文件:iris.csv
链接: https://pan.baidu.com/s/1ssc_VSVSUbkzz2-SOipV9w 提取码: jq54
实例步骤
- 读取数据
- 可视化原始数据
- 使用支持向量机训练
- 可视化支持向量机结果
- 绘制分割线和间隔边界、支持向量
读取数据
import pandas as pd
data = pd.read_csv(r'D:\where-python\python-venv\ji_qi_xue_xi_demo\朴素贝叶斯\iris.csv', header=None)
# header=None 为没有表头
可视化原始数据
import matplotlib.pyplot as plt# 选取数据的前 50 行
data1 = data.iloc[:50, :]
# 选取数据的 50 行之后的数据
data2 = data.iloc[50:, :]# 原始数据是四维,无法展示,选择两个维度进行展示,使用 scatter 函数绘制散点图
# 以数据 1 的第 1 列和第 3 列作为 x 和 y 轴,标记为 + 号
plt.scatter(data1[1], data1[3], marker='+')
# 以数据 2 的第 1 列和第 3 列作为 x 和 y 轴,标记为 o 号
plt.scatter(data2[1], data2[3], marker='o')
# 显示绘制的散点图
plt.show()
使用支持向量机训练
from sklearn.svm import SVC# 选取数据的第 1 列和第 3 列作为特征 x
x = data.iloc[:, [1, 3]]
# 选取数据的最后一列作为标签 y
y = data.iloc[:, -1]
# 创建 SVC 分类器,使用线性核,C 为无穷大,随机种子为 0
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
# 用选取的特征和标签训练 SVC 分类器
svm.fit(x, y)
可视化支持向量机结果
# 获取训练好的分类器的系数
w = svm.coef_[0]
# 获取截距
b = svm.intercept_[0]import numpy as np
# 生成 0 到 7 之间的 300 个等间距的点
x1 = np.linspace(0, 7, 300)
# 计算分割超平面的直线方程,w[0] * x1 + w[1] * x2 + b = 0,解出 x2
x2 = -(w[0] * x1 + b) / w[1]
# 计算间隔边界直线方程,w[0] * x1 + w[1] * x2 + b = 1,解出 x2
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 计算间隔边界直线方程,w[0] * x1 + w[1] * x2 + b = -1,解出 x2
x4 = (-1 - (w[0] * x1 + b)) / w[1]# 绘制分割超平面,线宽为 2,颜色为红色
plt.plot(x1, x2, linewidth=2, color='r')
# 绘制间隔边界,线宽为 1,颜色为红色,线条样式为虚线
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')# 设置 x 轴范围
plt.xlim(4, 7)
# 设置 y 轴范围
plt.ylim(0, 5)# 获取支持向量
vets = svm.support_vectors_
# 绘制支持向量,颜色为蓝色,标记为 x
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')# 显示最终的图像
plt.show()
本次实例可看出在二维中支持向量机的情况,绘制分割线和支持向量的分布。
完整代码
import pandas as pd# 读取 csv 文件,文件路径需要注意转义字符,可使用原始字符串
data = pd.read_csv(r'D:\where-python\python-venv\ji_qi_xue_xi_demo\朴素贝叶斯\iris.csv', header=None)import matplotlib.pyplot as plt# 选取数据的前 50 行
data1 = data.iloc[:50, :]
# 选取数据的 50 行之后的数据
data2 = data.iloc[50:, :]# 原始数据是四维,无法展示,选择两个维度进行展示,使用 scatter 函数绘制散点图
# 以数据 1 的第 1 列和第 3 列作为 x 和 y 轴,标记为 + 号
plt.scatter(data1[1], data1[3], marker='+')
# 以数据 2 的第 1 列和第 3 列作为 x 和 y 轴,标记为 o 号
plt.scatter(data2[1], data2[3], marker='o')
# 显示绘制的散点图
plt.show()from sklearn.svm import SVC# 选取数据的第 1 列和第 3 列作为特征 x
x = data.iloc[:, [1, 3]]
# 选取数据的最后一列作为标签 y
y = data.iloc[:, -1]
# 创建 SVC 分类器,使用线性核,C 为无穷大,随机种子为 0
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
# 用选取的特征和标签训练 SVC 分类器
svm.fit(x, y)# 获取训练好的分类器的系数
w = svm.coef_[0]
# 获取截距
b = svm.intercept_[0]import numpy as np
# 生成 0 到 7 之间的 300 个等间距的点
x1 = np.linspace(0, 7, 300)
# 计算分割超平面的直线方程,w[0] * x1 + w[1] * x2 + b = 0,解出 x2
x2 = -(w[0] * x1 + b) / w[1]
# 计算间隔边界直线方程,w[0] * x1 + w[1] * x2 + b = 1,解出 x2
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 计算间隔边界直线方程,w[0] * x1 + w[1] * x2 + b = -1,解出 x2
x4 = (-1 - (w[0] * x1 + b)) / w[1]# 绘制分割超平面,线宽为 2,颜色为红色
plt.plot(x1, x2, linewidth=2, color='r')
# 绘制间隔边界,线宽为 1,颜色为红色,线条样式为虚线
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')# 设置 x 轴范围
plt.xlim(4, 7)
# 设置 y 轴范围
plt.ylim(0, 5)# 获取支持向量
vets = svm.support_vectors_
# 绘制支持向量,颜色为蓝色,标记为 x
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')# 显示最终的图像
plt.show()
支持向量机实例(2)
对手写体图片进行识别。
共有2000个手写体数据,上面是一张已经经过一些初步处理过的图片,其中含有0~9的手写数字,且每一个数字都是5行,100列,共有5000个数字。
本次通过对这张分辨率为20001000的图片进行切分。将其划分成独立的数字,每个数字大小为2020像素,共计5000个。
实例步骤
- 导入数据
- 处理数据
- 切分划分数据
- 创建SVM模型
- 训练数据
- 测试数据
- 得到分类报告及准确率
导入数据
import numpy as np
import cv2
# 读取图像文件 shu_zi.png
img = cv2.imread('shu_zi.png')
处理数据
# 将图像从 BGR 颜色空间转换为灰度空间
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将灰度图像划分为 50 行,每行再划分为 100 列,生成一个二维列表 cells
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]
# 将二维列表转换为 numpy 数组
x = np.array(cells)# 将数组重塑为 (-1, 400) 的形状,并将数据类型转换为 float32
x = x.reshape(-1, 400).astype(np.float32)# 创建一个从 0 到 9 的数组
k = np.arange(10)
# 将数组 k 中的元素重复 500 次,生成标签数组 y
y = np.repeat(k, 500)
切分划分数据
from sklearn.model_selection import train_test_split
# 将数据 x 和标签 y 划分为训练集和测试集,测试集占 20%,设置随机种子为 0
x_train_w, x_test_w, y_train_w, y_test_w = train_test_split(x, y, test_size=0.2, random_state=0)
创建SVM模型
from sklearn.svm import SVC# 创建 SVC 分类器,使用径向基核函数(rbf),C 为无穷大,随机种子为 0
svm = SVC(kernel='rbf', C=float('inf'), random_state=0)
训练数据
# 使用训练集数据 x_train_w 和标签 y_train_w 训练 SVC 分类器
svm.fit(x_train_w, y_train_w)
测试数据
自测
from sklearn import metrics
# 使用训练好的分类器对训练集数据进行预测
train_pred = svm.predict(x_train_w)
测试集测试
# 使用训练好的分类器对测试集数据进行预测
test_pred = svm.predict(x_test_w)
得到分类报告及准确率
# 输出训练集的分类性能报告,包括精确率、召回率、F1 分数等指标
print(metrics.classification_report(y_train_w, train_pred))
# 输出测试集的分类性能报告
print(metrics.classification_report(y_test_w, test_pred))
# 计算分类器在测试集上的准确率
m = svm.score(x_test_w, y_test_w)
# 打印手写数字用支持向量机的准确率
print(f'手写数字用支持向量机的准确率为:{m}')
完整代码
import numpy as np
import cv2
# 导入 cv2 库用于图像处理,导入 numpy 库用于数据处理
# 读取图像文件 shu_zi.png
img = cv2.imread('shu_zi.png')
# 将读取的图像从 BGR 颜色空间转换为灰度颜色空间
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用 np.vsplit 将灰度图像分割成 50 行,对每一行使用 np.hsplit 分割成 100 列
# 将结果存储在 cells 列表中,列表中的每个元素是分割后的图像块
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]
# 将 cells 列表转换为 numpy 数组
x = np.array(cells)# 将数组重塑为 (-1, 400) 的形状,并将数据类型转换为 float32
# 目的是将数据处理为适合机器学习算法的格式
x = x.reshape(-1, 400).astype(np.float32)# 创建一个包含 0 到 9 的数组
k = np.arange(10)
# 将数组 k 中的元素重复 500 次,作为标签数据
y = np.repeat(k, 500)from sklearn.model_selection import train_test_split
# 将数据 x 和标签 y 按照 80:20 的比例划分为训练集和测试集
# random_state=0 保证每次运行代码划分结果相同
x_train_w, x_test_w, y_train_w, y_test_w = train_test_split(x, y, test_size=0.2, random_state=0)from sklearn.svm import SVC# 创建 SVC 分类器,使用径向基核函数(rbf),C 为无穷大,随机种子为 0
svm = SVC(kernel='rbf', C=float('inf'), random_state=0)
# 使用训练集数据 x_train_w 和标签 y_train_w 训练 SVC 分类器
svm.fit(x_train_w, y_train_w)from sklearn import metrics
# 使用训练好的分类器对训练集数据进行预测
train_pred = svm.predict(x_train_w)
# 输出训练集的分类性能报告,包括精确率、召回率、F1 分数等指标
print(metrics.classification_report(y_train_w, train_pred))# 使用训练好的分类器对测试集数据进行预测
test_pred = svm.predict(x_test_w)
# 输出测试集的分类性能报告
print(metrics.classification_report(y_test_w, test_pred))
# 计算分类器在测试集上的准确率
m = svm.score(x_test_w, y_test_w)
# 打印手写数字用支持向量机的准确率
print(f'手写数字用支持向量机的准确率为:{m}')
与KNN算法准确率做对比
KNN完整代码
import numpy as np
import cv2img =cv2.imread('shu_zi.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
x =np.array(cells)train = x[:,:50]
test =x[:,50:100]# 将数据构造为符合KNN的输入,将每个数字的尺寸由20*20调整为1*400
train_new = train.reshape(-1,400).astype(np.float32)
test_new = test.reshape(-1,400).astype(np.float32)# 分配标签:分别为训练数据、测试数据分配标签
k = np.arange(10)
labels = np.repeat(k,250)
train_labels = labels[:,np.newaxis] # np.newaxis是numpy库中一个特殊对象用于增加一个新的维度
test_labels = np.repeat(k,250)[:,np.newaxis]# # # 构建+训练
knn =cv2.ml.KNearest_create() # 通过cv2创建一个knn模型
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist=knn.findNearest(test_new,k=3)
# ret,result,neighbours,dist=knn.findNearest(a3,k=3)
# # ret:表示查找操作是否成功
# # result:浮点数数组,表示测试样本的预测标签
# # neighbours:这是一个整数数组,表示与测试样本最近的k个索引。
# # dist:这是一个浮点数组,表示测试样本与每一个最近邻居之间的距离。
matches = result==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print("当前使用KNN识别手写数字的准确率为:",accuracy)
从支持向量机算法和KNN算法对比,可看到支持向量机的准确率更高。
相关文章:

《机器学习》——支持向量机(SVM)
文章目录 什么是支持向量机?基本原理数学模型 支持向量机模型模型参数属性信息 支持向量机实例(1)实例步骤读取数据可视化原始数据使用支持向量机训练可视化支持向量机结果完整代码 支持向量机实例(2)实例步骤导入数据…...

【PPTist】公式编辑、插入音视频、添加动画
一、插入公式 点击公式的时候 latexEditorVisible 会变成 true src/views/Editor/CanvasTool/index.vue <Modalv-model:visible"latexEditorVisible" :width"880" ><LaTeXEditor close"latexEditorVisible false"update"data &…...

LeetCode - #186 翻转字符串里的单词 II(会员题)
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Kafka核心参数与使用02
一、从基础的客户端说起 Kafka 提供了非常简单的生产者(Producer)和消费者(Consumer)API。通过引入相应依赖后,可以快速上手编写生产者和消费者的示例。 1. 消息发送者主流程 一个最基础的 Producer 发送消息的步骤…...
Three.js 渲染技术:打造逼真3D体验的幕后功臣
文章目录 前言一、着色器(Shaders)二、后处理(Post-processing)三、抗锯齿(Anti-aliasing)四、实时渲染与离线渲染五、光照模型与材质优化六、环境映射(Environment Mapping)七、纹理…...
QTcpSocket 如何统计在线时长
基本原理 QTcpSocket是 Qt 库中用于 TCP 通信的类。要统计在线时长,关键思路是记录连接建立的时间和当前时间,通过计算两者的差值来得到在线时长。实现步骤 记录连接建立时间: 在连接成功的信号槽函数中记录开始时间。例如,当QTcpSocket成功连接到服务器时,会发出connecte…...

【Altium】AD使用智能粘贴功能把多个网络标签改成端口
1、 文档目标 使用智能粘贴功能把多个网络标签(net lable)改成端口(port) 2、 问题场景 客户有一份原理图,网络用的是net label,没用Port,然后创建一个sheet symbol,但是sheet sy…...

.NET 终止或结束进程
如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false,用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程: System.Diagnostics.Process.GetCurrentProcess().Kill(tru…...
R.swift库的详细用法
R.swift 是一个 Swift 工具库,它提供了一个自动生成的类 R,使得你可以通过类型安全的方式访问项目中的资源,例如图片、字体、颜色、XIB 文件等。通过 R.swift,你可以避免字符串类型的错误,提升代码的可维护性。 以下是 R.swift 库的详细用法: 1. 安装 R.swift 使用 Sw…...

Js的回调函数
一、什么是回调函数(Callback)? 回调函数(Callback Function)是指一个函数被作为参数传递给另一个函数,并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中࿰…...
flutter 独立开发之笔记
1、# use: - [flutter_launcher_icons:] 每次修改完icon后,都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...
PHP的扩展Imagick的安装
windows下的安装 下载:Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows 下载:ghostscript(PDF提取图片时用到,不处理PDF可以不安装) Ghostscript : Downloads 安装扩展 Imagick解压后&…...
【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想
以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost,实际上应该是一个IP地址。 关键字: DOMAIN ROOT_URL 因为是docker…...

多台PC共用同一套鼠标键盘
当环境中有多个桌面 pc 需要操作的时候,在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接,但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse,通过移动光标在不同的 pc 间切换 s…...
大语言模型是如何训练出来的?
近期听了不少与AI相关的播客,有理想转型AI的分享,有Character.ai出来同事的分享等,结合对Transformer架构的理解尝试大致还原大语言模型的训练过程。不过,当我这样的“中国大妈”也能够大致琢磨明白大语言模型是如何训练出来的时候…...
Vue2与Vue3在项目开发中的选择:深入探讨
文章目录 前言一、Vue2的优势与挑战二、Vue3的进步与特性三、如何做出选择?结语 前言 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。Vue2和Vue3是其两个主要版本,它们各自拥有一系列特点和优势。随着Vue3的发布,开发者们面临着在新…...
Web枚举:深入了解目标应用系统
Web枚举是渗透测试中重要的第一步,旨在全面收集目标系统的信息,以便后续攻击载荷的构建更具针对性和效率。本文将详细讨论如何通过各种方法识别目标Web应用的技术栈,并提取关键信息。 1. 识别目标系统的技术栈 技术栈指Web应用所依赖的技术组…...

RabbitMQ介绍与使用
RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器,基于 AMQP(高级消息队列协议)标准,使用 Erlang 编程语言构建。它是消息队列(MQ)的一种,广泛应用于分布式系统中&#x…...

从0到机器视觉工程师(六):配置OpenCV和Qt环境
CMake配置OpenCV CMakeLists.txt文件的编写 cmake_minimum_required(VERSION 3.20) project(test_opencv LANGUAGES CXX) #寻找Opencv库 FIND_PACKAGE(OpenCV REQUIRED) include_directories(test_opencv ${OpenCV_INCLUDE_DIRS}) add_executable(test_opencv main.cpp) TARGE…...

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...