多臂赌博机:探索与利用的平衡艺术
1. 引言
在机器学习领域,多臂赌博机(Multi-Armed Bandit,MAB)问题是强化学习的一个经典且基础的模型。这个名称源于赌场中的"单臂老虎机"(One-armed Bandit),因为这种赌博机器像强盗一样掠夺赌徒的财富。多臂赌博机问题则扩展到有多个拉杆(臂)的情况。
在这种模型中,决策者面临着一个核心挑战:如何在"探索"未知选项和"利用"已知高回报选项之间取得平衡。这种"探索-利用"(Exploration-Exploitation)权衡在许多现实场景中都有应用,从临床试验、广告投放到推荐系统等。
上图展示了多臂赌博机问题中的核心权衡:蓝色柱状图表示我们对每个臂的奖励估计值和不确定性,红色星号表示真实的奖励均值。绿色虚线是当前估计的最佳臂,红色虚线是真实的最佳臂。决策者需要通过适当的探索来减少不确定性,同时通过利用已知信息选择高回报的臂。
本文将深入探讨多臂赌博机模型的理论基础,介绍几种经典算法的实现方法,并通过代码实例和可视化结果展示这些算法在实践中的表现。
2. 问题的形式化定义
2.1 基本概念
多臂赌博机问题可以形式化描述为:
- 有K个"臂"(arms),每个臂在被拉动时产生随机奖励
- 每个臂i的奖励服从某个未知分布,均值为μi
- 决策者的目标是最大化T轮决策中的累积奖励
在每一轮t,决策者必须选择一个臂at,获得相应的奖励rt,并基于历史观察来调整后续的决策策略。
2.2 性能评估指标
评估多臂赌博机算法的主要指标有:
- 累积遗憾(Cumulative Regret):实际获得的奖励与理想情况(总是选择最优臂)的奖励之差。
$$R_T = T\mu^* - \sum_{t=1}^{T}\mu_{a_t}$$
其中μ是最优臂的期望奖励,μat是第t轮选择的臂的期望奖励。
下图展示了不同算法的累积遗憾随时间的变化:
下图展示了不同算法的累积遗憾随时间的变化:
从图中可以看出,汤普森采样(Thompson Sampling)算法的累积遗憾增长最慢,表明其性能最优;而简单的ε-贪婪算法的累积遗憾增长最快。
3. 主要算法及实现
3.1 ε-贪婪算法(Epsilon-Greedy)
ε-贪婪算法是最简单直观的方法:以概率ε随机探索,以概率1-ε选择当前估计奖励最高的臂。
Apply to ucb_confiden...class EpsilonGreedy:def __init__(self, n_arms, epsilon=0.1):self.n_arms = n_armsself.epsilon = epsilon # 探索概率self.value_estimates = np.zeros(n_arms) # 每个臂的估计价值self.action_counts = np.zeros(n_arms) # 每个臂被选择的次数def select_arm(self):# 以概率epsilon进行探索if np.random.random() < self.epsilon:return np.random.randint(self.n_arms)# 以概率1-epsilon进行利用else:return np.argmax(self.value_estimates)def update(self, action, reward):# 更新选择的臂的计数self.action_counts[action] += 1# 增量更新估计价值n = self.action_counts[action]value = self.value_estimates[action]self.value_estimates[action] = value + (1/n) * (reward - value)
ε-贪婪算法的优点是简单易实现,缺点是探索是完全随机的,没有考虑各臂之间的差异,且ε参数是固定的,不随时间调整。
3.2 上置信界算法(UCB)
UCB(Upper Confidence Bound)算法通过在估计奖励值上添加置信区间,实现了"乐观面对不确定性"的原则。这使得算法会自动优先探索不确定性高的臂。
Apply to ucb_confiden...class UCB:def __init__(self, n_arms, c=2.0):self.n_arms = n_armsself.c = c # 控制探索程度的参数self.value_estimates = np.zeros(n_arms)self.action_counts = np.zeros(n_arms)self.t = 0 # 总步数def select_arm(self):# 确保每个臂至少被选择一次for arm in range(self.n_arms):if self.action_counts[arm] == 0:return arm# 计算UCB值并选择最大值对应的臂ucb_values = np.zeros(self.n_arms)for arm in range(self.n_arms):ucb_values[arm] = self.value_estimates[arm] + self.c * math.sqrt(math.log(self.t) / self.action_counts[arm])return np.argmax(ucb_values)
下图展示了UCB算法在不同时间步的上置信界变化:
UCB的核心思想是每个臂的价值由两部分组成:当前估计的奖励均值(利用项)和不确定性度量(探索项)。随着臂被选择次数的增加,不确定性会减小,探索项也会相应减小。
3.3 汤普森采样(Thompson Sampling)
汤普森采样是一种基于贝叶斯思想的方法,通过对每个臂的奖励分布进行后验采样来进行决策。
Apply to ucb_confiden...class ThompsonSampling:def __init__(self, n_arms, alpha=1.0, beta=1.0):self.n_arms = n_arms# 初始化Beta分布参数self.alpha_values = np.ones(n_arms) * alphaself.beta_values = np.ones(n_arms) * betadef select_arm(self):# 从每个臂的Beta分布中抽样samples = np.random.beta(self.alpha_values, self.beta_values)# 选择样本值最大的臂return np.argmax(samples)def update(self, action, reward):# 假设奖励在[0,1]范围内reward_01 = max(0, min(1, reward))# 更新Beta分布参数self.alpha_values[action] += reward_01self.beta_values[action] += (1 - reward_01)
汤普森采样的优势在于:很好地平衡了探索与利用,有良好的理论保证和实证表现,并且可以适应非平稳环境。
4. 算法性能比较
我们比较了四种算法在10臂赌博机上的表现:
- ε-贪婪(ε=0.1)
- ε-贪婪(ε=0.01)
- UCB(c=2)
- 汤普森采样
实验结果如下:
从左图可以看出,汤普森采样获得了最高的平均奖励,其次是UCB算法,然后是两种不同参数的ε-贪婪算法。右图显示了各算法选择最优臂的比例,同样是汤普森采样表现最好。
这些结果验证了我们的理论分析:
- 探索-利用平衡的影响:ε-贪婪算法中,ε=0.1比ε=0.01表现出更好的初期探索能力,但长期可能会有更多无效探索。UCB算法的自适应探索:UCB在初期能快速找到较好的臂,并随时间减少探索。
- 汤普森采样的贝叶斯优势:汤普森采样通常表现最好,尤其在较少试验次数的情况下。
5. 高级扩展:上下文多臂赌博机
标准多臂赌博机假设各臂的奖励分布是固定的,但现实世界中,最优决策往往依赖于当前的上下文。上下文多臂赌博机(Contextual Bandit)考虑了这一因素。
5.1 问题定义
在上下文多臂赌博机中,每次决策前都会观察到一个上下文向量xt,不同的上下文下,各臂的期望奖励也不同。目标是学习一个策略π(a|x),为给定上下文x选择最优臂a。
5.2 LinUCB算法
LinUCB是解决上下文多臂赌博机问题的经典算法,假设奖励与上下文之间存在线性关系。
Apply to ucb_confiden...class LinUCB:def __init__(self, n_arms, d, alpha=1.0):self.n_arms = n_armsself.d = d # 上下文特征维度self.alpha = alpha # 探索参数# 为每个臂初始化参数self.A = [np.identity(d) for _ in range(n_arms)] # 协方差矩阵self.b = [np.zeros((d, 1)) for _ in range(n_arms)] # 回归向量self.theta = [np.zeros((d, 1)) for _ in range(n_arms)] # 模型参数def select_arm(self, context):# 确保上下文的形状正确context = np.reshape(context, (self.d, 1))# 为每个臂计算UCBucb_values = np.zeros(self.n_arms)for arm in range(self.n_arms):# 计算参数估计值A_inv = np.linalg.inv(self.A[arm])self.theta[arm] = A_inv.dot(self.b[arm])# 计算UCBp = self.theta[arm].T.dot(context) # 预测奖励s = context.T.dot(A_inv).dot(context) # 不确定性ucb_values[arm] = p + self.alpha * np.sqrt(s)return np.argmax(ucb_values)
下图比较了不同参数的LinUCB算法以及EXP3算法在上下文环境中的表现:
从图中可以看出,LinUCB算法能有效利用上下文信息提高性能,而探索参数α的选择对性能有显著影响。在有上下文信息的环境中,上下文感知算法(如LinUCB)明显优于非上下文算法(如EXP3)。
6. 实际应用场景
多臂赌博机模型已在众多领域得到了成功应用:
6.1 在线广告投放
广告平台需要决定向用户展示哪些广告,以最大化点击率或转化率。这本质上是一个多臂赌博机问题:
- 臂:不同的广告创意
- 奖励:用户点击或转化
- 上下文:用户信息、浏览历史等
上图左侧展示了不同用户群体对不同广告的点击率,右侧展示了使用多臂赌博机算法优化广告分配后的累积点击量。可以看到,算法能够自动学习将广告B更多地展示给女性用户,将广告C更多地展示给中年用户等,从而提高整体点击率。
6.2 临床试验和医疗决策
在临床试验中,研究人员需要平衡获取新治疗方法效果信息(探索)和为患者提供已知最佳治疗(利用)。多臂赌博机算法可用于自适应设计临床试验,减少无效治疗的样本量,提高试验效率。
6.3 内容推荐系统
新闻、视频、音乐等内容推荐系统需要根据用户历史喜好和当前状态推荐最可能感兴趣的内容。上下文多臂赌博机算法可以有效处理这类问题,实现个性化推荐。
7. 核心代码实现
让我们看一下如何实现一个完整的多臂赌博机实验:
Apply to ucb_confiden...def run_simulation(bandit, algorithms, num_steps, num_runs=1):"""运行多臂赌博机模拟参数:bandit: 多臂赌博机环境algorithms: 算法列表num_steps: 每次运行的步数num_runs: 运行次数"""num_algorithms = len(algorithms)# 存储结果rewards = np.zeros((num_algorithms, num_runs, num_steps))optimal_actions = np.zeros((num_algorithms, num_runs, num_steps))optimal_arm = bandit.get_optimal_arm()for run in range(num_runs):# 重置环境和算法bandit.reset()for alg in algorithms:alg.reset()for step in range(num_steps):for i, algorithm in enumerate(algorithms):# 选择臂arm = algorithm.select_arm()# 拉动臂并获取奖励reward = bandit.pull(arm)# 更新算法algorithm.update(arm, reward)# 记录结果rewards[i, run, step] = rewardoptimal_actions[i, run, step] = 1 if arm == optimal_arm else 0# 计算平均值mean_rewards = np.mean(rewards, axis=1)mean_optimal = np.mean(optimal_actions, axis=1)return mean_rewards, mean_optimal
8. 未来研究方向
多臂赌博机研究仍在快速发展中,几个重要的方向包括:
8.1 非平稳环境下的多臂赌博机
现实世界中,奖励分布通常会随时间变化。如何在这种非平稳环境中高效学习是一个重要挑战。常见方法包括使用滑动窗口、折扣因子等。
8.2 深度多臂赌博机
将深度学习与多臂赌博机相结合,处理高维复杂的上下文信息。深度Q网络(DQN)等方法可以看作是这一方向的探索。
8.3 分布式多臂赌博机
在多用户、多设备的场景下,如何协调不同决策者的行为以及共享学习经验,是分布式多臂赌博机需要解决的问题。
9. 总结
多臂赌博机模型为解决"探索-利用"权衡提供了一个强大而优雅的框架。从最简单的ε-贪婪算法到复杂的上下文感知算法,这一领域的发展反映了人们对决策问题的深入理解。
通过本文的算法实现和实验分析,我们可以看到不同算法在各种场景下的性能差异。选择哪种算法取决于具体应用场景的特点、计算资源的限制以及性能要求。
随着人工智能和机器学习的发展,多臂赌博机模型及其变体将继续在推荐系统、广告投放、医疗决策等领域发挥重要作用,同时也将与深度学习、强化学习等领域深度融合,催生出更强大的算法和应用。
在这个不确定性与机遇并存的世界中,如何在探索与利用之间取得平衡,既是多臂赌博机问题的核心,也是众多实际决策问题的关键。对这一问题的研究,将持续为人工智能的发展提供重要的理论基础和实践指导。
参考文献
- Sutton, R. S., & Barto, A. G. (2018). Reinforcement learning: An introduction. MIT press.
- Auer, P., Cesa-Bianchi, N., & Fischer, P. (2002). Finite-time analysis of the multiarmed bandit problem. Machine learning, 47(2), 235-256.
- Li, L., Chu, W., Langford, J., & Schapire, R. E. (2010). A contextual-bandit approach to personalized news article recommendation. In Proceedings of the 19th international conference on World wide web (pp. 661-670).
- Chapelle, O., & Li, L. (2011). An empirical evaluation of thompson sampling. Advances in neural information processing systems, 24.
- Lattimore, T., & Szepesvári, C. (2020). Bandit algorithms. Cambridge University Press.
相关文章:
多臂赌博机:探索与利用的平衡艺术
1. 引言 在机器学习领域,多臂赌博机(Multi-Armed Bandit,MAB)问题是强化学习的一个经典且基础的模型。这个名称源于赌场中的"单臂老虎机"(One-armed Bandit),因为这种赌博机器像强盗…...
分布式异步强化学习框架训练32B大模型:INTELLECT-2
INTELLECT-2 模型详解 一、模型概述 INTELLECT-2 是一个拥有 320 亿参数的语言模型,其训练采用了一种创新的方式,即通过社区贡献的分布式、无需许可的 GPU 资源进行强化学习训练。该模型基于 qwen2 架构构建,因此与 vllm 或 sglang 等流行库…...
HTML应用指南:利用POST请求获取全国京东快递服务网点位置信息
京东快递作为中国领先的智能供应链与综合物流服务提供商,自2007年成立以来,始终致力于通过技术创新与高效运营,为客户提供安全、可靠、快速的物流解决方案。京东快递依托京东集团的强大资源支持,凭借其自营仓储、干线运输、末端配送一体化的物流网络,在激烈的市场竞争中脱…...
通过POI实现对word基于书签的内容替换、删除、插入
一、基本概念 POI:即Apache POI, 它是一个开源的 Java 库,主要用于读取 Microsoft Office 文档(Word、Excel、PowerPoint 等),修改 或 生成 Office 文档内容,保存 为对应的二进制或 XML 格式&a…...
git进行版本控制时遇到Push cannot contain secrets的解决方法
git进行版本控制,push遇到Push cannot contain secrets的解决方法 最近在项目开发过程中,我遇到了一个让我头疼不已的问题。 问题的出现 一开始,我的项目远程仓库连接的是 Gitee,在开发过程中一切都很顺利,我也习惯…...
Java GUI 开发之旅:Swing 组件与布局管理的实战探索
在编程的世界里,图形用户界面(GUI)设计一直是提升用户体验的关键环节。Java 的 Swing 库为我们提供了强大的工具来构建跨平台的 GUI 应用。今天,我将通过一次实验,分享如何使用 Java Swing 开发一个功能丰富的 GUI 应用…...
OpenVLA (2) 机器人环境和环境数据
文章目录 前言1 BridgeData V21.1 概述1.2 硬件环境 2 数据集2.1 场景与结构2.2 数据结构2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 前言 按照笔者之前的行业经验, 数据集的整理是非常重要的, 因此笔者这里增加原文中出现的几个数据集和环境的学习 1 BridgeData V…...
【Ansible】基于windows主机,采用NTLM+HTTPS 认证部署
我们现在准备Linux centos7(Ansible控制机)和Windows(客户机)环境下的详细部署步骤: 一、Windows客户机配置 1. 准备SSL证书 1.1 生成自签名证书(测试用) 以管理员身份打开PowerShell&#…...
React19源码系列之 API(react-dom)
API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示,告诉它应该打开到给定服务器的连接。如果浏览器选择这样做,则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…...
鸿蒙Next开发 获取APP缓存大小和清除缓存
1. 鸿蒙Next开发 获取APP缓存大小和清除缓存 1.1. 介绍 1.1.1. 文件系统分类 在最新的Core File Kit套件中,按文件所有者的不同。分为如下三类: (1)应用文件:文件所有者为应用,包括应用安装文件、应用…...
PNG转ico图标(支持圆角矩形/方形+透明背景)Python脚本 - 随笔
摘要 在网站开发或应用程序设计中,常需将高品质PNG图像转换为ICO格式图标。本文提供一份基于Pillow库实现的,能够完美保留透明背景且支持导出圆角矩形/方形图标的格式转换脚本。 源码示例 圆角方形 from PIL import Image, ImageDraw, ImageOpsdef c…...
『大模型笔记』Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱
Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱 文章目录 摘要访谈内容什么环境智能体为什么要探索环境智能体怎么让人类能更方便地和环境智能体互动参考文献摘要 LangChain 的 CEO Harrison Chase 提出了_“环境智能体”(Ambient Agents)的概念,这是一种…...
GPT( Generative Pre-trained Transformer )模型:基于Transformer
GPT是由openAI开发的一款基于Transformer架构的预训练语言模型,拥有强大的生成能力和多任务处理能力,推动了自然语言处理(NLP)的快速发展。 一 GPT发展历程 1.1 GPT-1(2018年) 是首个基于Transformer架构…...
游戏引擎学习第275天:将旋转和剪切传递给渲染器
回顾并为今天的内容定下基调 我们认为在实现通用动画系统之前,先学习如何手写动画逻辑是非常有价值的。虽然加载和播放预设动画是合理的做法,尤其是在团队中有美术人员使用工具制作动画的情况下更是如此,但手动编写动画代码能让我们更深入理…...
conda 输出指定python环境的库 输出为 yaml文件
conda 输出指定python环境的库 输出为 yaml文件。 有时为了项目部署,需要匹配之前的python环境,需要输出对应的python依赖库。 假设你的目标环境名为 myenv,运行以下命令: conda env export -n myenv > myenv_environment.ym…...
ES6 语法
扩展运算符 … 口诀:三个点,打散数组,逐个放进去 例子: let arr [1, 2];let more [3, 4];arr.push(...more); // arr 变成 [1, 2, 3, 4]解构赋值 口诀:左边是变量,右边是值,一一对应 例子&…...
BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)
文章目录 引言一、课程表1.1 题目链接:https://leetcode.cn/problems/course-schedule/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二、课程表||2.1 题目链接:https://leetcode.cn/problems/course-schedul…...
While语句数数字
import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int number in.nextInt();int count 0;while( number > 0 ){number number / 10;count count 1;}System.out.println(count);} }...
G1JVM内存分配机制详解
为什么堆内存不是预期的3G? 当您设置-XX:MaxRAMPercentage75时,JVM并不会简单地将容器内存(4G)的75%全部分配给堆,原因如下: 计算基准差异: 百分比是应用于"可用物理内存"而非"容器总内存" &q…...
“端 - 边 - 云”三级智能协同平台的理论建构与技术实现
摘要 随着低空经济与智能制造的深度融合,传统集中式云计算架构在实时性、隐私保护和资源效率上的瓶颈日益凸显。本文提出“端 - 边 - 云”三级智能协同平台架构,以“时空 - 资源 - 服务”三维协同理论为核心,构建覆盖终端感知、边缘计算、云端…...
【UAP】《Empirical Upper Bound in Object Detection and More》
Borji A, Iranmanesh S M. Empirical upper bound in object detection and more[J]. arXiv preprint arXiv:1911.12451, 2019. arXiv-2019 文章目录 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Experimental Setup4.1、Benchmarks Dataset…...
Web Service及其实现技术(SOAP、REST、XML-RPC)介绍
一.概述 1.Web Service(Web 服务) Web Service 由万维网联盟 (W3C) 定义为一种软件系统,旨在支持通过网络进行可互操作的计算机间交互。 广义概念:基于 Web 技术(如 HTTP 协议)的跨平台、跨语言通信机制…...
基于Spring Boot+Layui构建企业级电子招投标系统实战指南
一、引言:重塑招投标管理新范式 在数字经济浪潮下,传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心,融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案,构建一个覆盖招标代理…...
【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历
PlatformIO 是开源的物联网开发生态系统。提供跨平台的代码构建器、集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等。 开源库地址:https://github.com/platformio 在 VScode 中配置 PlatformIO 插件,记录…...
抗量子计算攻击的数据安全体系构建:从理论突破到工程实践
在“端 - 边 - 云”三级智能协同理论中,端 - 边、边 - 云之间要进行数据传输,网络的安全尤为重要,为了实现系统总体的安全可控,将构建安全网络。 可先了解我的前文:“端 - 边 - 云”三级智能协同平台的理论建构与技术实…...
【FMMT】基于模糊多模态变压器模型的个性化情感分析
遇到很难的文献看不懂,不应该感到气馁,应该激动,因为外审估计也看不太懂,那么学明白了可以吓唬他 缺陷一:输入依赖性与上下文建模不足 缺陷描述: 传统自注意力机制缺乏因果关系,难以捕捉序列历史背景多模态数据间的复杂依赖关系未被充分建模CNN/RNN类模型在…...
力扣Hot100(Java版本)
1. 哈希 1.1 两数之和 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同…...
Stream流简介、常用方法
Stream流的三类方法 获取Stream流 创建一条流水线,并把数据放到流水线上准备进行操作 中间方法 流水线上的操作一次操作完毕之后,还可以继续进行其他操作 终结方法 一个Stream流只能有一个终结方法是流水线上的最后一个操作 生成Stream流的方式 Collec…...
C# 集成 FastDFS 完整指南
1. 环境准备 (1) 安装 FastDFS 服务端 部署 Tracker 和 Storage 节点,确保服务正常运行。 配置 tracker_server 地址(如 192.168.1.100:22122)。 (2) 添加 NuGet 包 通过 NuGet 安装 FastDFS 客户端库: Install-Pack…...
重构门店网络:从“打补丁“到“造地基“的跨越
您是否遇到过这样的窘境? 新店开张要等一周,就为装根网线; 偏远地区门店三天两头断网,顾客排长队却结不了账; 总部想看实时数据,结果收到一堆乱码报错; 总部ERP系统升级,2000家门…...
TI的ADS1291代替芯片LH001-99
血管疾病严重威胁人类生命健康安全,随着人口老龄化进程的加快和社会压力等因素的增加,患病率正呈现逐年上升趋势,并且越来越年轻化。然而,心血管疾病大多由器官器质性病变引起,一旦患病很难完全康复,需要进…...
NPOI 操作 Word 文档
管理 NuGet 程序包 # word操作 NPOI# 图片操作 SkiaSharp Controller代码 using Microsoft.AspNetCore.Mvc; using NPOI.Util; using NPOI.XWPF.Model; using NPOI.XWPF.UserModel; using SkiaSharp;namespace WebApplication2.Controllers {[Route("api/Npoi/[action]…...
css3基于伸缩盒模型生成一个小案例
css3基于伸缩模型生成一个小案例 在前面学习了尚硅谷天禹老师的css3内容后,基于伸缩盒模型做的一个小案例,里面使用了 flex 布局,以及主轴切换,以及主轴平分等特性,分为使用css3 伸缩盒模型方式,已经传统的…...
精简大语言模型:用于定制语言模型的自适应知识蒸馏
Streamlining LLMs: Adaptive Knowledge Distillation for Tailored Language Models 发表:NAACL 2025 机构:德国人工智能研究中心 Abstract 诸如 GPT-4 和 LLaMA-3 等大型语言模型(LLMs)在多个行业展现出变革性的潜力…...
Rollup入门与进阶:为现代Web应用构建超小的打包文件
我们常常面临Webpack复杂配置或是Babel转译后的冗余代码,结果导致最终的包体积居高不下加载速度也变得异常缓慢,而在众多打包工具中Rollup作为一个轻量且高效的选择,正悄然改变着这一切,本文将带你深入了解这个令人惊艳的打包工具…...
博客系统技术需求文档(基于 Flask)
以下内容是AI基于要求生成的技术文档,仅供参考~ 🧱 一、系统架构设计概览 层级 内容 前端层 HTML Jinja2 模板引擎,集成 Markdown 编辑器、代码高亮 后端层 Flask 框架,RESTful 风格,Jinja2 渲染 数据库 SQLi…...
快速排序、归并排序、计数排序
文章目录 前言一、归并排序算法逻辑递归实现非递归实现 二、快速排序算法介绍递归实现非递归实现算法的一种优化—三路划分法 四、计数排序算法原理代码实现优劣分析 五、排序算法的性能比较总结 前言 本文介绍这三种非常强大的排序算法,每种算法都有各自的特点、不…...
python语言与地理处理note 2025/05/11
1. 函数定义必须要在调用之前 (1)正确示例: def test():print("what a wonderful world!")test() (2)错误示例: test() def test():print("what a wonderful world!") 会报错&…...
贪心算法:最小生成树
假设无向图为: A-B:1 A-C:3 B-C:1 B-D:4 C-D:1 C-E:5 D-E:6 一、使用Prim算法: public class Prim {//声明了两个静态常量,用于辅助 Prim 算法的实现private static final int V 5;//点数private static final int INF Integer.MA…...
免费 OCR 识别 + 批量处理!PDF 工具 提升办公效率
各位办公小能手们!今天给你们介绍一款超厉害的软件——PDF工具V2.2!我跟你们说,这玩意儿就像是PDF界的超级英雄,专门搞定PDF文件的编辑、转换、压缩这些事儿。 先说说它的核心功能哈。基础文档管理方面,它能把好几个PD…...
尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)
1. NORMAL 模式(常规模式) 适用场景:一般手持拍摄,比如人像、静物、风景或缓慢平移镜头(如水平追拍)等。工作特性: 补偿手抖引起的小幅度震动(比如手持时自然的不稳)&am…...
在scala中sparkSQL读入csv文件
以下是 Scala 中使用 Spark SQL 读取 CSV 文件的核心步骤和代码示例(纯文本): 1. 创建 SparkSession scala import org.apache.spark.sql.SparkSession val spark SparkSession.builder() .appName("Spark SQL Read CSV") …...
swift flask python ipad当电脑键盘 实现osu x键和z键 长按逻辑有问题 quart 11毫秒
键盘不行我5星都打不过,磁轴不在身边 127.0.0.1不行要用192.168哪个地址 from flask import Flask from pynput.keyboard import Controller from threading import Threadapp Flask(__name__) keyboard Controller()# 按下按键 app.route("/press_down/<…...
浅论3DGS溅射模型在VR眼镜上的应用
摆烂仙君小课堂开课了,本期将介绍如何手搓VR眼镜,并将随手拍的电影变成3D视频。 一、3DGS模型介绍 3D 高斯模型是基于高斯函数构建的用于描述三维空间中数据分布概率的模型,高斯函数在数学和物理领域有着广泛应用,其在 3D 情境下…...
React状态管理-对state进行保留和重置
相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候,计数器 state 并没有被重置。不管 isFancy 是 true 还是 false,根组件 App 返回的 div 的第一个子组件都是 <Counter />: 你可能以为当你勾选复选框的时候 st…...
嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
按键控制LED灯 按键控制LED的开发流程: 第一步:使能功能复用时钟 第二布,配置复用寄存器 第三步,配置中断屏蔽寄存器 固件库按键控制LED灯 外部中断EXTI结构体:typedef struct{uint32_t EXTI_Line; …...
git merge和git rebase
git merge和git rebase 在Git中merge和rebase都是git在管理整合分支的两种主要工具,但是他们的工作方式、提交历史影响和使用场景不同。 git merge 定义 将两个分支的提交历史合并,创建一个新的合并提交(merge commit)ÿ…...
我的MCP相关配置记录
1.VSCode的Cline中的MCP {"mcpServers": {"github.com/modelcontextprotocol/servers/tree/main/src/github": {"autoApprove": [],"disabled": false,"timeout": 60,"command": "cmd","args&quo…...
浅聊一下数据库的索引优化
背景 这里的索引说的是关系数据库(MSSQL)中的索引。 本篇不是纯技术性的内容,只是聊一次性能调优的经历,包含到一些粗浅的实现和验证手段,所以,大神忽略即可。 额…对了,笔者对数据库的优化手段…...
如何创建maven项目
1.IDEA 中创建 Maven 项目 步骤一:点击 File -> New -> Project,在弹出的窗口左侧选择 Maven,点击 Next: 步骤二:填写项目的 GroupId、ArtifactId、Version 等信息(这些对应 pom.xml 中的关键配置&am…...