David Silver Lecture 4: Model-Free Prediction

news2024/11/17 20:49:31

1 Introduction

任务:第三章使用动态规划方法,解决known的MDP问题,这章通过model free prediction对一个unknown的MDP估计他的value function。下一章通过Model free control的方法针对一个unknown的MDP optimise value function。

2 Monte Carlo Learning

2.1 MC 方法的特点

  • learn directly from episodes of experiences
  • model free: no knowledge of MDP transitions / rewards
  • learn from complete episodes: no bootstrapping
  • simplest idea: value = mean return
  • Caveat: can only apply MC to episodic MDPs
    • all episodes must terminate

2.2 MC policy evaluation

在这里插入图片描述

##伪代码
1初始化:

  • 设定状态集合 S 和动作集合 A
  • 定义策略 π
  • 设定折扣因子 γ
  • 初始化每个状态 s 的价值函数 V(s) 为 0
  • 初始化每个状态 s 的回报列表 returns(s) 为空列表

2对于每个情节(episode):

  • 初始化状态 s 为初始状态
  • 初始化轨迹 trajectory 为空列表
  • 当 s 不是终止状态时:
    • 按照策略 π 选择动作 a
    • 执行动作 a,得到下一个状态 s’ 和奖励 r
    • 将 (s, r) 添加到轨迹 trajectory
    • 更新状态 s 为 s’
  • 初始化累积回报 G 为 0
  • 从轨迹的末尾开始向前遍历每个时刻 (s, r):
    • 更新累积回报 G = r + γ * G
    • 将 G 添加到 returns(s) 列表
    • 更新价值函数 V(s) 为 returns(s) 列表的平均值

3 输出价值函数 V

考虑一个简化的冰冻湖环境,其中有四个状态(S, F, H, G),分别表示起点、冰面、洞口和终点。在每个时间步,智能体可以选择左或右2个动作。我们要评估一个简单的策略:始终向右移动

import numpy as np
import random

# 环境参数
states = ["S", "F", "H", "G"]
n_states = len(states)
actions = ["left", "right"]
n_actions = len(actions)

# 策略
policy = np.zeros((n_states, n_actions))
policy[:, actions.index("right")] = 1

# 模拟函数
def step(state, action):
    if state == 0 and action == "right":
        return 1, 0
    if state == 1 and action == "right":
        return 2, 0
    if state == 1 and action == "left":
        return 0, 0
    if state == 2 and action == "right":
        return 3, 1
    if state == 2 and action == "left":
        return 1, 0
    return state, 0

# 参数
num_episodes = 5000
gamma = 0.99

# 初始化
returns = {state: [] for state in range(n_states)}
v = np.zeros(n_states)

# Monte Carlo Policy Evaluation
for episode in range(num_episodes):
    state = 0
    episode_trajectory = []

    while state != n_states - 1:
        action = np.random.choice(actions, p=policy[state, :])
        next_state, reward = step(state, action)
        episode_trajectory.append((state, reward))
        state = next_state

    g = 0
    for t in range(len(episode_trajectory) - 1, -1, -1):
        state, reward = episode_trajectory[t]
        g = reward + gamma * g
        returns[state].append(g)
        v[state] = np.mean(returns[state])

print("Value function:", v)

关键的概念:

  • episode
    一个情节是指从初始状态到终止状态的一系列状态-动作-奖励的序列
  • episode trajectory
    在一个情节下,智能体与环境交互过程中,包含的一系列状态和相应的奖励;
    这个状态和相应的奖励序列取决于智能体采用什么样的策略,以及环境如何响应这些动作;
  • 更新累计回报
    G t = R t + 1 + γ R t + 2 + . . . + γ R t + 2 T − 1 R T v π ( s ) = E π [ G t ∣ S t = s ] \begin{aligned} G_t &= R_{t+1}+ \gamma R_{t+2}+...+ \gamma R_{t+2}^{T-1}R_T \\ v_{\pi}(s) & = E_{\pi}[G_t|S_t=s] \end{aligned} Gtvπ(s)=Rt+1+γRt+2+...+γRt+2T1RT=Eπ[GtSt=s]
  • 对比known MDP和MC
#计算reward,MC
while state != n_states - 1:
    action = np.random.choice(actions, p=policy[state, :])
    next_state, reward = step(state, action)
    episode_trajectory.append((state, reward))
    state = next_state
g = 0
for t in range(len(episode_trajectory) - 1, -1, -1):
    state, reward = episode_trajectory[t]
    g = reward + gamma * g
    returns[state].append(g)
    v[state] = np.mean(returns[state])
#计算reward, DP
# Policy Evaluation
V = np.zeros(n_states)
while True:
    delta = 0
    for state in range(n_states):
        v = V[state]
        V[state] = np.sum(policy[state, :] * (rewards[state, :] + gamma * transition_matrix[state, :, :] @ V))
        delta = max(delta, abs(v - V[state]))
    if delta < theta:
        break

2.2 incremental mean

在这里插入图片描述

2.3 incremental MC updates

在这里插入图片描述
在这里插入图片描述

3 Temporal Difference Learning

3.1 TD methods的特点

  • TD methods learn directly from episodes of experience
  • TD is model free: no knowledge of MDP transitions / rewards
  • TD learns from incomplete episodes, by bootstrapping
  • TD updates a guess towards a guess

3.2 MC 和TD

在这里插入图片描述
用MC解决driving home 的问题

import numpy as np

def generate_episode(policy, n_states, step):
    state = 0
    episode_trajectory = []
    
    while state != n_states - 1:
        action = np.random.choice(actions, p=policy[state, :])
        next_state, reward = step(state, action)
        episode_trajectory.append((state, reward))
        state = next_state
    
    return episode_trajectory

def monte_carlo_policy_evaluation(policy, n_states, n_episodes, step, gamma=1.0):
    returns_sum = np.zeros(n_states)
    returns_count = np.zeros(n_states)
    
    for episode_idx in range(n_episodes):
        episode_trajectory = generate_episode(policy, n_states, step)
        G = 0
        
        for t in range(len(episode_trajectory) - 1, -1, -1):
            state, reward = episode_trajectory[t]
            G = gamma * G + reward
            
            if state not in [x[0] for x in episode_trajectory[:t]]:
                returns_sum[state] += G
                returns_count[state] += 1
    
    value_function = returns_sum / returns_count
    return value_function

# Define the step function for the "Driving Home" problem
def step(state, action):
    next_state = state + (1 if action == 1 else -1)
    next_state = max(0, min(next_state, n_states - 1))  # Make sure we stay within the state bounds
    
    reward = -1
    if next_state == n_states - 1:
        reward = 0

    return next_state, reward

# Define the environment's parameters
n_states = 5
n_actions = 2
actions = np.arange(n_actions)

# Define the initial policy (random policy in this case)
policy = np.ones((n_states, n_actions)) / n_actions

# Run Monte Carlo Policy Evaluation
n_episodes = 1000
value_function = monte_carlo_policy_evaluation(policy, n_states, n_episodes, step)

print("Value Function:", value_function)

TD learning policy的伪代码
α 代表学习律, γ 代表未来权重的折扣因子 \alpha代表学习律,\gamma代表未来权重的折扣因子 α代表学习律,γ代表未来权重的折扣因子
TD learning

Algorithm: TD(0) Policy Evaluation

  1. 初始化值函数 V(s) 对于所有的状态 s,通常将其设置为 0
  2. 初始化策略 pi,确定每个状态采取的动作概率
  3. 选择一个折扣因子 gamma
  4. 对于每一次迭代:
    • a. 初始化状态 s
    • b. 当 s 不是终止状态时:
      • i. 采取由策略 pi 选择的动作 a
      • ii. 从环境中观察到下一个状态 s’ 和奖励 r
      • iii. 更新值函数 V(s) = V(s) + alpha * (r + gamma * V(s’) - V(s))
      • iv. 更新状态 s = s’
import numpy as np

def step(state, action):
    next_state = min(max(state + action, 0), 20)
    reward = -abs(next_state - 10)
    return next_state, reward

n_states = 21
n_actions = 3
actions = np.array([-1, 0, 1])
policy = np.ones((n_states, n_actions)) / n_actions

V = np.zeros(n_states)
alpha = 0.1
gamma = 0.9
n_episodes = 50000

for episode in range(n_episodes):
    state = np.random.randint(0, n_states)
    while state != n_states - 1:
        action = np.random.choice(actions, p=policy[state, :])
        next_state, reward = step(state, action)
        
        td_error = reward + gamma * V[next_state] - V[state]
        V[state] += alpha * td_error
        state = next_state

print("Value Function:")
print(V)

根据GPT4回答,TD相对于MC的好处

TD(Temporal Difference)学习的确将MC(Monte Carlo)中的G(t)替换为r + gamma * V(s’),这是因为TD学习结合了MC方法和动态规划(DP)的优点。TD学习使用了基于自举(Bootstrapping)的方法,即用当前估计的值函数来更新值函数,这样可以在不知道完整轨迹的情况下进行值函数更新。
相对于MC方法,TD学习具有以下优点:
1.在线学习和实时更新:与MC方法需要等待整个轨迹完>成才能进行值函数更新不同,TD学习可以在线进行,即在每个时间步骤之后立即更新值函数。这使得TD学习更适合实时决策场景。
2.更快的收敛:由于TD学习使用了自举方法,它通常能够更快地收敛到真实值函数,特别是在遇到较长轨迹的情况下。
3.较小的方差:TD学习通常具有较小的方差,因为它不依赖于完整轨迹的返回值,而是使用当前估计的值函数作为更新基础。这使得TD学习的更新通常更稳定。
4.对不完整轨迹的适应性:在某些情况下,观察到的轨迹可能不完整。TD学习可以很好地处理这种情况,因为它不需要完整的轨迹来进行更新。
总的来说,TD学习相对于MC方法具有在线学习、实时更新、更快的收敛速度、较小的方差和对不完整轨迹的适应性等优点。

3.3 bias/variance trade-off

TD的缺点是有偏的估计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import numpy as np

# 定义环境参数
n_states = 5
actions = [0, 1]  # 0:不开车, 1:开车
terminal_state = n_states - 1
gamma = 0.9

# 定义策略
policy = np.zeros((n_states, len(actions)))
policy[:, 0] = 1
policy[-1, 1] = 1

# 定义状态转移和奖励函数
def step(state, action):
    if action == 1:
        next_state = min(state + 1, terminal_state)
        reward = -1
    else:
        next_state = state
        reward = -1.5
    return next_state, reward

# 执行 Batch Monte Carlo 策略评估
n_episodes = 10000
V = np.zeros(n_states)
returns = [[] for _ in range(n_states)]

for episode in range(n_episodes):
    state = 0
    episode_trajectory = []

    while state != terminal_state:
        action = np.random.choice(actions, p=policy[state, :])
        next_state, reward = step(state, action)
        episode_trajectory.append((state, reward))
        state = next_state

    G = 0
    for t in range(len(episode_trajectory) - 1, -1, -1):
        state, reward = episode_trajectory[t]
        G = gamma * G + reward
        returns[state].append(G)

# 更新状态值函数
for state in range(n_states):
    if len(returns[state]) > 0:
        V[state] = np.mean(returns[state])

print("Value function:", V)

batch TD learning的policy evaluation的代码

import numpy as np

# 定义环境参数
n_states = 5
n_actions = 2
terminal_state = n_states - 1
gamma = 0.9
n_episodes = 10000
alpha = 0.1

# 定义策略
policy = np.ones((n_states, n_actions)) / n_actions

# 定义状态转换和奖励函数
def step(state, action):
    if action == 0:  # left
        next_state = max(state - 1, 0)
    elif action == 1:  # right
        next_state = min(state + 1, n_states - 1)
    reward = -1 if state != terminal_state else 0
    return next_state, reward

# 初始化值函数
V = np.zeros(n_states)

# 存储每个状态的所有TD误差
td_errors = [[] for _ in range(n_states)]

for _ in range(n_episodes):
    state = 0
    episode_trajectory = []

    while state != terminal_state:
        action = np.random.choice(n_actions, p=policy[state, :])
        next_state, reward = step(state, action)
        episode_trajectory.append((state, action, reward))
        state = next_state

    # 计算每个状态的TD误差并将其添加到相应的列表中
    for t, (state, action, reward) in enumerate(episode_trajectory[:-1]):
        next_state = episode_trajectory[t + 1][0]
        td_error = reward + gamma * V[next_state] - V[state]
        td_errors[state].append(td_error)

# 使用收集到的TD误差计算每个状态的平均值并更新值函数
for state in range(n_states):
    if len(td_errors[state]) > 0:
        V[state] += alpha * np.mean(td_errors[state])

print("Value function:", V)

batch MC和普通MC的区别,在跑完了所有的episode以后再进行V(state)的更新

# 更新状态值函数
for state in range(n_states):
    if len(returns[state]) > 0:
        V[state] = np.mean(returns[state])

那么估计必然会有跑一些episode以后再更新V(state)的策略

3.4 unified view

  • mc backup
    V ( S t ) ← V ( S t ) + α ( G t − V ( S t ) ) V(S_t)\leftarrow V(S_t)+\alpha(G_t-V(S_t)) V(St)V(St)+α(GtV(St))
    在这里插入图片描述
  • TD
    V ( S t ) ← V ( S t ) + α ( R t + 1 + γ V ( S t + 1 ) − V ( S t ) ) V(S_t) \leftarrow V(S_t)+\alpha (R_{t+1}+\gamma V(S_{t+1}) -V(S_t)) V(St)V(St)+α(Rt+1+γV(St+1)V(St))
    在这里插入图片描述
  • 动态规划
    在这里插入图片描述
  • bootstrapping and sampling
    在这里插入图片描述
  • 比较各种算法
    在这里插入图片描述

4 TD( λ \lambda λ)

4.1 n step prediction

在这里插入图片描述
在这里插入图片描述

4.2 averaging n-step returns

在这里插入图片描述在这里插入图片描述

4.3 λ \lambda λreturn

希望后面的结果产生的影响更小,采用 λ \lambda λreturn
在这里插入图片描述
在这里插入图片描述

4.4 forward view td

forward view weighting function
G t ( n ) = R t + 1 + γ R t + 2 + . . . + γ n − 1 R t + n + γ n V ( S t + n ) G t λ = ( 1 − λ ) ∑ n = 1 ∞ λ n − 1 G t ( n ) \begin{aligned} G_t^{(n)} & = R_{t+1}+\gamma R_{t+2}+...+\gamma^{n-1} R_{t+n} + \gamma^{n}V(S_{t+n})\\ G_t^{\lambda} &=(1-\lambda)\sum_{n=1}^{\infin}\lambda^{n-1}G_t^{(n)} \\ \end{aligned} Gt(n)Gtλ=Rt+1+γRt+2+...+γn1Rt+n+γnV(St+n)=(1λ)n=1λn1Gt(n)

import numpy as np

# 定义环境参数
n_states = 5
n_actions = 2
terminal_state = n_states - 1
gamma = 0.9
n_episodes = 10000
alpha = 0.1
_lambda = 0.9

# 定义策略
policy = np.ones((n_states, n_actions)) / n_actions

# 定义状态转换和奖励函数
def step(state, action):
    if action == 0:  # left
        next_state = max(state - 1, 0)
    elif action == 1:  # right
        next_state = min(state + 1, n_states - 1)
    reward = -1 if state != terminal_state else 0
    return next_state, reward

# 初始化值函数
V = np.zeros(n_states)

for _ in range(n_episodes):
    state = 0
    episode_trajectory = []

    # 生成情节
    while state != terminal_state:
        action = np.random.choice(n_actions, p=policy[state, :])
        next_state, reward = step(state, action)
        episode_trajectory.append((state, reward))
        state = next_state

    T = len(episode_trajectory)
    eligibility_trace = np.zeros(n_states)
    
    # 对每个时间步执行Forward View TD(λ)更新
    for t in range(T):
        current_state, reward = episode_trajectory[t]
        eligibility_trace[current_state] += 1
        G_lambda = 0
        
        for k in range(t, T):
            state_k = episode_trajectory[k][0]
            G_lambda += gamma ** (k - t) * reward * eligibility_trace[state_k]
            eligibility_trace[state_k] *= gamma * _lambda
        
        V[current_state] += alpha * (G_lambda - V[current_state])

print("Value function:", V)

在这里插入图片描述

4.5 backward view TD

在这里插入图片描述

4.5.1 Eligibility traces

E 0 ( s ) = 0 E t ( s ) = γ λ E t − 1 ( s ) + 1 ( s t = s ) \begin{aligned} E_0(s)&=0\\ E_t(s)&=\gamma \lambda E_{t-1}(s)+1(s_t=s) \end{aligned} E0(s)Et(s)=0=γλEt1(s)+1(st=s)
Eligibility traces的好处是结合了MC和TD的优点,

# TD(0) 算法: no eligibility traces
V = np.zeros(n_states)
for episode in range(n_episodes):
    state = 0
    while state != n_states - 1:
        next_state, reward = step(state)
        V[state] += alpha * (reward + gamma * V[next_state] - V[state])
        state = next_state
# TD(λ)算法
for _ in range(n_episodes):
    state = 2  # 初始状态
    eligibility_trace = np.zeros(n_states)

    while state not in terminal_states:
        action = np.random.choice(n_actions, p=policy[state, :])
        next_state, reward = step(state, action)

        eligibility_trace[state] = eligibility_trace[state] * (gamma * _lambda) + 1

        delta = reward + gamma * V[next_state] - V[state]
        V += alpha * delta * eligibility_trace
        eligibility_trace *= gamma * _lambda

        state = next_state

Eligibility traces的作用

  • 累积效果:通过在每个时间步骤将eligibility trace中的对应状态增加1,我们确保了智能体在同一回合中多次访问同一个状态时,该状态的eligibility trace会累积起来。
  • 衰减效果:通过乘以γ * λ因子,我们在每个时间步骤中都对eligibility trace进行衰减。这意味着距离当前状态越远的状态对更新的贡献会越小。
    在代码中,我们首先对eligibility trace进行衰减,然后再根据当前状态增加1。这样做的原因是我们想要在算法中引入时间差异的信息,即较早出现的状态在更新中的贡献应该较小。因此,当智能体从状态s到达状态s’时,我们首先对eligibility trace[s]进行衰减,然后再将其值增加1。
    通过这种方式,eligibility trace会在每个时间步骤中平衡累积和衰减效果,从而使TD(λ)算法能够利用距离当前状态不同距离的信息来更有效地进行值函数更新。

4.5.2 向后backward的代码

公式
δ t = R t + 1 + γ V ( S t + 1 ) − V ( S t ) \begin{aligned} \delta_t &=R_{t+1}+\gamma V(S_{t+1})-V(S_t) \end{aligned} δt=Rt+1+γV(St+1)V(St)

import numpy as np

n_states = 5
n_actions = 2
terminal_states = [0, n_states - 1]

# 转移函数
def step(state, action):
    if state in terminal_states:
        return state, 0

    if action == 0:  # 左
        next_state = max(0, state - 1)
    elif action == 1:  # 右
        next_state = min(n_states - 1, state + 1)

    reward = 0 if next_state != n_states - 1 else 1
    return next_state, reward

policy = np.ones((n_states, n_actions)) / n_actions
V = np.zeros(n_states)
n_episodes = 5000
alpha = 0.1
gamma = 0.99
_lambda = 0.9

for _ in range(n_episodes):
    state = 2  # 初始状态
    eligibility_trace = np.zeros(n_states)

    while state not in terminal_states:
        action = np.random.choice(n_actions, p=policy[state, :])
        next_state, reward = step(state, action)

        eligibility_trace[state] = eligibility_trace[state] * (gamma * _lambda) + 1

        delta = reward + gamma * V[next_state] - V[state]
        V += alpha * delta * eligibility_trace
        eligibility_trace *= gamma * _lambda

        state = next_state

print("Estimated state values:")
print(V)

在这里插入图片描述

4.5.3 向前视角和向后视角的区别

向前视角 (Forward View) TD:
向前视角 TD 侧重于观察未来的奖励和状态值。它是基于 n 步 TD 预测的概念,即根据过去 n 个时间步长的奖励和状态值来更新当前状态的值。因此,它需要未来 n 步的信息来进行更新。向前视角 TD 的主要问题是它需要在实际应用中等待 n 步,这可能导致较慢的学习速度。
向后视角 (Backward View) TD:
向后视角 TD 试图通过引入 Eligibility Traces 来解决向前视角 TD 的问题。Eligibility Traces 能够追踪过去状态的访问频率以及它们对当前值函数更新的贡献。向后视角 TD 不需要等待未来 n 步,而是在每个时间步立即更新值函数,这使得它在在线学习中更有效。
联系:
尽管向前视角和向后视角 TD 在实现上有所不同,但它们在理论上是等价的。换句话说,在完整的序列上,它们会收敛到相同的值函数估计。事实上,向后视角 TD 可以被视为向前视角 TD 的一种有效实现。
总之,向前视角和向后视角 TD 都是强化学习中估计值函数的方法,但它们的计算方法和实现方式有所不同。向前视角关注未来的奖励和状态值,而向后视角通过引入 Eligibility Traces 来追踪过去状态的访问频率和它们对当前值函数更新的贡献。虽然它们在实现上有所不同,但在理论上它们是等价的。

4.5.4 TD(0)和TD( λ \lambda λ)

在这里插入图片描述

4.5.5 MC和TD( λ \lambda λ)

在这里插入图片描述

4.6 MC 和TD(1)

E 0 ( s ) = 0 E t ( s ) = γ λ E t − 1 ( s ) + 1 ( s t = s ) \begin{aligned} E_0(s)&=0\\ E_t(s)&=\gamma \lambda E_{t-1}(s)+1(s_t=s) \end{aligned} E0(s)Et(s)=0=γλEt1(s)+1(st=s)
λ \lambda λ
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.7 offline equivalence of forward and backward TD

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学【java】初探究加密方式之消息摘要

文章目录 一 消息摘要1.1 消息摘要的特点1.2 消息摘要常见算法1.3 数字摘要的运用举例&#xff1a;1.4 字符串数字摘要演示1.5 其他数字摘要算法演示1.6 获取文件消息摘要 一 消息摘要 消息摘要&#xff08;Message Digest&#xff09;又称为数字摘要(Digital Digest)它是一个…

Feign组件的使用及开发中使用方式

在微服务的服务集群中服务与服务之间需要调用暴露的服务.那么就需要在服务内部发送http请求&#xff0c; 我们可以使用较为老的HttpClient实现&#xff0c;也可以使用SpringCloud提供的RestTemplate类调用对应的方法来发送对应的请求。 说明&#xff1a; 现在有两个微服务一个是…

java反序列化cc3链分析

前言 休息完五一&#xff0c;继续卷&#xff0c;原本想结束cc链的&#xff0c;但是发现cc3链好像用的方法不太一样&#xff0c;感觉也是可以记录下来&#xff0c;这里感觉cc3链有一些像cc1链的变种&#xff0c;就像是给你一些绕过的操作 在说一句&#xff0c;白日梦组长永远的神…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/…

低代码平台组件间事件交互

事件的分类 我们主要依托于事件来进行组件间的交互。为了满足组件与组件、组件与系统、组件与服务端的交互&#xff0c;我们大致可以将事件分为三个类别&#xff1a; 组件方法&#xff1a;每个组件都会暴露出一些方法供其他组件进行调用。例如表格组件&#xff0c;我们可以暴…

Ubuntu18.04 设置 root 用户登录

Ubuntu18.04 设置 root 用户登录 1 设置 root 密码2 设置 root 登录 1 设置 root 密码 Ubuntu 安装后&#xff0c;root 用户默认是被锁定的&#xff0c;无法登录。Ubuntu 默认的 root 密码是动态随机的&#xff0c;我们的系统每次启动后都是不一样的&#xff0c;那么要使用 ro…

【滤波】多元高斯

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第5章节05-Multivariate-Gaussians&#xff08;多元高斯&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 上一篇文章中的技术非常强大&#xff0c;但它们只…

[chapter 31][PyTorch][Early Stop Dropout]

前言 深度神经网络结构的过拟合是指 : 在训练集上的正确率很高, 但在测试集上的准确率很低. 为了缓解网络过拟合的问题, 其中一种常见的办法是使用 dropout ,Early Stop 目录&#xff1a; 1&#xff1a; Early Stop 2: Dropout 3: stochastic Gradient Descent 一 Earl…

平面设计师都在用的设计素材网站,免费下载~

很多新手设计师不知道去哪里找高清、免费的设计素材&#xff0c;今天我就给大家推荐5个设计素材网站&#xff0c;免费下载&#xff0c;赶紧收藏起来把&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素…

白宫召见科技巨头 讨论AI潜在风险 以确保人们从创新中受益

ChatGPT的问世&#xff0c;被认为是通用人工智能发展的“奇点”和强人工智能即将到来的“拐点”&#xff0c;甚至有业内人士推测所有数字化系统和各个行业都可能被其重新“洗牌”。 乐观主义者表示&#xff0c;人工智能的核心是对人类大脑的模拟&#xff0c;其目的是延伸和增强…

C++Primer 第一章

C概述 程序的组成 数据的集合算法的集合 面向对象编程:我们通过一组数据抽象来建立问题的模型,简单来说就是把一些数据封装起来,就是我们类 面向过程编程:一个问题可直接由一组算法来建立模型 第一章 开始 1.1 问题的解决 这里有一个简单的例子来让我们看看如何设计编程思路…

C++ 的类型转换

目录 1. C语言中的类型转换 2. C强制类型转换 2.1static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI&#xff08;了解&#xff09; 1. C语言中的类型转换 在 C 语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不…

华为OD机试真题-扑克牌大小【2023】【JAVA】

一、题目描述 扑克牌游戏大家应该都比较熟悉了&#xff0c;一副牌由54张组成&#xff0c;含3~A、2各4张&#xff0c;小王1张&#xff0c;大王1张。牌面从小到大用如下字符和字符串表示&#xff08;其中&#xff0c;小写joker表示小王&#xff0c;大写JOKER表示大王&#xff09…

【linux的学习】

文章目录 linux的学习一、工具安装与联网&#xff1f;二、Linux软件安装1.安装jdk2.安装MySQL2.读入数据 总结 linux的学习 一、工具安装与联网&#xff1f; 1.1安装好VM后 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后ip addr 查看ip 1.2打开IDEA的tools 二、…

Jpeg算法

Jpeg算法&#xff1a; JPEG会分析图片的各个部分找到并删除人眼不易察觉的元素。使用jpeg算法的时候可以选一个叫’质量’的可变数值来决定压缩的程度&#xff0c;压缩过多的时候我们会得到有缺陷的方框&#xff0c;叫做膺像。 压缩算法之所以有用的原因&#xff1a;人的眼睛并…

Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

目录 Ⅰ. Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器 一、认识vim 1、vim概念 2、模式及其切换 二、vim使用 1、vim的指令&#xff08;重要&#xff09; 命令模式 插…

PCB表面处理方式详解

上一篇文章中介绍了关于PCB设计中的常用基本概念&#xff0c;那么本篇文章就挑选其中的第三点【表面处理】&#xff0c;给大家展开说一说&#xff0c;顺便也自我温习一下。 什么是表面处理&#xff1f; 由于铜长期与空气接触会使得铜氧化&#xff0c;所以我们需要在PCB表面做一…

【毕业设计】基于springboot的大学生综合素质测评管理系统

目录 前言介绍综合素质测评表特色功能页面展示一&#xff0e;开发环境1.JDK配置2.安装IDEA3.MySQL安装 二&#xff0e;项目导入和配置三&#xff0e;数据库配置1.创建数据库2.修改项目数据库配置 四&#xff0e;项目部署1.项目启动2.项目访问 在线体验其他类似系统关于我 前言 …

UDP协议介绍

文章目录 一、端口号二、UDP协议1.UDP协议格式2.UDP协议的特点3.UDP缓冲区 三、UDP注意事项 一、端口号 端口号是在网络中标识一台主机上进行通信程序的唯一性的&#xff0c;在TCP/IP协议中&#xff0c;用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个…

Android Studio Flamingo | 2022.2.1 Patch 1(火烈鸟版本)

版本概况 Android Studio Flamingo | 2022.2.1 Patch 1 Build #AI-222.4459.24.2221.9971841, built on April 20, 2023 Runtime version: 17.0.60-b2043.56-9586694 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 10.0 GC: G1 Young Generation, G1 Old…