【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
深入详解强化学习之常用算法:Q-Learning与策略梯度
强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大的潜力。本文将深入探讨强化学习中的常用算法,重点介绍Q-Learning和策略梯度方法,详细阐述其关键概念、核心原理、示例及主要应用,帮助读者全面掌握智能体与环境的交互机制。
目录
深入详解强化学习之常用算法:Q-Learning与策略梯度
1. 引言
2. 强化学习概述
关键概念
智能体与环境的交互机制
3. Q-Learning
核心原理
算法步骤
示例:网格世界(Grid World)
主要应用
4. 策略梯度方法
核心原理
常见策略梯度算法
REINFORCE
Actor-Critic
示例:CartPole平衡
主要应用
5. 比较与选择
6. 深度强化学习
深度Q网络(DQN)
深度确定性策略梯度(DDPG)
7. 总结与展望
8. 参考资料
1. 引言
强化学习是一种通过与环境交互来学习最优策略的机器学习方法。与监督学习和无监督学习不同,强化学习关注的是智能体(Agent)在环境中采取行动以最大化累积奖励的过程。理解强化学习中的常用算法,如Q-Learning和策略梯度方法,对于解决复杂的决策和控制问题至关重要。
2. 强化学习概述
关键概念
在深入算法之前,理解强化学习的基本概念至关重要:
- 智能体(Agent):执行动作以与环境互动的实体。
- 环境(Environment):智能体互动的外部系统,对智能体的动作做出反应。
- 状态(State, S):环境在某一时刻的具体情况。
- 动作(Action, A):智能体在特定状态下可以采取的行为。
- 奖励(Reward, R):智能体执行动作后,环境给予的反馈信号,用于指导学习。
- 策略(Policy, π):智能体选择动作的策略,可以是确定性的(π(s) = a)或随机的(π(a|s))。
- 价值函数(Value Function, V):评估在状态s下,智能体未来能获得的累积奖励。
- 状态-动作价值函数(Q-Function, Q):评估在状态s下采取动作a,智能体未来能获得的累积奖励。
智能体与环境的交互机制
强化学习的核心是通过试错与环境进行互动,智能体在每一步选择一个动作,环境返回一个奖励和下一个状态。智能体的目标是学习一个策略,使得在长期内累积的奖励最大化。这一过程可以形式化为马尔可夫决策过程(Markov Decision Process, MDP)。
3. Q-Learning
核心原理
Q-Learning是一种基于价值的强化学习算法,通过学习状态-动作价值函数Q(s, a),实现最优策略的逼近。Q-Learning的核心思想是通过迭代更新Q值,使其逐步逼近真实的Q值。
Q-Learning的更新公式为:
\[
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma \max_{a} Q(s_{t+1}, a) - Q(s_t, a_t) \right]
\]
其中:
- \( s_t \)是当前状态
- \( a_t \) 是当前动作
- \( r_{t+1} \) 是执行动作后的奖励
- \( \gamma \) 是折扣因子(通常介于0和1之间)
- \( \alpha \) 是学习率
算法步骤
Q-Learning的基本步骤如下:
- 初始化Q表(Q(s, a))为任意值(通常为0)。
- 对于每一个回合:
- 初始化环境,获取初始状态s。
- 对于每一个时间步:
- 根据当前策略(如ε-贪心策略)选择动作a。
- 执行动作a,观察奖励r和下一个状态s'。
- 更新Q值:
\[
Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right]
\] - 将状态s更新为s'。
- 若达到终止状态,则结束当前回合。
示例:网格世界(Grid World)
下面通过一个简单的网格世界展示Q-Learning的应用。假设智能体在一个4x4的网格中移动,目标是从起点到达终点。
import numpy as np
import random# 定义网格世界
class GridWorld:def __init__(self):self.size = 4self.start = (0, 0)self.end = (3, 3)self.state = self.startself.actions = ['up', 'down', 'left', 'right']def reset(self):self.state = self.startreturn self.statedef step(self, action):x, y = self.stateif action == 'up':x = max(x - 1, 0)elif action == 'down':x = min(x + 1, self.size - 1)elif action == 'left':y = max(y - 1, 0)elif action == 'right':y = min(y + 1, self.size - 1)self.state = (x, y)if self.state == self.end:return self.state, 1, True # 奖励1,终止else:return self.state, 0, False # 奖励0,继续# Q-Learning算法
def q_learning(env, episodes=500, alpha=0.1, gamma=0.9, epsilon=0.1):Q = {}for x in range(env.size):for y in range(env.size):Q[(x, y)] = {a: 0 for a in env.actions}for episode in range(episodes):state = env.reset()done = Falsewhile not done:# ε-贪心策略if random.uniform(0, 1) < epsilon:action = random.choice(env.actions)else:action = max(Q[state], key=Q[state].get)next_state, reward, done = env.step(action)# Q值更新Q[state][action] += alpha * (reward + gamma * max(Q[next_state].values()) - Q[state][action])state = next_statereturn Q# 训练代理
env = GridWorld()
Q = q_learning(env)# 展示学习后的策略
def print_policy(Q, env):policy_actions = {'up': '↑', 'down': '↓', 'left': '←', 'right': '→'}for x in range(env.size):row = ''for y in range(env.size):if (x, y) == env.end:row += ' G 'else:action = max(Q[(x, y)], key=Q[(x, y)].get)row += ' ' + policy_actions[action] + ' 'print(row)print_policy(Q, env)
代码说明:
-
GridWorld类:定义一个4x4的网格环境,智能体从(0,0)出发,目标是到达(3,3)。每次动作后,如果到达终点,获取奖励1并终止回合;否则,奖励为0。
-
q_learning函数:实现Q-Learning算法,初始化Q表,采用ε-贪心策略选择动作,并根据奖励和最大Q值更新Q表。
-
print_policy函数:展示学习后的策略,用箭头表示智能体在不同状态下的最佳动作。
结果展示:
→ ↓ → ↓ ↑ → → ↓ ↑ ↑ → ↓ ← ← ← G
上述策略表明,智能体在各个状态下最优的动作方向,通过学习能够有效地从起点到达终点。
上述策略表明,智能体在各个状态下最优的动作方向,通过学习能够有效地从起点到达终点。
主要应用
Q-Learning广泛应用于各种决策和控制问题,主要包括:
- 游戏AI:如Atari游戏、棋类游戏等智能体的策略学习。
- 机器人导航:机器人在未知环境中的路径规划与避障。
- 推荐系统:根据用户行为动态调整推荐策略。
- 自动驾驶:车辆在复杂交通环境中的决策与控制。
4. 策略梯度方法
核心原理
策略梯度方法是基于策略优化的强化学习算法,直接优化策略函数π(a|s; θ),使得预期累积奖励最大化。与基于价值的方法(如Q-Learning)不同,策略梯度不依赖于价值函数,而是直接通过梯度上升来优化策略参数。
目标函数:
\[
J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right]
\]
策略梯度的更新规则基于梯度上升:
\[
\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)
\]
其中,梯度可以通过“策略梯度定理”得到:
\[
\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \right]
\]
其中,\( G_t \) 是从时间步t开始的累积奖励。
常见策略梯度算法
REINFORCE
REINFORCE是最基础的策略梯度算法,又称为蒙特卡罗策略梯度。其特点是使用完整的回合数据进行更新。
算法步骤:
1. 初始化策略参数θ。
2. 对于每一个回合:
生成一个完整的回合,记录状态、动作和奖励。
计算每个时间步的累积奖励 \( G_t \)。
更新策略参数:
\[
\theta \leftarrow \theta + \alpha \sum_{t} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t
\]
Actor-Critic
Actor-Critic结合了策略梯度和值函数的方法,利用一个“演员”(Actor)来更新策略,一个“评论家”(Critic)来评估当前策略的价值函数,从而提高学习效率。
算法步骤:
1. 初始化策略参数θ(Actor)和价值函数参数ϕ(Critic)。
2. 对于每一个时间步:
根据策略π(a|s; θ)选择动作a。
执行动作a,观察奖励r和下一个状态s'。
计算TD误差:
\[
\delta = r + \gamma V(s'; \phi) - V(s; \phi)
\]
更新Critic参数:
\[
\phi \leftarrow \phi + \alpha_c \delta \nabla_\phi V(s; \phi)
\]
更新Actor参数:
\[
\theta \leftarrow \theta + \alpha_a \delta \nabla_\theta \log \pi(a|s; \theta)
\]
示例:CartPole平衡
以经典的CartPole环境为例,演示策略梯度方法的应用。智能体需要通过移动小车,使得杆子保持平衡。
import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers# 创建环境
env = gym.make('CartPole-v1')num_states = env.observation_space.shape[0]
num_actions = env.action_space.n# 构建策略网络
model = tf.keras.Sequential([layers.Dense(24, activation='relu', input_shape=(num_states,)),layers.Dense(24, activation='relu'),layers.Dense(num_actions, activation='softmax')
])optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
gamma = 0.99# 策略梯度算法
def policy_gradient():state = env.reset()state = np.reshape(state, [1, num_states])done = Falserewards = []actions = []states = []while not done:action_probs = model(state).numpy()[0]action = np.random.choice(num_actions, p=action_probs)next_state, reward, done, _ = env.step(action)next_state = np.reshape(next_state, [1, num_states])states.append(state)actions.append(action)rewards.append(reward)state = next_state# 计算累积奖励discounted_rewards = []cumulative = 0for r in rewards[::-1]:cumulative = r + gamma * cumulativediscounted_rewards.insert(0, cumulative)discounted_rewards = np.array(discounted_rewards)discounted_rewards -= np.mean(discounted_rewards)discounted_rewards /= (np.std(discounted_rewards) + 1e-8)with tf.GradientTape() as tape:loss = 0for logit, action, reward in zip(model(np.concatenate(states)), actions, discounted_rewards):loss += -tf.math.log(logit[action]) * rewardgrads = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))return np.sum(rewards)# 训练智能体
episodes = 1000
for episode in range(episodes):total_reward = policy_gradient()if (episode + 1) % 100 == 0:print(f'Episode: {episode + 1}, Total Reward: {total_reward}')env.close()
代码说明:
- 环境创建:使用OpenAI Gym中的CartPole环境。
- 策略网络:构建一个两层隐藏层的神经网络,输出层使用Softmax激活函数,表示每个动作的概率。
- 策略梯度函数(policy_gradient):
- 运行一个完整的回合,记录状态、动作和奖励。
- 计算每个时间步的折扣累积奖励,并进行标准化。
- 使用梯度带(Gradient Tape)计算损失函数的梯度,并更新策略网络参数。
- 训练过程:进行1000个回合的训练,每100个回合输出一次总奖励。
结果说明:
随着训练的进行,智能体通过策略梯度方法逐步学会保持杆子的平衡,累积奖励不断增加,最终能够稳定地控制小车平衡杆子。
主要应用
策略梯度方法在需要连续动作空间和复杂策略优化的任务中表现优异,主要应用包括:
- 机器人控制:如机械臂的精确控制、自主导航。
- 游戏AI:如复杂策略游戏中的智能对手。
- 金融交易:模拟和优化交易策略,进行高频交易决策。
- 自然语言处理:如对话生成、文本摘要等任务中的策略优化。
5. 比较与选择
Q-Learning和策略梯度方法各有优缺点,选择合适的算法取决于具体应用场景:
- Q-Learning:
- 优点:
- 简单易实现,适用于离散动作空间。
- 理论基础扎实,收敛性良好。
- 缺点:
- 难以扩展到高维和连续动作空间。
- 对于大型状态空间,Q表难以存储和更新。
- 优点:
- 策略梯度方法:
- 优点:
- 适用于高维和连续动作空间。
- 能够直接优化策略,处理复杂策略类型。
- 缺点:
- 收敛速度较慢,易受局部最优影响。
- 需要大量样本进行训练,训练不稳定性较高。
- 优点:
在实际应用中,深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习与强化学习的优势,采用神经网络近似价值函数或策略,广泛应用于复杂任务中。
6. 深度强化学习
深度强化学习通过使用深度神经网络作为函数逼近器,解决了传统强化学习在高维状态空间和复杂任务中的局限性。典型的深度强化学习算法包括深度Q网络(Deep Q-Network, DQN)和深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)等。
深度Q网络(DQN)
DQN通过使用神经网络近似Q函数,解决了Q-Learning在高维状态空间中的问题。DQN引入经验回放和目标网络,提升了训练的稳定性和效率。
关键技术:
- 经验回放(Experience Replay):将智能体的经验存储在缓冲区中,随机采样进行训练,打破数据的时间相关性。
- 目标网络(Target Network):使用一个固定的目标网络来稳定Q值的更新,减少训练过程中的震荡。
深度确定性策略梯度(DDPG)
DDPG是一种适用于连续动作空间的深度强化学习算法,结合了策略梯度和确定性策略的方法。DDPG使用两个神经网络:一个是策略网络(Actor),另一个是价值网络(Critic),通过经验回放和软更新机制提升训练稳定性。
7. 总结与展望
本文深入探讨了强化学习中的两大主流算法:Q-Learning和策略梯度方法,详细介绍了其关键概念、核心原理、示例及主要应用。Q-Learning作为基于价值的方法,适用于离散动作空间,简单易实现;而策略梯度方法适用于复杂和连续动作空间,能够直接优化策略。通过对比与分析,可以根据具体任务选择合适的算法。
随着计算能力的提升和深度学习技术的发展,深度强化学习(DRL)进一步拓展了强化学习的应用范围,解决了许多传统方法难以应对的复杂问题。未来,强化学习将在更多领域发挥重要作用,如智能制造、智能医疗、无人驾驶等,推动人工智能技术的进一步发展。
8. 参考资料
- 《强化学习:An Introduction》(Richard S. Sutton, Andrew G. Barto 著)
- DeepMind的DQN论文:Mnih, V., et al. (2015). "Human-level control through deep reinforcement learning."
- OpenAI Gym官方文档:Gym Documentation
- TensorFlow官方网站:https://www.tensorflow.org/
- PyTorch官方网站:PyTorch
【此文为作者经过搜集资料,整理及编辑而成,仅供学习者参考。本文属于个人学习过程中对于人工智能相关知识概念进行的整合作品,如需更详细的信息和扩展内容,建议参考相关专业书籍和学术论文,若有不当之处可进行指正,共同学习交流!】
相关文章:
【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
深入详解强化学习之常用算法:Q-Learning与策略梯度 强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大…...
jQuery学习笔记2
jQuery 属性操作 <body><a href"http://www.itcast.cn" title"都挺好">都挺好</a><input type"checkbox" name"" id"" checked /><div index"1" data-index"2">我是div&…...
发现API安全风险,F5随时随地保障应用和API安全
分析数据显示,目前超过90%的基于Web的网络攻击都以API端点为目标,试图利用更新且较少为人所知的漏洞,而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略,在风险升级成代价高昂、令人警惕且往往无法…...
移动端如何实现上拉加载
一、理解上拉加载的原理 上拉加载是一种在移动端很常见的交互方式,其原理是当用户在页面上向上滑动(即滚动条接近底部)时,触发一个加载更多数据的操作。这通常涉及到对滚动事件的监听以及判断滚动位置是否达到了触发加载的阈值。…...
the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...
Android 自定义shell命令
模拟触摸、按键等操作,直接在命令行输入对应命令即可。命令行如何识别并操作此命令,执行操作的是shell程序,还是java程序?是不是可以添加自定义的命令? 以下在Android13的代码中分析input命令 Android系统中使用了一…...
HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
《SwiftUI 实现点击按钮播放 MP3 音频》
功能介绍 点击按钮时,应用会播放名为 yinpin.mp3 的音频文件。使用 AVAudioPlayer 来加载和播放音频。 关键点: 按钮触发:点击按钮会调用 playAudio() 播放音频。音频加载:通过 Bundle.main.url(forResource:) 加载音频文件。播…...
表单元素(标签)有哪些?
HTML 中的表单元素(标签)用于收集用户输入的数据,常见的有以下几种: 文本输入框 <input type"text">:用于单行文本输入,如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…...
大型ERP系统GL(总账管理)模块需求分析
主要介绍了GL系统的需求分析,包括系统概述、功能描述、帐薄管理、报表管理、期末处理、财务报表以及凭证的快速输入方式、可用性设计、保存、自动审核和打印等方面的内容。系统概述部分介绍了系统的功能结构和模块流程图。 功能描述部分详细描述了系统的基础资料和业…...
SQL常用语句(基础)大全
SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...
关于HarmonyOS Next中卡片的使用方法
关于Harmony OS中卡片的使用方法 在Harmony OS中,静态卡片是一种非常有用的组件,用于提供应用内功能组件的交互和信息展示。本文将详细介绍如何在Harmony OS中使用静态卡片以及相关的API接口。 1. 概述 静态卡片是Harmony OS中的一种交互组件…...
Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试
在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式: 1. 串行请求(依赖关系) 一个请求的结果作为另一个请求的输入,可以用 flat…...
C# OpenCV机器视觉:目标跟踪
在一个阳光明媚的下午,阿强正在实验室里忙碌,突然他的同事小杨走了进来,脸上挂着一丝困惑。 “阿强,我的目标跟踪项目出了问题!我想跟踪一个移动的物体,但总是跟丢!”小杨一边说,一…...
LeetCode 191 位1的个数
计算正整数二进制表示中汉明重量的两种实现方式对比 在编程的世界里,我们常常会遇到一些有趣又实用的小问题,今天就来和大家分享一下如何计算一个正整数二进制表示中设置位(也就是 1 的个数,专业术语叫汉明重量)的问题…...
【软件测试面试】银行项目测试面试题+答案(二)
前言 面试题:贷款有哪几种形式? 贷款是指金融机构或其他信贷机构向借款人提供资金,并按照约定的条件和期限收取一定利息的行为。根据贷款的不同形式,贷款可以分为以下几种: 按照还款方式分:分期付款贷款、到期一次…...
分布式消息队列RocketMQ
一、RocketMQ概述 1.1 MQ 概述 MQ,Message Queue,是一种提供消息队列服务的中间件,也成为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据 1.2 MQ 用途 MQ的用途总结起来可分为以下三点 限流削峰…...
Temporary failure resolving ‘security.ubuntu.com‘
apt-get update 的时候出现: Temporary failure resolving security.ubuntu.com Temporary failure resolving archive.ubuntu.com具体信息: > ERROR [devel 3/17] RUN bash ./install_base.sh 3.12.3 && rm install_base.sh …...
0基础跟德姆(dom)一起学AI 自然语言处理10-LSTM模型
1 LSTM介绍 LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出门…...
设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析
单例模式(Singleton Pattern),又称生成器模式,是一种对象构建模式。它主要用于构建复杂对象,通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…...
cJson—json和XML比较
cJson—json和XML比较 前言1. 数据结构与表达能力2. 效率(性能)3. 存储占用与传输效率4. 开发难易程度5. 跨平台支持与兼容性6. 灵活性与扩展性7. 错误处理与验证**总结:JSON 与 XML 的优缺点对比选择建议 前言 在嵌入式设备开发中ÿ…...
【项目】智能BI洞察引擎 测试报告
目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试(异步)测试用例测试结…...
基于SpringBoot的野生动物保护发展平台的设计与实现(源码+SQL+LW+部署讲解)
文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...
QEMU网络配置简介
本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…...
wps透视数据表
1、操作 首先选中你要的行字段表格 -> 插入 -> 透视数据表 -> 拖动行值(部门)到下方,拖动值(包裹数量、运费)到下方 2、删除 选中整个透视数据表 -> delete 如图:...
Modbus知识详解
Modbus知识详解 ## 1.什么是Modbus?**顾名思义**,它是一个Bus(总线),即总线协议。比如串口协议、IIC协议、SPI都是通信协议。你接触到这种协议,相信你所处的行业是工业电子方面或者你的产品用于工业。好了,…...
c++字节对齐
字节对齐(Byte Alignment)是指计算机存储器中数据存放的位置必须满足特定的地址要求,以提高内存访问效率。在许多计算机系统中,处理器在读取内存中的数据时,需要按照特定的边界进行访问,这种边界通常是2的幂…...
javaEE-文件内容的读写
目录 一.数据流 1.字节流 InputStream的方法: cloes() read() OutPutStream writer()方法 2.字符流 Reader: writer: 代码练习1: 代码练习2: 代码练习3: 一.数据流 java标准库对数据进行了封装,提供了一组类负责进行这些工作. 数据流分为两类:字节流和…...
SWM221系列芯片之电机应用及控制
经过对SWM221系列的强大性能及外设资源,TFTLCD彩屏显示及控制进行了整体介绍后,新迎来我们的电控篇---SWM221系列芯片之电机应用及控制。在微控制器市场面临性能、集成度与成本挑战的当下,SWM221系列芯片以其卓越性能与创新设计,受…...
Mongodb日志报错too many open files,导致mongod进程down
【解决方案】 (1)进入到服务器,执行: ulimit -a 查看:open files这一行的数量,如果查询到的结果是1000左右,那多半是服务器限制。 (2)在当前session窗口执行如下&…...
在 uni-app 中使用 wxml-to-canvas 的踩坑经验总结
在 uni-app 中使用 wxml-to-canvas 的踩坑经验总结 wxml-to-canvas 是一款非常强大的小程序工具,可以将 WXML 转换为 Canvas 绘图,用于生成海报、分享图片等。将其应用于 uni-app 项目中,可以为多端开发带来极大的便利,但也有一些…...
基本算法——回归
目录 创建工程 加载数据 分析属性 创建与评估回归模型 线性回归 回归树 评估 完整代码 结论 本节将通过分析能源效率数据集(Tsanas和Xifara,2012)学习基本的回归算法。我们将基 于建筑的结构特点(比如表面、墙体与屋顶面…...
NestJS 性能优化:从应用到部署的最佳实践
在上一篇文章中,我们介绍了 NestJS 的微服务架构实现。本文将深入探讨 NestJS 应用的性能优化策略,从应用层到部署层面提供全方位的优化指南。 应用层优化 1. 路由优化 // src/modules/users/users.controller.ts import { Controller, Get, UseInter…...
VuePress搭建个人博客
VuePress搭建个人博客 官网地址: https://v2.vuepress.vuejs.org/zh/ 相关链接: https://theme-hope.vuejs.press/zh/get-started/ 快速上手 pnpm create vuepress vuepress-starter# 选择简体中文、pnpm等, 具体如下 .../19347d7670a-1fd8 | 69 .../19…...
在AWS Lambda上部署Python应用:从入门到实战
在AWS Lambda上部署Python应用:从入门到实战 随着云计算和无服务器架构(Serverless Architecture)在业界的普及,AWS Lambda成为了一个强有力的工具。它让开发者可以部署代码而无需管理服务器,按需运行,按时间计费。AWS Lambda支持多种语言,其中Python作为一门高效、简洁…...
初学STM32 ---高级定时器互补输出带死区控制
互补输出,还带死区控制,什么意思? 带死区控制的互补输出应用之H桥 捕获/比较通道的输出部分(通道1至3) 死区时间计算 举个栗子(F1为例):DTG[7:0]250,250即二进制&#x…...
chatwoot 开源客服系统搭建
1. 准备开源客服系统(我是用的Chatwoot ) 可以选择以下开源客服系统作为基础: Chatwoot: 开源,多语言,跟踪和分析,支持多渠道客户对接,自动化和工作流等。源码Zammad: 现代的开源工单系统。Fr…...
Ungoogled Chromium127编译指南 Linux篇 - 安装Docker(六)
1. 引言 在了解了Docker的重要性后,我们需要在系统中正确安装和配置Docker环境。Docker的安装过程看似简单,但要确保其能够完美支持Ungoogled Chromium的编译,还需要进行一些特殊的配置。本文将详细介绍如何在Ubuntu系统上安装Docker&#x…...
试用ChatGPT的copilot编写一个程序从笔记本电脑获取语音输入和图像输入并调用开源大模型进行解析
借助copilot写代码和自己手写代码的开发过程是一样的。 首先要有明确的开发需求,开发需求越详细,copilot写出的代码才能越符合我们的预期。 其次,有了明确的需求,最好先做下需求拆解,特别是对于比较复杂的应用…...
Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案
文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…...
2024年常用工具
作为本年度高频使用工具,手机端也好,桌面端也好,筛选出来9款产品,这里也分享给关注我的小伙伴 ,希望对你有些帮助,如果你更好的产品推荐,欢迎留言给我。 即刻 产品经理的聚集地,“让…...
在Linux系统中使用字符图案和VNC运行Qt Widgets程序
大部分服务器并没有GUI,运行的是基础的Linux系统,甚至是容器。如果我们需要在这些系统中运行带有GUI功能的Qt程序,一般情况下就会报错,比如: $ ./collidingmice qt.qpa.xcb: could not connect to display qt.qpa.plu…...
kafka使用常见问题
连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…...
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
一、引入MockMvc依赖 使用MockMvc,必须要引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>二、具体演示…...
mysql_real_connect的概念和使用案例
mysql_real_connect 是 MySQL C API 中的一个函数,用于建立一个到 MySQL 数据库服务器的连接。这个函数尝试建立一个连接,并根据提供的参数进行连接设置。 概念 以下是 mysql_real_connect 函数的基本概念: 函数原型:MYSQL *my…...
单片机--51- RAM
1.概览某个51单片机对空间区域的划分: 2.RAM被分配的区域是256bytes, 通常8051单片机ram是128bytes 8052的ram是256bytes(其中高128位的地址和sfr区域地址重合,物理区域不同) extern uint32_t alarm_cnt_1; uint32…...
【机器学习】梯度下降
文章目录 1. 梯度下降概念2. 梯度下降的技巧2.1 动态设置学习率2.2 Adagrad调整梯度2.3 随机梯度下降(SGD)2.4 特征缩放 3. 梯度下降理论基础 1. 梯度下降概念 梯度:Loss 对参数在某一点的偏微分,函数沿梯度的方向具有最大的变化…...
攻防世界web第十题Web_python_template_injection
这是题目,从题目上看是一个python模板注入类型的题目。 首先测试是否存在模板注入漏洞,构造http://61.147.171.105:57423/{{config}} 得到 说明存在模板注入漏洞,继续注入 构造http://61.147.171.105:57423/{{‘’.class.mro}}: 得到 再构造…...
【《python爬虫入门教程11--重剑无峰168》】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找?-- 如果用edge也是类似的1.chrome…...
VUE echarts 教程二 折线堆叠图
VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…...