当前位置: 首页 > article >正文

【大数据】机器学习----------强化学习机器学习阶段尾声

一、强化学习的基本概念

注: 圈图与折线图引用知乎博主斜杠青年

1. 任务与奖赏
  • 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个或多个目标。智能体通过与环境进行交互,根据环境的状态(states)选择动作,并根据环境的反馈调整自己的行为。
  • 奖赏:环境会给智能体一个反馈信号,即奖赏(reward),奖赏是一个标量值,代表智能体采取行动后的即时奖励或惩罚。智能体的目标是最大化累积奖赏,通常使用折扣累积奖赏公式:
    在这里插入图片描述
    ,其中在这里插入图片描述
    是在时刻 在这里插入图片描述
    获得的奖赏,(\gamma\in[0,1]) 是折扣因子,用于平衡短期和长期奖赏,越接近 0 表示越关注短期奖赏,越接近 1 表示越关注长期奖赏。

二、k-摇臂赌博机

1. 基本概念
  • k-摇臂赌博机是强化学习中的一个经典问题,它有 (k) 个摇臂,每个摇臂被拉动时会给出一个随机的奖赏。智能体的任务是通过多次试验找到能带来最大累积奖赏的摇臂。
    在这里插入图片描述
2. 代码示例((\epsilon)-贪心算法)
import numpy as np


def k_arm_bandit(k, num_steps, epsilon):
    # 初始化每个摇臂的真实奖赏期望,这里假设服从正态分布
    true_rewards = np.random.normal(0, 1, k)
    estimated_rewards = np.zeros(k)
    num_pulls = np.zeros(k)
    rewards = []

    for step in range(num_steps):
        if np.random.rand() < epsilon:
            # 以 epsilon 的概率随机选择一个摇臂
            action = np.random.randint(k)
        else:
            # 以 1 - epsilon 的概率选择估计奖赏最大的摇臂
            action = np.argmax(estimated_rewards)

        # 从选中的摇臂获得一个随机奖赏,假设服从正态分布
        reward = np.random.normal(true_rewards[action], 1)
        rewards.append(reward)

        # 更新估计奖赏和拉动次数
        num_pulls[action] += 1
        estimated_rewards[action] += (reward - estimated_rewards[action]) / num_pulls[action]

    return rewards


# 示例运行
k = 10
num_steps = 1000
epsilon = 0.1
rewards = k_arm_bandit(k, num_steps, epsilon)
print("Total rewards:", np.sum(rewards))

三、有模型学习

1. 基本概念
  • 有模型学习中,智能体尝试学习环境的模型,即状态转移概率 (P(s’|s,a))(从状态 (s) 采取动作 (a) 转移到状态 (s’) 的概率)和奖赏函数 (R(s,a))(在状态 (s) 采取动作 (a) 获得的奖赏)。然后可以使用规划算法(如动态规划)来求解最优策略。
2. 数学公式(Bellman 方程)
  • 状态值函数 (V(s)) 的 Bellman 期望方程:

  • 在这里插入图片描述

  • 动作值函数 (Q(s,a)) 的 Bellman 期望方程:在这里插入图片描述
    ,其中 (\pi(a|s)) 是策略,表示在状态 (s) 下采取动作 (a) 的概率。

3. 代码示例(价值迭代)
import numpy as np


def value_iteration(P, R, gamma, theta):
    num_states = P.shape[0]
    num_actions = P.shape[1]
    V = np.zeros(num_states)
    while True:
        delta = 0
        for s in range(num_states):
            v = V[s]
            V[s] = max([sum([P[s][a][s_prime] * (R[s][a] + gamma * V[s_prime])
                          for s_prime in range(num_states)]) for a in range(num_actions)])
            delta = max(delta, abs(v - V[s]))
        if delta < theta:
            break
    return V


# 示例运行
# 假设环境的状态转移矩阵 P 和奖赏矩阵 R
P = np.random.rand(3, 2, 3)  # P[s][a][s_prime]
R = np.random.rand(3, 2)  # R[s][a]
gamma = 0.9
theta = 0.001
V = value_iteration(P, R, gamma, theta)
print("Optimal state values:", V)

四、免模型学习

1. 基本概念
  • 免模型学习不尝试学习环境的完整模型,而是直接学习价值函数或策略函数。常见的方法包括蒙特卡洛(Monte Carlo)、时序差分(Temporal Difference,TD)学习等。
2. 数学公式(TD(0) 更新)

在这里插入图片描述
,其中 (S_t) 和 (S_{t+1}) 是连续的状态,(R_{t+1}) 是从 (S_t) 到 (S_{t+1}) 获得的奖赏,(\alpha) 是学习率。

3. 代码示例(TD(0))
import numpy as np


def td_0(env, num_episodes, alpha, gamma):
    V = np.zeros(env.num_states)
    for _ in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            action = np.random.randint(env.num_actions)  # 这里使用随机策略
            next_state, reward, done = env.step(action)
            V[state] += alpha * (reward + gamma * V[next_state] - V[state])
            state = next_state
    return V


class SimpleEnvironment:
    def __init__(self):
        self.num_states = 5
        self.num_actions = 2

    def reset(self):
        return 0

    def step(self, action):
        # 简单模拟环境的状态转移和奖赏,实际应用中需要根据具体环境定义
        if action == 0:
            next_state = np.random.choice(self.num_states)
            reward = np.random.normal(0, 1)
        else:
            next_state = np.random.choice(self.num_states)
            reward = np.random.normal(1, 1)
        done = False  # 假设不会结束
        return next_state, reward, done


# 示例运行
env = SimpleEnvironment()
num_episodes = 1000
alpha = 0.1
gamma = 0.9
V = td_0(env, num_episodes, alpha, gamma)
print("Estimated state values:", V)

在这里插入图片描述

五、值函数近似

1. 基本概念
  • 当状态空间很大或连续时,使用表格存储值函数变得不可行,因此使用值函数近似。通常使用函数逼近器(如线性函数、神经网络)来表示 (V(s)) 或 (Q(s,a))。
2. 数学公式(线性值函数近似)
  • (V(s;\theta)=\theta^T\phi(s)),其中 (\theta) 是参数向量,(\phi(s)) 是状态 (s) 的特征向量。
3. 代码示例(线性函数近似)
import numpy as np


def linear_value_approximation(env, num_episodes, alpha, gamma, theta):
    for _ in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            action = np.random.randint(env.num_actions)  # 随机策略
            next_state, reward, done = env.step(action)
            # 特征向量表示
            phi_state = np.array([state, state**2])
            phi_next_state = np.array([next_state, next_state**2])
            target = reward + gamma * np.dot(theta, phi_next_state)
            delta = target - np.dot(theta, phi_state)
            theta += alpha * delta * phi_state
            state = next_state
    return theta


class SimpleEnvironment:
    def __init__(self):
        self.num_states = 5
        self.num_actions = 2

    def reset(self):
        return 0

    def step(self, action):
        # 简单模拟环境的状态转移和奖赏
        if action == 0:
            next_state = np.random.choice(self.num_states)
            reward = np.random.normal(0, 1)
        else:
            next_state = np.random.choice(self.num_states)
            reward = np.random.normal(1, 1)
        done = False  # 假设不会结束
        return next_state, reward, done


# 示例运行
env = SimpleEnvironment()
num_episodes = 1000
alpha = 0.1
gamma = 0.9
theta = np.random.rand(2)
theta = linear_value_approximation(env, num_episodes, alpha, gamma, theta)
print("Estimated theta:", theta)

六、模仿学习

1. 基本概念
  • 模仿学习旨在让智能体通过模仿专家的行为来学习策略,通常用于解决难以通过奖赏函数定义的任务。包括行为克隆(Behavior Cloning)、逆强化学习(Inverse Reinforcement Learning)等方法。
2. 代码示例(行为克隆)
import numpy as np
from sklearn.linear_model import LogisticRegression


def behavior_cloning(expert_states, expert_actions):
    # 假设专家状态和动作是已知的
    model = LogisticRegression()
    model.fit(expert_states, expert_actions)
    return model


# 示例运行
expert_states = np.random.rand(100, 2)  # 假设专家状态是二维的
expert_actions = np.random.randint(0, 2, 100)  # 专家动作是 0 或 1
model = behavior_cloning(expert_states, expert_actions)
print("Trained model:", model)

在这里插入图片描述

代码解释

k-摇臂赌博机代码解释:
  • k_arm_bandit 函数:
    • true_rewards:每个摇臂的真实期望奖赏。
    • estimated_rewards:对每个摇臂奖赏的估计。
    • num_pulls:每个摇臂被拉动的次数。
    • 使用 (\epsilon)-贪心算法,以概率 (\epsilon) 随机选择摇臂,以概率 (1 - \epsilon) 选择估计奖赏最高的摇臂。
有模型学习代码解释:
  • value_iteration 函数:
    • P:状态转移矩阵。
    • R:奖赏矩阵。
    • 通过迭代更新状态值函数 (V(s)),直到收敛((\Delta < \theta))。
免模型学习代码解释:
  • td_0 函数:
    • V:状态值函数。
    • 通过 TD(0) 更新规则 (V(S_t)\leftarrow V(S_t)+\alpha(R_{t+1}+\gamma V(S_{t+1})-V(S_t))) 来更新值函数。
值函数近似代码解释:
  • linear_value_approximation 函数:
    • 使用线性函数 (V(s;\theta)=\theta^T\phi(s)) 来近似值函数。
    • 通过更新参数 (\theta) 来学习。
模仿学习代码解释:
  • behavior_cloning 函数:
    • 使用逻辑回归模型来学习专家的状态 - 动作映射。

算法比对

在这里插入图片描述

请注意,上述代码仅为简单示例,在实际应用中可能需要更复杂的环境和算法调整。同时,对于使用的库,如 numpysklearn,你可以使用 pip 安装:

pip install numpy sklearn

在这里插入图片描述


http://www.kler.cn/a/513252.html

相关文章:

  • Golang 中强大的重试机制,解决瞬态错误
  • k8s集群换IP
  • AT8870单通道直流电机驱动芯片
  • Axios 封装:处理重复调用与内容覆盖问题
  • Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL
  • Chrome 132 版本新特性
  • SQL 递归 ---- WITH RECURSIVE 的用法
  • 基于微信小程序的科创微应用平台设计与实现(LW+源码+讲解)
  • 基于低代码平台的敏捷IT方案
  • dsu模板
  • java微服务中消息队列处理中间件基础语法学习,零基础学习
  • Android RTMP直播练习实践
  • C语言基本知识
  • Java 的初认识(一)
  • SpringCloud Eureka-账号密码配置
  • 线下陪玩系统架构与功能分析
  • vue2:为el-form-item的label设置背景色
  • 【SpringBoot深入浅出系列】SpringBoot之Actuator,让应用监控与管理变得简单高效
  • 深度内容运营与开源AI智能名片2+1链动模式S2B2C商城小程序在打造种草社区中的应用研究
  • 论文阅读--Qwen22.5技术报告
  • 多级缓存以及热点监测
  • C#性能优化技巧:利用Lazy<T>实现集合元素的延迟加载
  • 【PGCCC】PostgreSQL 中表级锁的剖析
  • FastAPI教程:快速构建高性能API
  • 可免费使用的电子画册制作平台
  • AutoSAR CP RTE 规范核心内容简介以及BswScheduler工作原理解析