Q学习(Q-Learning)详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:机器学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Q学习(Q-Learning)详解
文章目录
- 引言
- 一、基本原理
- 1. 强化学习的基本概念
- 2. Q值的定义
- 3. Q学习的目标
- 4. 学习过程
- 5. 收敛性
- 二、数学模型
- 1. 状态空间和动作空间
- 2. Q值函数
- 3. 贝尔曼方程
- 4. Q值更新公式
- 5. 收敛性
- 6. 策略提取
- 三、实现步骤
- 1. 环境设置
- 2. 初始化Q值表
- 3. 选择策略
- 4. 循环迭代
- 5. 终止条件
- 6. 策略提取
- 四、应用场景
- 1. 游戏AI
- 2. 机器人控制
- 3. 推荐系统
- 结论
引言
在人工智能的快速发展中,强化学习作为一种重要的学习范式,逐渐引起了广泛的关注。它通过与环境的交互来学习最优策略,使得智能体能够在复杂的决策问题中做出有效的选择。其中,Q学习(Q-Learning)作为一种经典的无模型强化学习算法,以其简单易懂和高效的特性,成为了研究者和工程师们的热门选择。
Q学习的核心在于通过学习一个Q值函数来评估在特定状态下采取某个动作的价值,从而指导智能体在环境中进行决策。无论是在游戏、机器人控制,还是在金融交易和推荐系统等领域,Q学习都展现出了强大的应用潜力。
本文将深入探讨Q学习的基本原理、数学模型、实现步骤以及其在实际中的应用场景,旨在为读者提供一个全面的理解,帮助他们在相关领域的研究和实践中更好地应用这一技术。
一、基本原理
Q学习是一种基于值的强化学习算法,旨在通过与环境的交互来学习最优策略。其基本原理可以从以下几个方面进行详细阐述:
1. 强化学习的基本概念
强化学习的核心在于智能体(Agent)、环境(Environment)、状态(State)、动作(Action)和奖励(Reward)。智能体通过在环境中采取动作来影响状态,并根据环境反馈的奖励来调整其行为。强化学习的目标是最大化智能体在与环境交互过程中获得的累积奖励。
- 智能体:执行动作并学习的主体。
- 环境:智能体所处的外部系统,智能体通过与环境交互来学习。
- 状态:环境的具体情况,描述了智能体所处的情境。
- 动作:智能体在特定状态下可以选择的行为。
- 奖励:智能体在执行动作后从环境中获得的反馈,通常是一个数值,表示该动作的好坏。
2. Q值的定义
Q学习的核心是Q值(Action-Value Function),它表示在特定状态下采取某个动作所能获得的期望回报。Q值的定义为:
Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[Rt∣St=s,At=a]
其中:
- Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的Q值。
- R t R_t Rt:在时间步 t t t获得的奖励。
Q值函数的目标是通过学习来估计在每个状态下采取每个动作的长期回报。
3. Q学习的目标
Q学习的目标是学习一个最优的Q值函数,即找到一个策略,使得在每个状态下选择的动作能够最大化未来的累积奖励。最优Q值函数通常用 Q ∗ ( s , a ) Q^*(s, a) Q∗(s,a)表示,满足以下贝尔曼方程:
Q ∗ ( s , a ) = E [ R t + γ max a ′ Q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q∗(s,a)=E[Rt+γa′maxQ∗(St+1,a′)∣St=s,At=a]
其中, γ \gamma γ是折扣因子,表示未来奖励的重要性。
4. 学习过程
Q学习的学习过程主要包括以下几个步骤:
-
初始化Q值表:通常将所有Q值初始化为零或小的随机值。
-
选择动作:根据当前状态选择一个动作,通常使用ε-贪婪策略。该策略在探索和利用之间进行权衡,以确保智能体能够探索新的状态和动作。
-
执行动作:在环境中执行所选动作,观察结果状态和获得的奖励。
-
更新Q值:根据获得的奖励和下一个状态的最大Q值更新当前状态的Q值。更新公式为:
Q ( s , a ) ← Q ( s , a ) + α ( r + γ max a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)←Q(s,a)+α(r+γa′maxQ(s′,a′)−Q(s,a))
其中, α \alpha α是学习率,控制新信息对旧信息的影响程度。
-
迭代:重复上述步骤,直到Q值收敛或达到预设的迭代次数。
5. 收敛性
Q学习的收敛性是其重要特性之一。在满足一定条件下(如充分探索状态和动作空间),Q学习能够保证收敛到最优Q值函数。具体来说,随着学习的进行,Q值将逐渐逼近真实的Q值,从而找到最优策略。
二、数学模型
Q学习的数学模型是其核心部分,涉及到状态、动作、奖励以及Q值的定义和更新。以下将详细阐述Q学习的数学模型,包括状态空间、动作空间、Q值函数、贝尔曼方程以及Q值更新公式。
1. 状态空间和动作空间
在Q学习中,环境的状态空间和动作空间是基本构成要素:
- 状态空间 ( S S S):表示环境中所有可能的状态的集合。每个状态 s ∈ S s \in S s∈S描述了环境的特定情境。
- 动作空间 ( A A A):表示智能体在每个状态下可以选择的所有可能动作的集合。每个动作 a ∈ A a \in A a∈A是智能体在状态 s s s下可以采取的行为。
2. Q值函数
Q值函数是Q学习的核心,表示在特定状态下采取某个动作的期望回报。Q值函数定义为:
Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[Rt∣St=s,At=a]
其中:
- Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的Q值。
- R t R_t Rt:在时间步 t t t获得的奖励。
Q值函数的目标是通过学习来估计在每个状态下采取每个动作的长期回报。
3. 贝尔曼方程
贝尔曼方程是Q学习的理论基础,描述了Q值之间的关系。对于最优Q值函数 Q ∗ ( s , a ) Q^*(s, a) Q∗(s,a),贝尔曼方程可以表示为:
Q ∗ ( s , a ) = E [ R t + γ max a ′ Q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q∗(s,a)=E[Rt+γa′maxQ∗(St+1,a′)∣St=s,At=a]
其中:
- R t R_t Rt:在状态 s s s下采取动作 a a a后获得的即时奖励。
- γ \gamma γ:折扣因子,表示未来奖励的重要性,取值范围为 [ 0 , 1 ] [0, 1] [0,1]。
- S t + 1 S_{t+1} St+1:执行动作 a a a后转移到的新状态。
- max a ′ Q ∗ ( S t + 1 , a ′ ) \max_{a'} Q^*(S_{t+1}, a') maxa′Q∗(St+1,a′):在新状态 S t + 1 S_{t+1} St+1下所有可能动作的最大Q值。
贝尔曼方程表明,当前状态下采取某个动作的Q值等于即时奖励加上未来状态的最大Q值的折扣期望。
4. Q值更新公式
Q学习的关键在于如何更新Q值。Q值的更新公式为:
Q ( s , a ) ← Q ( s , a ) + α ( r + γ max a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)←Q(s,a)+α(r+γa′maxQ(s′,a′)−Q(s,a))
其中:
- Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的当前Q值。
- α \alpha α:学习率,控制新信息对旧信息的影响程度,取值范围为 [ 0 , 1 ] [0, 1] [0,1]。
- r r r:在状态 s s s下采取动作 a a a后获得的即时奖励。
- γ \gamma γ:折扣因子,表示未来奖励的重要性,取值范围为 [ 0 , 1 ] [0, 1] [0,1]。
- s ′ s' s′:执行动作 a a a后转移到的新状态。
- max a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxa′Q(s′,a′):在新状态 s ′ s' s′下所有可能动作的最大Q值。
更新公式的含义是:当前Q值通过加上一个修正项来更新,修正项由即时奖励和未来最大Q值的折扣期望组成。学习率 α \alpha α决定了新信息对旧信息的影响程度。
5. 收敛性
Q学习的收敛性是其重要特性之一。在满足一定条件下(如充分探索状态和动作空间),Q学习能够保证收敛到最优Q值函数。具体来说,随着学习的进行,Q值将逐渐逼近真实的Q值,从而找到最优策略。
根据强化学习的理论,Q学习的收敛性可以通过以下条件来保证:
- 每个状态-动作对 ( s , a ) (s, a) (s,a)在学习过程中被充分探索。
- 学习率 α \alpha α满足条件: ∑ t = 1 ∞ α t = ∞ \sum_{t=1}^{\infty} \alpha_t = \infty ∑t=1∞αt=∞ 和 ∑ t = 1 ∞ α t 2 < ∞ \sum_{t=1}^{\infty} \alpha_t^2 < \infty ∑t=1∞αt2<∞。
6. 策略提取
一旦Q值收敛,最优策略可以通过选择在每个状态下具有最大Q值的动作来提取。最优策略 π ∗ \pi^* π∗可以表示为:
π ∗ ( s ) = arg max a Q ∗ ( s , a ) \pi^*(s) = \arg\max_{a} Q^*(s, a) π∗(s)=argamaxQ∗(s,a)
这意味着在每个状态 s s s下,智能体将选择Q值最大的动作,从而实现最优决策。
三、实现步骤
Q学习的实现步骤可以分为多个阶段,从环境的设置到Q值的更新,整个过程相对系统化。以下将详细阐述Q学习的实现步骤。
1. 环境设置
在开始实现Q学习之前,首先需要定义环境。这包括状态空间、动作空间和奖励机制。
- 状态空间 ( S S S):定义环境中所有可能的状态。状态可以是离散的(如棋盘上的位置)或连续的(如机器人的位置和速度)。
- 动作空间 ( A A A):定义智能体在每个状态下可以选择的所有可能动作。动作可以是离散的(如上下左右移动)或连续的(如调整速度)。
- 奖励机制:设计奖励函数,定义智能体在执行特定动作后获得的反馈。奖励可以是正值(表示好的行为)、负值(表示不好的行为)或零(表示中立的行为)。
2. 初始化Q值表
在Q学习中,Q值表用于存储每个状态-动作对的Q值。初始化Q值表的步骤如下:
- 创建一个二维数组或字典,行表示状态,列表示动作。
- 将所有Q值初始化为零或小的随机值。通常,初始化为零是一个常见的选择。
import numpy as npnum_states = 5 # 状态数量
num_actions = 2 # 动作数量
Q = np.zeros((num_states, num_actions)) # 初始化Q值表
3. 选择策略
在Q学习中,选择策略决定了智能体在每个状态下如何选择动作。常用的策略是ε-贪婪策略,该策略在探索和利用之间进行权衡:
- 探索:以概率ε选择一个随机动作,以便探索新的状态。
- 利用:以概率1-ε选择当前Q值最高的动作,以便利用已有的知识。
def choose_action(state, epsilon):if np.random.rand() < epsilon:return np.random.randint(num_actions) # 随机选择动作else:return np.argmax(Q[state]) # 选择最大Q值的动作
4. 循环迭代
Q学习的核心在于通过多次迭代来更新Q值。每次迭代的步骤如下:
- 初始化状态:随机选择一个初始状态。
- 选择动作:根据当前状态和选择策略选择一个动作。
- 执行动作:在环境中执行所选动作,观察结果状态和获得的奖励。
- 更新Q值:根据获得的奖励和下一个状态的最大Q值更新当前状态的Q值。
- 更新状态:将当前状态更新为新状态。
- 终止条件:检查是否满足终止条件,如达到最大迭代次数或Q值收敛。
以下是一个完整的迭代过程示例:
num_episodes = 1000 # 训练轮数
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索率for episode in range(num_episodes):state = np.random.randint(num_states) # 随机初始状态done = Falsewhile not done:action = choose_action(state, epsilon) # 选择动作new_state, reward, done = environment.step(state, action) # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state # 更新状态
5. 终止条件
在实现Q学习时,需要设定终止条件,以决定何时停止训练。常见的终止条件包括:
- 达到最大迭代次数:设定一个固定的训练轮数,如1000轮。
- Q值收敛:当Q值的变化小于某个阈值时,认为Q值已经收敛,可以停止训练。
6. 策略提取
一旦Q值收敛,可以从Q值表中提取最优策略。最优策略是指在每个状态下选择Q值最大的动作:
def extract_policy(Q):return np.argmax(Q, axis=1) # 返回每个状态下的最优动作
四、应用场景
Q学习作为一种强大的强化学习算法,广泛应用于多个领域。以下将结合具体代码详细阐述几个典型的应用场景,包括游戏AI、机器人控制和推荐系统。
1. 游戏AI
在游戏中,Q学习可以用于训练智能体,使其能够在复杂的游戏环境中学习最优策略。以下是一个简单的“迷宫”游戏的示例,智能体需要找到从起点到终点的最短路径。
import numpy as np
import random# 定义环境
class MazeEnvironment:def __init__(self):self.state_space = 5 # 状态数量self.action_space = 4 # 动作数量(上、下、左、右)self.state = 0 # 初始状态self.goal_state = 4 # 目标状态def step(self, action):# 定义状态转移和奖励机制if action == 0: # 上self.state = max(0, self.state - 1)elif action == 1: # 下self.state = min(self.state_space - 1, self.state + 1)elif action == 2: # 左self.state = max(0, self.state - 1)elif action == 3: # 右self.state = min(self.state_space - 1, self.state + 1)# 奖励机制if self.state == self.goal_state:return self.state, 1, True # 到达目标,获得奖励1else:return self.state, -0.1, False # 未到达目标,获得小的惩罚# Q学习算法
def q_learning_maze(episodes):env = MazeEnvironment()Q = np.zeros((env.state_space, env.action_space)) # 初始化Q值表alpha = 0.1 # 学习率gamma = 0.9 # 折扣因子epsilon = 0.1 # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1) # 随机初始状态done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1) # 随机选择else:action = np.argmax(Q[state]) # 选择最大Q值的动作new_state, reward, done = env.step(action) # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state # 更新状态return Q# 训练智能体
Q_values = q_learning_maze(1000)
print("Q值表:")
print(Q_values)
2. 机器人控制
在机器人控制中,Q学习可以帮助机器人在动态环境中学习如何执行任务。例如,训练一个机器人在一个简单的网格环境中移动到目标位置。
class RobotEnvironment:def __init__(self):self.state_space = 16 # 4x4网格self.action_space = 4 # 动作数量(上、下、左、右)self.state = 0 # 初始状态self.goal_state = 15 # 目标状态def step(self, action):# 定义状态转移row, col = divmod(self.state, 4)if action == 0 and row > 0: # 上row -= 1elif action == 1 and row < 3: # 下row += 1elif action == 2 and col > 0: # 左col -= 1elif action == 3 and col < 3: # 右col += 1self.state = row * 4 + col# 奖励机制if self.state == self.goal_state:return self.state, 1, True # 到达目标,获得奖励1else:return self.state, -0.1, False # 未到达目标,获得小的惩罚# Q学习算法
def q_learning_robot(episodes):env = RobotEnvironment()Q = np.zeros((env.state_space, env.action_space)) # 初始化Q值表alpha = 0.1 # 学习率gamma = 0.9 # 折扣因子epsilon = 0.1 # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1) # 随机初始状态done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1) # 随机选择else:action = np.argmax(Q[state]) # 选择最大Q值的动作new_state, reward, done = env.step(action) # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state # 更新状态return Q# 训练机器人
Q_values_robot = q_learning_robot(1000)
print("机器人Q值表:")
print(Q_values_robot)
3. 推荐系统
在推荐系统中,Q学习可以用于优化用户的推荐策略。通过将用户的行为视为状态,Q学习可以帮助系统学习如何为用户推荐最合适的内容。
class RecommendationEnvironment:def __init__(self, num_users, num_items):self.num_users = num_usersself.num_items = num_itemsself.state = 0 # 当前用户self.action_space = num_items # 动作数量(推荐的物品)def step(self, action):# 模拟用户对推荐物品的反馈reward = np.random.choice([0, 1], p=[0.5, 0.5]) # 随机反馈self.state = (self.state + 1) % self.num_users # 切换到下一个用户return self.state, reward, self.state == 0 # 返回新状态、奖励和是否结束# Q学习算法
def q_learning_recommendation(episodes, num_users, num_items):env = RecommendationEnvironment(num_users, num_items)Q = np.zeros((num_users, num_items)) # 初始化Q值表alpha = 0.1 # 学习率gamma = 0.9 # 折扣因子epsilon = 0.1 # 探索率for episode in range(episodes):state = 0 # 从第一个用户开始done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1) # 随机选择else:action = np.argmax(Q[state]) # 选择最大Q值的动作new_state, reward, done = env.step(action) # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state # 更新状态return Q# 训练推荐系统
Q_values_recommendation = q_learning_recommendation(1000, 5, 10)
print("推荐系统Q值表:")
print(Q_values_recommendation)
结论
Q学习作为一种经典的强化学习算法,以其简单而有效的学习机制在多个领域展现出了强大的应用潜力。从游戏AI到机器人控制,再到推荐系统,Q学习通过与环境的交互不断优化决策策略,帮助智能体在复杂的情境中做出最佳选择。本文详细阐述了Q学习的基本原理、数学模型、实现步骤以及具体应用场景,旨在为读者提供一个全面的理解。
随着技术的不断进步,Q学习的应用范围将进一步扩大,尤其是在智能系统和自动化领域。未来,结合深度学习等先进技术,Q学习有望在更复杂的环境中实现更高效的学习和决策。希望本文能够激发读者对Q学习的兴趣,并为其在实际项目中的应用提供有价值的参考。
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。
相关文章:

Q学习(Q-Learning)详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

【前端】 canvas画图
一、场景描述 利用js中的canvas画图来画图,爱心、动画。 二、问题拆解 第一个是:canvas画图相关知识。 第二个是:动画相关内容。 三、知识背景 3.1 canvas画图相关内容 canvas画图的基本步骤 获取页面上的canvas标签对象获取绘图上下文…...

超标量处理器设计笔记(10) 寄存器重命名过程的恢复、分发
重命名 寄存器重命名过程的恢复使用 Checkpoint 对 RAT 进行恢复使用 WALK 对 RAT 进行恢复使用 Architecture State 对 RAT 进行恢复总结 分发(Dispatch) 寄存器重命名过程的恢复 当发生异常、分支预测失败时,指令占用 RAT、ROB 和 Issue …...

硬件设计-电源轨噪声对时钟抖动的影响
目录 定义 实际案例 总结 定义 首先了解抖动的定义,在ITU-T G.701中有关抖动的定义如下: 数字信号重要瞬间相对于其理想时间位置的短期非累积变化。 抖动是时钟或数据信号时序的短期时域变化。抖动包括信号周期、频率、相位、占空比或其他一些定时特…...

geeCache 一致性hash
目标:解决当自身结点没有改缓存时,从哪个结点获得这个缓存的问题 一、普通的hash算法 hash(Tom)%结点数量 缺点:缓存雪崩 缓存雪崩是指在某一时刻,大量缓存同时失效或宕机,导致大量请求直接访问数据库,从…...
【我的开源】ESCurlGen 一款 ElasticSearch curl 命令生成器
由于经常编写复杂的 Elasticsearch 查询,并通过代码生成查询条件,我发现每次使用 curl 请求 Elasticsearch 时,手动复制配置信息并构建 curl 命令的过程非常繁琐,尤其是在管理多个环境的情况下更为不便。因此,我利用 A…...
Python库NetworkX介绍
NetworkX 是一个用于创建、操作和研究复杂网络结构的 Python 库。它特别适用于图论和网络分析,提供了丰富的图形数据结构和许多常用的算法。无论是学术研究、数据科学还是实际应用,NetworkX 都是分析图网络和复杂关系的强大工具。 1. NetworkX的基本概述…...

Muduo网络库解析--网络模块(2)
前文 重写Muduo库实现核心模块的Git仓库 注:本文将重点剖析 Muduo 网络库的核心框架,深入探讨作者精妙的代码设计思路,并针对核心代码部分进行重写,将原本依赖 boost 的实现替换为原生的 C11 语法。需要说明的是,本文…...
【读书笔记】《论语别裁》语文的变与不变
1.内容摘要 在《论语别裁》第01章“学而”中,作者探讨了语言和文字的变与不变,通过中西文化的对比,分析了文字作为思想表达工具的独立性和持久性。作者指出,虽然外语(如英语和法语)在每三十年有明显变化&a…...

elasticsearch 使用预处理将JSON类型转换成Object类型
文章目录 使用 Ingest Pipeline 和 json 处理器示例:使用Ingest Pipeline 写入数据使用该Pipeline 在Elasticsearch(ES)中,您可以使用“预处理”(通常是通过处理器、Ingest Pipeline等方式)将JSON类型的数据…...
华为HarmonyOS NEXT 原生应用开发: 数据持久化存储(用户首选项)的使用 token令牌存储鉴权!
Preferences 数据持久化存储 用户首选项(Preferences) 1. 封装 仓库工具类 ● 这里可以选择将 数据字段 key 抽取为一个静态方法,这里选择让用户传参,看起来较容易理解! /*** 首选项 preferences - 实现数据持久化…...

每天40分玩转Django:Django视图和URL
Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…...

Kioptirx level4
具体步骤 通过nmap扫描我们所在的网段探测一下存活的主机,发现目标主机开放了80端口可以去访问一下 在访问的同时通过dirb去爆破一下目录,这边发现有一个john的目录不知道是什么可以去 这边在用dirsearch去扫一下防止有漏掉的页面我们没有访问到&#x…...

JPG 转 PDF:免费好用的在线图片转 PDF 工具
JPG 转 PDF:免费好用的在线图片转 PDF 工具 在日常工作和生活中,我们经常需要将图片转换为 PDF 格式。无论是制作电子文档、准备演示材料,还是整理照片集,将图片转换为 PDF 都是一个常见的需求。今天为大家介绍一款完全免费、无需…...

《Django 5 By Example》阅读笔记:p543-p550
《Django 5 By Example》学习第 19 天,p543-p550 总结,总计 8 页。 一、技术总结 1.fixtures (1)定义 A fixture is a collection of files that contain the serialized contents of the database. (2)作用 1)数据导入 一般来说,我们是…...

精品基于Python实现的微信小程序校园导航系统-微信小程序
[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 ,项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具…...

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园
目录 [[数字花园]]的构建原理包括三个步骤:五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园(在线个人知识库)的经历,首先尝试的是网上普遍使用的方法,也就是本篇文章介绍的。 后面会继续…...

数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)
数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读,感受一下…...

分布式 窗口算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…...
docker容器内部启动jupyter notebook但是宿主机无法访问的解决方法
目录 1.问题2.解决方法 1.问题 在docker容器内启动了jupyter notebook,在宿主机内用如下的url无法访问 http://localhost:8888 http://127.0.0.1:8888 启动方法: jupyter notebook 2.解决方法 启动方法加上选项[ --ip‘*’]或者[–ip‘0.0.0.0’] 即启…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...