本篇文章Master Hyperband — An Efficient Hyperparameter Tuning Method in Machine Learning深入探讨了Hyperband这一高效的超参数调优方法。文章的技术亮点在于其结合了多臂老虎机策略和逐次减半算法,能够在大搜索空间中快速剔除表现不佳的配置,从而节省计算资源。


文章目录

    • 1 介绍
    • 2 什么是 Hyperband
      • 2.1 Hyperband 的工作原理
      • 2.1.1 第1步 定义预算和淘汰因子
      • 2.1.2 第2步 遍历各个 Bracket
      • 2.1.3 第3步 运行 Successive Halving Algorithm (SHA)
      • 2.1.4 第4步 选出最佳配置
      • 2.1.5 例子演示 — 支持向量分类器(SVC)
    • 3 模拟实验
      • 3.1 创建训练和测试数据集
      • 3.2 模型定义 — LSTM网络
      • 3.3 搜索空间
      • 3.4 定义验证函数
      • 3.5 运行 Hyperband
      • 3.6 结果
      • 3.7 与其他调优方法的对比
      • 3.8 Bayesian Optimization
      • 3.9 Random Search
      • 3.10 Genetic Algorithms (GA)
    • 4 考虑与总结
      • 4.1 提升 Hyperband 性能的建议


1 介绍

Hyperband 是一种强大的机器学习超参数调优方法,利用**successive halving(逐步淘汰)**策略来高效分配资源。

然而,执行 Hyperband 需要对其核心机制和参数进行细致考量,以最大化其优势。

本文将通过调优用于股票价格预测的 LSTM 网络,深入探讨 Hyperband 的核心机制,并与其他主要调优方法进行性能对比:

  • Bayesian Optimization(贝叶斯优化)
  • Random Search(随机搜索),以及
  • Genetic Algorithms(遗传算法)

2 什么是 Hyperband

Hyperband 是一种高效的超参数调优算法,结合了multi-armed bandit(多臂老虎机)策略和successive halving algorithm(SHA,逐步淘汰算法)

多臂老虎机问题是概率论中的一个问题,展示了以下基本权衡:

  • 探索(Exploration): 探索广泛的超参数配置,
  • 利用(Exploitation): 利用最有前景的配置。

SHA 是一种资源分配策略,它为随机采样的配置分配固定的预算(如训练的epoch数)。

在每个阶段,SHA 评估超参数配置的表现,剔除表现最差的配置,同时将剩余预算重新分配给幸存的配置,称为survivors(幸存者)

Hyperband 更进一步,通过使用不同的初始预算运行 SHA,以平衡探索和利用。

下面的图表分类展示了主要的超参数调优方法:

Types of hyperparameter tuning methods

在众多调优方法中,Hyperband 在速度和效率上具有明显优势,尤其适合处理大规模搜索空间。

2.1 Hyperband 的工作原理

下图展示了 Hyperband 如何将更多预算分配给最终胜出者(配置#4),尽管在 Bracket 1 中的初始预算分配是随机的:

Hyperband 工作流程

Hyperband 以在Bracket 1中创建大量超参数配置并分配较小预算开始。

随后,随着进入后续的各个 Bracket,配置数量逐步减少,而幸存配置获得更多预算。

在图中的Bracket 2,Hyperband 将更多预算分配给来自 Bracket 1 的幸存者(配置#1和#4)。

最终,在Bracket 3中,将全部预算分配给最终胜出者配置#4。

这种方法有效地探索了广泛的配置,同时快速剔除表现差的配置,实现了探索与利用的平衡。

这一过程可分为四步:

2.1.1 第1步 定义预算和淘汰因子

首先定义:

  • 最大资源预算(R): 单个模型可训练的最大epoch数,
  • 淘汰因子(η): 预设的因子,用于决定淘汰的激进程度。

常见的淘汰因子值有2、3或4。

每个阶段,超参数配置数量除以η,幸存配置的预算乘以η。

2.1.2 第2步 遍历各个 Bracket

算法运行一系列 Bracket,每个 Bracket 是使用不同起始预算的完整 Successive Halving 算法(SHA)运行。

Bracket 数量由最大Bracket索引 smaxs_{max}smax 决定:

Bracket最大索引计算公式

其中:

  • ηηη:淘汰因子,
  • RRR:最大资源预算。

算法从 smaxs_{max}smax 迭代到0。

2.1.3 第3步 运行 Successive Halving Algorithm (SHA)

对于每个 Bracket sss,Hyperband 确定开始时的超参数配置数量 nsn_sns

Hyperband 有意在预算小的 Bracket 中设置较多配置,预算大的 Bracket 中配置较少。

数学表达式如下:

配置数量计算公式

其中:

  • nsn_sns:当前Bracket的配置数量,
  • RRR:最大资源预算,
  • ηηη:淘汰因子,
  • smaxs_{max}smax:最大Bracket数,
  • sss:当前Bracket索引,范围从 smaxs_{max}smax 到 0。

Hyperband 还确定每个Bracket的初始预算 rsr_srs

初始预算计算公式

其中:

  • rsr_srs:当前Bracket的初始预算,
  • RRRηηηsmaxs_{max}smax 同上。

Hyperband 随机采样 nsn_sns 个超参数配置,每个训练 rsr_srs 个 epoch。

然后根据表现选出前 ns/ηn_s / ηns/η 个幸存者。

这些幸存者再接受更大预算训练,总训练epoch达到 rs⋅ηr_s \cdot ηrsη

此过程不断进行,配置数量逐步减半,预算逐步增加,直到只剩一个配置或达到最大预算。

2.1.4 第4步 选出最佳配置

所有 Bracket 运行完毕后,选出表现最优的超参数配置作为最终结果。

Hyperband 的效率来自于它能快速剔除表现不佳的配置,释放资源训练更有潜力的配置更长时间。

2.1.5 例子演示 — 支持向量分类器(SVC)

下面通过调优支持向量分类器(SVC)的正则化参数 C 和核函数系数 gamma,演示 Hyperband 的工作过程。

模型: 支持向量分类器(SVC)

搜索空间:

  • C: [0.1, 1, 10, 100]
  • gamma: [‘scale’, ‘auto’, 0.1, 1, 10]

第1步 定义预算和淘汰因子

设最大预算 R=81R=81R=81,淘汰因子 η=3η=3η=3

第2步 遍历 Bracket

计算最大Bracket索引:

最大Bracket索引计算

即 Hyperband 将运行 s=4,3,2,1,0s=4,3,2,1,0s=4,3,2,1,0 五个 Bracket。

每个 Bracket 的配置数量 nsn_sns 和初始预算 rsr_srs 如下:

  • Bracket 1 (s=4s=4s=4): ns=1n_s=1ns=1, rs=9r_s=9rs=9
  • Bracket 2 (s=3s=3s=3): ns=3n_s=3ns=3, rs=3r_s=3rs=3
  • Bracket 3 (s=2s=2s=2): ns=9n_s=9ns=9, rs=1r_s=1rs=1
  • Bracket 4 (s=1s=1s=1): ns=27n_s=27ns=27, rs=1/3r_s=1/3rs=1/3
  • Bracket 5 (s=0s=0s=0): ns=81n_s=81ns=81, rs=1/9r_s=1/9rs=1/9

预算 R=81R=81R=81 在这些 Bracket 中分配,以高效寻找最佳配置。

第3步 运行 SHA

以 Bracket 3 (s=2s=2s=2) 为例:

  1. 初始运行:
  • 随机采样9个配置,
  • 每个训练1个 epoch,
  • 记录表现,
  • 保留表现最好的3个(9/3=39/3=39/3=3),其余剔除。
  1. 第二轮运行:
  • 这3个幸存者训练3个 epoch(1×3=31 \times 3=31×3=3),
  • 记录表现,
  • 保留表现最好的1个(3/3=13/3=13/3=1)。
  1. 最终运行:
  • 剩下的单个幸存者训练9个 epoch(3×3=93 \times 3=93×3=9),
  • 记录表现。

第4步 选出最佳

Hyperband 对所有 Bracket 执行上述步骤,最终选出表现最优的配置。


3 模拟实验

接下来,演示 Hyperband 在更复杂模型——LSTM网络上的应用。

模型用于预测选定股票代码 NVDA收盘价

3.1 创建训练和测试数据集

通过 Alpha Vantage API 获取历史日线股价数据。

将数据加载到 Pandas DataFrame 并预处理,划分为训练集和测试集。

训练集用于模型训练和验证,测试集保持独立以防止数据泄露。

import torch  
import pandas as pd  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler, OneHotEncoder  
from sklearn.compose import ColumnTransformertarget_col = 'close'  
y = df.copy()[target_col].shift(-1)   
y = y.iloc[:-1] input_cols = [col for col in df.columns if col not in [target_col, 'dt']]   
X = df.copy()[input_cols]  
X = X.iloc[:-1] X_train, X_test, y_train, y_test = train_test_split(  X, y, test_size=800, shuffle=False, random_state=42  
)cat_cols = ['year', 'month', 'date']  
num_cols = list(set(input_cols) - set(cat_cols))  
preprocessor = ColumnTransformer(  transformers=[  ('num', StandardScaler(), num_cols),  ('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols)  ]  
)  
X_train = preprocessor.fit_transform(X_train)  
X_test = preprocessor.transform(X_test)X_train = torch.from_numpy(X_train.toarray()).float()  
y_train = torch.from_numpy(y_train.values).float().unsqueeze(1)  
X_test = torch.from_numpy(X_test.toarray()).float()  
y_test = torch.from_numpy(y_test.values).float().unsqueeze(1)

原始数据包含 NVDA 的 6,501 条历史股价记录:

<class 'pandas.core.frame.DataFrame'>  
RangeIndex: 6501 entries, 0 to 6500  
Data columns (total 15 columns):  0   dt               6501 non-null   datetime64[ns]  1   open             6501 non-null   float32         2   high             6501 non-null   float32         3   low              6501 non-null   float32         4   close            6501 non-null   float32         5   volume           6501 non-null   int32           6   ave_open         6501 non-null   float32         7   ave_high         6501 non-null   float32         8   ave_low          6501 non-null   float32         9   ave_close        6501 non-null   float32         10  total_volume     6501 non-null   int32           11  30_day_ma_close  6501 non-null   float32         12  year             6501 non-null   object          13  month            6501 non-null   object          14  date             6501 non-null   object          
dtypes: datetime64[ns](1), float32(9), int32(2), object(3)  
memory usage: 482.6+ KB

3.2 模型定义 — LSTM网络

定义基于 PyTorch 的多对一架构的 LSTMModel 类。

import torch  
import torch.nn as nnclass LSTMModel(nn.Module):  def __init__(self, input_dim, hidden_dim, layer_dim, output_dim, dropout):  super(LSTMModel, self).__init__()  self.hidden_dim = hidden_dim  self.layer_dim = layer_dim  self.dropout = dropout  self.lstm = nn.LSTM(  input_dim, hidden_dim, layer_dim, batch_first=True, dropout=dropout  )  self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):  h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).to(x.device)  c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).to(x.device)  o_t, _ = self.lstm(x, (h0.detach(), c0.detach()))  o_final = self.fc(o_t[:, -1, :])  return o_final

3.3 搜索空间

Hyperband 在较大的搜索空间表现更佳。定义如下搜索空间:

import randomdef search_space():  return {  'lr': 10**random.uniform(-6, -1),  'hidden_dim': random.choice([16, 32, 64, 128, 256]),  'layer_dim': random.choice([1, 2, 3, 4, 5]),  'dropout': random.uniform(0.1, 0.6),  'batch_size': random.choice([16, 32, 64, 128, 256])  }

3.4 定义验证函数

定义用于时间序列数据的 walk-forward validation(滚动前移验证)train_and_val_wfv 函数:

def train_and_val_wfv(hyperparams, budget, X, y, train_window, val_window):  total_val_loss = 0  all_loss_histories = []num_folds = (X.size(0) - train_window - val_window) // val_window + 1for i in range(num_folds):  train_start = i * val_window  train_end = train_start + train_window  val_start = train_end  val_end = val_start + val_windowif val_end > X.size(0):  breakX_train_fold = X[train_start:train_end]  y_train_fold = y[train_start:train_end]  X_val_fold = X[val_start:val_end]  y_val_fold = y[val_start:val_end]fold_val_loss, fold_loss_history = train_and_val(  hyperparams=hyperparams,  budget=budget,  X_train=X_train_fold,  y_train=y_train_fold,  X_val=X_val_fold,  y_val=y_val_fold  )  total_val_loss += fold_val_loss  all_loss_histories.append(fold_loss_history)avg_val_loss = total_val_loss / num_folds  return avg_val_loss, all_loss_histories

3.5 运行 Hyperband

定义 run_hyperband 函数,接受以下参数:

  • 搜索空间函数 search_space_fn
  • 验证函数 val_fn
  • 总预算 R
  • 淘汰因子 η

示例中,R=100R=100R=100, η=3η=3η=3,训练和验证窗口分别为3000和500。

from math import log, floordef run_hyperband(search_space_fn, val_fn, R, eta):  s_max = int(log(R, eta))overall_best_config = None  overall_best_loss = float('inf')  all_loss_histories = []for s in range(s_max, -1, -1):  n = int(R / eta**s)  r = int(R / n)  main_logger.info(f'... running bracket s={s}: {n} configurations, initial budget={r} ...')configs = [search_space_fn() for _ in range(n)]for i in range(s + 1):  budget = r * (eta**i)  main_logger.info(f'... training {len(configs)} configurations for budget {budget} epochs ...')evaluated_results = []  for config in configs:  loss, loss_history = val_fn(config, budget)  evaluated_results.append((config, loss, loss_history))all_loss_histories.append((evaluated_results, budget))evaluated_results.sort(key=lambda x: x[1])if evaluated_results and evaluated_results[0][1] < overall_best_loss:  overall_best_loss = evaluated_results[0][1]  overall_best_config = evaluated_results[0][0]num_to_keep = floor(len(configs) / eta)  configs = [result[0] for result in evaluated_results[:num_to_keep]]if not configs:  breakreturn overall_best_config, overall_best_loss, all_loss_histories, s_maxR = 100  
eta = 3train_window = 3000  
val_window = 500best_config, best_loss, all_loss_histories, s_max = run_hyperband(  search_space_fn=search_space,   val_fn=lambda h, b: train_and_val_wfv(h, b, X_train, y_train, train_window=train_window, val_window=val_window),  R=R,   eta=eta  
)

3.6 结果

最佳超参数配置:

  • ‘lr’: 0.0001614172022855225
  • ‘hidden_dim’: 128
  • ‘layer_dim’: 3
  • ‘dropout’: 0.5825758700895215
  • ‘batch_size’: 16

最佳验证损失(均方误差 MSE):

0.0519

损失历史:

下图中,实线表示训练周期中平均验证损失(MSE)的变化,垂直虚线表示 Hyperband 剪枝不佳模型的时刻:

Hyperband 损失历史

提前停止(大多为紫色)的曲线代表表现不佳被剪枝的模型。

持续训练到100个epoch(大多为青色和蓝色)的曲线代表表现优异的配置,损失迅速下降并稳定在较低值,显示出良好性能。

这种方式能高效快速地剔除表现差的配置,避免长时间训练。

3.7 与其他调优方法的对比

为比较不同方法,进行了20次试验:

  • Bayesian Optimization(贝叶斯优化)
  • Random Search(随机搜索)
  • Genetic Algorithms(遗传算法)

使用相同的搜索空间、模型和训练/验证窗口。

3.8 Bayesian Optimization

贝叶斯优化使用概率模型(如高斯过程)拟合验证误差,选择下一个最优配置进行评估。

最佳超参数配置:

  • ‘lr’: 0.00016768631941614767
  • ‘hidden_dim’: 256
  • ‘layer_dim’: 3
  • ‘dropout’: 0.3932769195043036
  • ‘batch_size’: 64

最佳验证损失(MSE):

0.0428

损失历史:

Bayesian Optimization 损失历史

3.9 Random Search

随机搜索从搜索空间随机采样固定数量配置,不利用之前试验结果。

最佳超参数配置:

  • ‘lr’: 0.0004941205117774383
  • ‘hidden_dim’: 128
  • ‘layer_dim’: 2
  • ‘dropout’: 0.3398469430820351
  • ‘batch_size’: 64

最佳验证损失(MSE):

0.03620

损失历史:

Random Search 损失历史

3.10 Genetic Algorithms (GA)

遗传算法受生物进化启发,维护一组配置,通过变异和交叉生成新的潜在更优配置。

最佳超参数配置:

  • ‘lr’: 0.006441170552290832
  • ‘hidden_dim’: 128
  • ‘layer_dim’: 3
  • ‘dropout’: 0.2052570911345997
  • ‘batch_size’: 128

最佳验证损失(MSE):

0.1321

损失历史:

Genetic Algorithms 损失历史

完整源码请见 我的 Github 仓库。

4 考虑与总结

Random Search(0.0362)和 Bayesian Optimization(0.0428)在最终验证损失上略优于 Hyperband(0.0519)。

这体现了效率与全局最优发现能力之间的权衡。

Hyperband 的效率来源于其在训练早期快速剔除表现差的配置。

虽然节省了大量时间,但也存在误删“后期表现优异”配置的风险。

本案例中,Random Search 和 Bayesian Optimization 更成功:

  • Random Search 允许高性能配置获得完整训练预算,
  • Bayesian Optimization 通过智能采样更有效地寻找最佳超参数。

4.1 提升 Hyperband 性能的建议

推荐调整 Hyperband 参数并结合其他方法:

  1. 调整关键参数
  • 设定较大 RRR(总预算)允许“后期表现优异”模型有机会充分训练,减少误删,
  • 设定较小 ηηη(淘汰因子)使淘汰过程更温和,更多配置进入下一轮。
  1. 结合贝叶斯优化

BOHB(Bayesian Optimization and HyperBand) 是一种混合方法,使用 Hyperband 的逐步淘汰框架,但用贝叶斯优化替代随机采样。

BOHB 利用贝叶斯优化选择最有潜力的候选配置进入 Hyperband Bracket。

该方法兼具 Hyperband 的快速性和贝叶斯优化的高性能。

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

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

相关文章

Mysql:InnoDB 关键特性

目录 一、插入缓冲&#xff08;Change Buffer&#xff09;→ 快递驿站的 “临时存放区” 二、两次写&#xff08;Double Write&#xff09;→ 重要文件的 “备份存档” 三、自适应哈希索引&#xff08;AHI&#xff09;→ 图书馆的 “热门书快捷查找区” 四、异步 IO&#x…

STM32-----SPI

SPI简介SCK:和I2C中SCL的时钟线一个作用&#xff0c;都是在高电平拿出数据&#xff0c;在低电平写数据MOSI:主机输出从机输入MISO:主机输入从机输出&#xff0c;只有当对应从机的SS为低电平&#xff0c;从机的MISO引脚才能设置推挽输出&#xff0c;当从机SS为高电平时&#xff…

华为考试:HCIE数通考试难度分析

随着信息技术的飞速发展&#xff0c;网络技术已成为支撑各行各业运转的重要基础&#xff0c;市场对高水平网络技术人才的需求持续增长。HCIE作为华为认证体系中的最高级别认证&#xff0c;代表了网络技术领域的专业顶尖水平。本文将对HCIE数通认证的考试内容、难度及备考策略进…

一些常用的激活函数及绘图

深度网络的一些常用激活函数&#xff0c;并通过matplot绘制出来&#xff1a; import matplotlib.pyplot as plt import numpy as npdef relu(x):return np.maximum(0, x)def leaky_relu(x, alpha0.01):return np.where(x > 0, x, alpha * x)def gelu(x):return 0.5 * x * (1…

AE苹果手机iPhone 17展示动画片头模板 App Promo Phone 17 Pro

专为 App 发布会、电商促销、新品宣传 打造的 iPhone 17 Pro 动画展示 AE 模板。 4K 超清分辨率 26 张可替换照片位&#xff0c;无需第三方插件&#xff0c;拖拽即可输出专业级手机宣传片。 核心亮点 4K 超清&#xff1a;38402160 分辨率&#xff0c;大屏投放与社媒高清压缩无…

基于Python的云原生TodoList Demo 项目,验证云原生核心特性

以下是一个基于 Python 的云原生 TodoList Demo 项目&#xff0c;涵盖 容器化、Kubernetes 编排、CI/CD、可观测性、弹性扩缩容 等核心云原生特性&#xff0c;代码简洁且附详细操作指南&#xff0c;适合入门学习。项目概览 目标&#xff1a;实现一个支持增删改查&#xff08;CR…

go 日志的分装和使用 Zap + lumberjack

自带的log无法满足 按大小轮转 &#xff0c;按天数清理旧日志 &#xff0c;自动压缩 &#xff0c;限制备份数量 &#xff0c;防止磁盘写满 &#xff0c;生产环境推荐 等 使用 Zap lumberjack package mainimport ("go.uber.org/zap""go.uber.org/zap/zapcore&q…

【.Net技术栈梳理】01-核心框架与运行时(CLR)

文章目录1 .NET Runtime&#xff08;CLR-公共语言运行时&#xff09;1.1 中间语言 IL1.1.1 从源代码到通用中间语言&#xff08;IL&#xff09;1.1.2 运行时加载&#xff1a;CLR登场1.1.3 核心步骤&#xff1a;即时编译 (JIT Compilation)1.1.4 执行与内存管理&#xff08;GC&a…

Claude Code 平替:OpenAI发布 Codex CLI ,GPT-5 国内直接使用

openai推出的命令行编程工具codex已经可以使用最新 GPT-5 模型&#xff0c;拥有可媲美 Claude Code 的 AI 编码能力。本文将指导你在 Windows 系统上部署原生的 Codex CLI 程序&#xff0c;并接入超低价中转 API&#xff0c;让你在国内直接用上超高性价比的 OpenAI Codex CLI 应…

在VS2022的WPF仿真,为什么在XAML实时预览点击 ce.xaml页面控件,却不会自动跳转到具体代码,这样不方便我修改代码,

在VS2022的WPF仿真&#xff0c;为什么在XAML实时预览点击 WpfApp1\FunctionalModule\08Replace\Replace.xaml页面控件&#xff0c;却不会自动跳转到具体代码&#xff0c;这样不方便我修改代码&#xff0c;

Git Bash 别名

有些常用的指令参数非常多&#xff0c;每次都要输入好多参数&#xff0c;我们可以使用别名。Linux 系统中很多 shell&#xff0c;包括 bash&#xff0c;sh&#xff0c;zsh&#xff0c;dash 和 korn 等&#xff0c;不管哪种 shell 都会有一个 .bashrc 的隐藏文件&#xff0c;它就…

Centos7部署ceph存储

一、准备5台centos7主机 node节点双网卡&#xff08;1个内部检测&#xff0c;1个外部使用&#xff09;node节点都添加新网卡关闭防火墙和上下文都需要添加hosts文件都需要cat > /etc/hosts << EOF > 127.0.0.1 localhost localhost.localdomain localhost4 loca…

2025.9.10总结

今日感悟&#xff1a;刷到00后下班去菜市场捡菜的热点视频&#xff0c;确实挺有意思&#xff0c;不得不说&#xff0c;又省钱又好玩。虽然每天晚上能免费领个25块钱的水果回去&#xff0c;但确实没有什么新鲜感了。别人下班还能捡捡菜放松下&#xff0c;我下班&#xff0c;除了…

【数据结构与算符Trip第2站】稀疏数组

稀疏sparsearray数组 什么是稀疏数组&#xff1f; 稀疏数组是一种特殊的数据结构&#xff0c;用于高效存储和表示大部分元素为零&#xff08;或默认值&#xff09;的数组。它通过只存储非零元素的位置和值来节省内存空间。是一种压缩数组。 实现原理 在Go语言中&#xff0c;稀疏…

Sub-GHz无线收发单片机,低功耗物联网通信的硬件“基石”

随着物联网应用持续向规模化部署、广域化覆盖与高效化协同迈进&#xff0c; 作为IoT终端设备实现无线交互的核心通信单元之一——Sub-GHz无线收发单片机&#xff08;Sub-GHz射频收发芯片与单片机高度集成&#xff09;已成为系统设计中进一步简化外围元件数量、缩小硬件体积、降…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能

在 Vue3 中结合 TypeScript 封装表单绑定方案时&#xff0c;需要综合考虑类型安全、功能扩展性和开发体验。以下是一个包含防抖功能、支持多种表单控件、具备完整类型推导的封装方案&#xff0c;全文约 2300 字&#xff1a; 方案设计思路 组合式函数封装&#xff1a;使用 Vue3 …

中悦大华通过订单日记实现流程重构之路

一、客户背景 安徽中悦大华高速流体机械有限公司&#xff0c;成立于2023年&#xff0c;位于安徽省宣城市&#xff0c;是一家以从事电子设备制造为主的企业&#xff0c;在多年的商业经营中已成为业界翘楚。 在业务不断壮大的过程中&#xff0c;面临生产协作效率低&#xff0c;库…

【Springboot】介绍启动类和启动过程

【Springboot】介绍启动类和启动过程【一】Spring Boot 启动类的注解【1】核心注解&#xff1a;SpringBootApplication&#xff08;1&#xff09;​SpringBootConfiguration​&#xff1a;Spring容器会从该类中加载Bean定义&#xff08;2&#xff09;​EnableAutoConfiguration…

Gears实测室:第一期·音游跨设备性能表现与工具价值实践

在音游品类中&#xff0c;《跳舞的线》以 “音乐与操作节奏深度绑定” 的玩法特性&#xff0c;对设备性能提出了特殊要求 —— 稳定的帧率与低延迟的渲染响应&#xff0c;直接影响玩家对音符时机的判断&#xff0c;一旦出现卡顿或帧波动&#xff0c;易导致操作失误&#xff0c;…

格式刷+快捷键:Excel和WPS表格隔行填充颜色超方便

有时候我们会对Excel或WPS表格的数据区域每隔一行填充一个底纹&#xff0c;便于阅读和查看。可以使用条件格式搭配公式实现&#xff0c;也可以手动设置。通常手动设置的时候是先设置一行&#xff0c;然后再双击格式刷应用。可以有更快的方式&#xff1a;先设置一行底纹&#xf…