机器学习:强化学习的epsilon贪心算法

强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在通过与环境交互,使智能体(Agent)学习如何采取最优行动,以最大化某种累积奖励。它与监督学习和无监督学习不同,强调试错探索(Exploration-Exploitation)以及基于奖励信号的学习。

在这里插入图片描述

强化学习任务通常用马尔可夫决策过程来描述:机器处于环境 E E E中,状态空间 X X X,其中每个状态 x ∈ X x \in X xX是机器感知到的环境的描述,机器能采取的动作构成了动作空间 A A A,若某个动作 a ∈ A a \in A aA作用在当前状态 x x x上,则潜在的转移函数 P P P将使得环境从当前状态按照某种概率转移到另一个状态,在转移到另一个状态的同时,环境会根据潜在的“奖赏”函数 R R R反馈给机器一个奖赏。

在环境中状态的转移、奖赏的返回是不受机器控制的,机器只能通过选择要执行的动作来影响环境,也只能通过观察转移后的状态和返回的奖赏来感知环境。

机器要做的是通过在环境中不断地尝试而学得一个“策略”,根据这个“策略”在状态 x x x下就能知道要执行得动作。

在强化学习任务中,学习的目的就是要找到能使长期累积奖赏最大化的策略。

强化学习与监督学习来说,强化学习是没有人直接告诉机器在什么状态下应该做什么动作,只有等到最终结果揭晓,才能通过“反思”之前的动作是否正确来进行学习,因此,强化学习在某种意义上可看作具有“延迟标记信息”的监督学习问题。

强化学习任务的最终奖赏是在多步动作之后才能观察到,这里考虑简单情形:最大化单步奖赏,即仅考虑一步操作。单步强化学习任务对应了一个理论模型:k-摇臂赌博机。

k- 摇臂赌博机:有k个摇臂,赌徒在投入一个硬币后可选择按下其中一个摇臂,每个摇臂以一定的概率吐出硬币,但这个概率赌徒并不知道。赌徒的目标是通过一定的策略最大化自己的奖赏,即获得最多的硬币。

若仅为获知每个摇臂的期望奖赏,则可采用“仅探索”法:将所有的尝试机会平均分配给每个摇臂,最后以每个摇臂各自的平均吐币概率作为其奖赏的近似评估。若仅为执行奖赏最大的动作,则可采用“仅利用”法:按下目前最优的摇臂。“仅探索”法会失去很多选择最优摇臂的机会;“仅利用”法可能经常选不到最优摇臂。

ϵ \epsilon ϵ贪心法是基于一个概率来对探索和利用进行折中:每次尝试时,以 ϵ \epsilon ϵ的概率进行探索,以 1 − ϵ 1 - \epsilon 1ϵ的概率进行利用。

则平均奖赏为:
Q ( k ) = 1 n ∑ i = 1 n v i Q(k) = \frac{1}{n} \sum_{i=1}^nv_i Q(k)=n1i=1nvi
可以改成增量计算:
Q n ( k ) = 1 n ( ( n − 1 ) × Q n − 1 ( k ) + v n ) = Q n − 1 ( k ) + 1 n ( v n − Q n − 1 ( k ) ) Q_n(k) = \frac {1}{n} ( (n - 1) \times Q_{n-1}(k) + v_n) \\ = Q_{n-1}(k) + \frac{1}{n}(v_n - Q_{n-1}(k)) Qn(k)=n1((n1)×Qn1(k)+vn)=Qn1(k)+n1(vnQn1(k))

代码

k-摇臂赌博机实现:

import numpy as np

class KArmedBandit:
    def __init__(self, k=10, true_reward_mean=0, true_reward_std=1):
        """
        k: 摇臂数量
        true_reward_mean: 奖励均值的均值
        true_reward_std: 奖励均值的标准差
        """
        self.k = k
        self.q_true = np.random.normal(true_reward_mean, true_reward_std, k)  # 每个摇臂的真实均值
    
    def step(self, action):
        """执行动作(拉某个摇臂),返回奖励"""
        reward = np.random.normal(self.q_true[action], 1)  # 以 q*(a) 为均值的正态分布
        return reward

ϵ \epsilon ϵ贪心实现:

from data_processing import KArmedBandit
import numpy as np
import matplotlib.pyplot as plt

def select_action(epsilon:float, q_estimates:np.ndarray):
    """根据 epsilon-greedy 策略选择动作"""
    if np.random.rand() < epsilon: # 随机选择
        return np.random.choice(len(q_estimates))  # 
    else:
        return np.argmax(q_estimates)  # 选择估计奖励最高的动作
def update_estimates(q_estimates:np.ndarray, action:int, reward:float, action_counts:np.ndarray):
    """更新动作的估计奖励"""
    action_counts[action] += 1
    q_estimates[action] += (reward - q_estimates[action]) / action_counts[action]
    return q_estimates, action_counts

def start(k:int, epsilon:float, epochs:int, stps:int):
    """开始运行 epsilon-greedy 算法"""
    q_estimates = np.zeros(k)  # 每个摇臂的估计奖励
    action_counts = np.zeros(k)  # 每个摇臂被选择的次数
    avg_rewards = np.zeros(stps)  # 记录每次拉摇臂的奖励

    for epoch in range(epochs):
        bandit = KArmedBandit(k)
        rewards = []
        for step in range(stps):
            action = select_action(epsilon, q_estimates)
            reward = bandit.step(action)
            q_estimates, action_counts = update_estimates(q_estimates, action, reward, action_counts)
            rewards.append(reward) # 记录奖励
        avg_rewards += np.array(rewards) # 记录每次拉摇臂的奖励
    avg_rewards /= epochs
    return avg_rewards

if __name__ == '__main__':
    k = 10
    epsilon = 0.1
    epochs = 2000
    stps = 1000
    avg_rewards = start(k, epsilon, epochs, stps)
    plt.plot(avg_rewards)
    plt.xlabel('Steps')
    plt.ylabel('Average reward')
    plt.title('RL: epsilon-greedy Performance')
    plt.show()

在这里插入图片描述

深入理解强化学习(一)- 概念和术语 - 知乎 (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶—list类

第一章&#xff1a;list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

2024年群智能SCI1区:多策略集成粒子群算法GSRPSO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种新的多策略集成粒子群算法&#xff08;GSRPSO&#xff09;&#xff0c;用于提高宫颈癌图像的多阈值分割精度。GSRPSO通过四种策略协同工作&#xff0c;增强了算法的优化能力。动态参数平衡了探索与…

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并、行高设置等。

入口类&#xff1a;exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowagie…

SOME/IP-SD -- 协议英文原文讲解6

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.3.1 E…

【13】智能合约进阶

13-1 SDK应用集成 13-1-1 蚂蚁链应用集成概述 蚂蚁区块链介绍 蚂蚁区块链通过引入P2P网络、共识算法、虚拟机、智能合约、密码学、数据存储等技术特性&#xff0c;构建一个稳定、高效、安全的图灵完备智能合约执行环境&#xff0c;提供账户的基本操作以及面向智能合约的功能调…

cesium 解决加载带动画的glb不播放动画问题

glb加载参考&#xff1a;cesium 添加几何对象 entity primitive_cesium.js 添加几何体-CSDN博客 使用entity方式加载的glb&#xff0c;默认会开启动画&#xff0c;但使用primitive加载的glb&#xff0c;需要手动开启动画 let modelPosition Cesium.Cartesian3.fromDegrees(..…

进程间通信(中)

对于上篇的学习&#xff0c;由于内容太多&#xff0c;我们接着继续&#xff08;上篇可点击进入查看&#xff09;进程间通信&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/145623853?fromshareblogdetail&sharetypeblogdetail&sh…

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…

【读书笔记·VLSI电路设计方法解密】问题57:逻辑合成过程中插入测试的目的是什么

如第3章第20题所述&#xff0c;可测试性设计&#xff08;Design for Testability, DFT&#xff09;是创建具有商业价值的产品时需要考虑的一个非常重要的问题。为了实现DFT功能&#xff0c;使设计能够检测制造缺陷&#xff0c;需要在设计中添加额外的测试电路&#xff0c;而这些…

正则表达式–断言

原文地址&#xff1a;正则表达式–断言 – 无敌牛 欢迎参观我的个人博客&#xff1a;正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...)&#xff1a;正向预查&#xff08;positive lookahead&#xff09;&#xff0c;表示某个字符串后面应该跟着什么。但这个字符串本身…

AI数据分析:用DeepSeek做数据清洗

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础&#xff0c;其目的是…

自编码器——数据降维及特征提取

目录 一.定义 二.原理 1. 编码器 2. 解码器 三.代码实现 1.步骤&#xff1a; 代码实现&#xff1a; 代码解析&#xff1a; 2.进一步优化&#xff1a; 四.应用场景 一.定义 自编码器&#xff08;Autoencoder&#xff09;是一种无监督学习的神经网络模型&#xff0c;主要用于…

stm32四种方式精密控制步进电机

在搭建完clion的开发环境后&#xff0c;我决定重写之前的项目并优化完善&#xff0c;争取做出完全可落地的东西&#xff0c;也结合要写的论文内容一同学习下去。 因此&#xff0c;首当其冲的就是回到步进电机控制领域&#xff0c;把之前使用中断溢出进行步进电机控制的方案进行…

管理后台环境配置

1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl &#xff08;管理员&#xff1a;wsl --install&#xff09; redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;…

DeepSeek 大模型:带火算力,重塑 AI?

在全球人工智能蓬勃发展的当下&#xff0c;各类技术与模型持续迭代更新&#xff0c;深刻影响着各个行业的发展轨迹。DeepSeek 作为其中的重要参与者&#xff0c;快速崭露头角&#xff0c;在技术创新和市场拓展方面成果显著&#xff0c;对算力市场也产生了强大的带动效应。这引发…

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…

wpf中如何让TextBox 显示字体的颜色为白色

在 WPF 中&#xff0c;要让 TextBox 的字体颜色显示为白色&#xff0c;可以通过以下方法实现&#xff1a; 方法 1&#xff1a;直接设置 Foreground 属性&#xff08;XAML&#xff09; 在 XAML 中直接为 TextBox 设置 Foreground 属性&#xff0c;使用 White 颜色&#xff1a; …

小白向-python实现插入排序算法

插入排序 一、插入排序的定义 插入排序&#xff08;Insertion Sort&#xff09;是一种稳定的排序算法&#xff0c;通过构建有序序列&#xff0c;逐步将新元素插入到正确位置&#xff0c;最终完成排序。 二、插入排序的发展历史 插入排序是一种古老且直观的排序算法&#xff…

python-leetcode-最长公共子序列

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …