强化学习第1天:强化学习概述

news2025/4/15 10:11:59

  c0e90a73eecb4225b1119f65a39ae785.png

☁️主页 Nowl

🔥专栏《机器学习实战》 《机器学习》

📑君子坐而论道,少年起而行之 

178df7fef0cf44119524865535cee8ff.gif

文章目录

介绍

强化学习要素

强化学习任务示例

环境搭建:gym

基本用法

环境信息查看

创建智能体

过程可视化

完整代码

结语


 

介绍

强化学习是机器学习中一种独特的存在,以其独特的思想逐渐发展为一门独立的学科,强化学习适用的场景是:一个学习主体根据环境做出不同的决策,得到相应的奖励与惩罚来改进决策

它既不是监督学习也不是无监督学习,从这段描述中也可以看出,它不适合用来进行回归或者聚类等任务

bf850658e3944837bb6e928f1bc2dd53.png


强化学习要素

强化学习中有一些重要的概念,我们接下来一一介绍他们,如果有些不理解不要着急,我们会举一个具体例子来解释

  • 智能体:智能体是强化学习中的主体,它能够观测环境,做出决策,这些概念我们也将在之后说明

  • 环境:环境是智能体所处的环境,能够根据智能体的状态变化给出反馈,使智能体改进策略

  • 状态:即环境中智能体当前的状态

  • 行动:智能体会根据当前状况做出行动

  • 奖励:智能体每做出一次行动会得到一个奖励值,这也是一个导致智能体调整策略的因素

65f5fa5b5558448fa9d03183d2e465ba.png


强化学习任务示例

环境搭建:gym

gym是一个集成了一些常用环境的库,我们可以通过调用这个环境库来快速入门强化学习,在python命令行中执行命令安装

!pip install gym[toy_text,classic_control,atari,accept-rom-license,other]

基本用法

导入库后可以查看库中的所有环境和一些关于环境的说明

# 导入库
import gym


# 打印库中的所有环境和说明
print(gym.envs.registry)

我们使用小车上山任务来进行后续教学

import gym
import matplotlib.pyplot as plt


# 选择小车上山环境,并设置渲染方式,之后我们可以获取环境的图像数组
env = gym.make('MountainCar-v0', render_mode="rgb_array")
# 初始化环境
env.reset()
# 获取环境图片数组
image = env.render()
#显示环境图片
plt.imshow(image)
plt.show()

 这段代码完成了一些初始设置,具体作用见代码注释,运行结果如下图

686524f698f942a8b8d4e3ebf8072fda.png

环境信息查看

我们导入环境后要查看一些环境的信息,还记得我们最开始说的强化学习要素吗,策略,行动等,我们要查看的就是这些

import gym


env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()
for key in vars(env.spec):
    print(key, vars(env.spec)[key])

963dcdf3cf184a81a92fc1cd1bde30e7.png

这段代码打印了一些环境的基础信息,我们解释一些重要的

id—代表当前环境的名称

reward_threshold—代表奖励阈值,即当奖励大于-110时就算任务成功

max_episode_steps—表示最大回合数,到达这个数时任务就算没完成也会停止

import gym


env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()
for key in vars(env.unwrapped):
    print(key, vars(env.unwrapped)[key])

这段代码会打印一些环境具体信息,由于结果太长,请读者自行打印,这里同样解释一些重要信息

min_position: -1.2: 车辆位置的最小值。

max_position: 0.6: 车辆位置的最大值。

max_speed: 0.07: 车辆速度的最大值。

goal_position: 0.5: 车辆成功达到的目标位置。

goal_velocity: 0: 车辆成功达到的目标速度。

force: 0.001: 施加在车辆上的力的大小。

gravity: 0.0025: 重力的大小。

low: [-1.2 -0.07]: 观察空间的最小值。

high: [0.6 0.07]: 观察空间的最大值。

action_space: Discrete(3): 动作空间,表示可用的离散动作数量为 3。

observation_space: Box([-1.2 -0.07], [0.6 0.07], (2,), float32): 观察空间,表示观察的状态空间是一个2维的Box空间,范围在 [-1.2, -0.07] 到 [0.6, 0.07] 之间。

创建智能体

接下来我们将使用类定义一个智能体

class CloseFormAgent:
    def __init__(self):
        pass
    def step(self, observation):
        position, velocity = observation
        lb = min(-0.09*(position+0.25)**2+0.03, 0.3*(position+0.9)**4-0.008)
        ub = -0.07*(position+0.38)**2+0.07
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action

这个类定义了一个step函数,代表智能体决策的部分,它输入一个观测环境,在这个任务中,可以观测到小车所处的位置和速度,接着,根据这两个值来做出行为,往右或者往左

我们再定义一个智能体与环境交互的函数

# 保存图片的列表
image = []
# 实例化智能体对象
agent = CloseFormAgent()


def play_episoe(env, agent, render=False):
    # 获取初始化环境状态
    observation, _ = env.reset()
    # 初始化奖励,同时设置回合数和是否完成为False
    reward, terminated, truncated = 0., False, False
    # 初始化奖励与行动次数
    episode_reward, elapsed_step = 0., 0
    # 循环进行任务
    while True:
        # 获取决策
        action = agent.step(observation)
        # 保存当前状态图片(之后可视化要用到)
        image.append(env.render())
        # 如果到达了最大回合数或者完成任务就退出
        if terminated or truncated:
            break
        # 记录做出行动后的数据
        observation, reward, terminated, truncated, _ = env.step(action)
        # 记录回合数与行动次数
        episode_reward += reward
        elapsed_step += 1
    return episode_reward, elapsed_step

 这个函数实现了智能体与环境交互的过程,它接收行动,再返回状态,同时记录回合数,行动次数等信息,具体作用见代码注释

过程可视化

matplotlib库中有一个将图片组变成一组动画的库:FuncAnimation,我们保存每次智能体的状态图片后,用这个库就可以将整个过程显示出来了

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


image = []

# 创建一个空白的图形窗口
fig, ax = plt.subplots()

# 定义更新函数,用于在每一帧中更新图像
def update(frame):
    ax.clear()  # 清空当前图轴
    ax.imshow(image[frame])
    ax.set_title(f'Frame {frame+1}/{len(image)}')

# 创建动画对象
animation = FuncAnimation(fig, update, frames=len(image), repeat=False)
# 显示动画
plt.show()

完整代码

import gym
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


env = gym.make('MountainCar-v0', render_mode="rgb_array")
env.reset()

image = []


class CloseFormAgent:
    def __init__(self):
        pass
    
    def step(self, observation):
        position, velocity = observation
        lb = min(-0.09*(position+0.25)**2+0.03, 0.3*(position+0.9)**4-0.008)
        ub = -0.07*(position+0.38)**2+0.07
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action


agent = CloseFormAgent()


def play_episoe(env, agent, render=False):
    observation, _ = env.reset()
    reward, terminated, truncated = 0., False, False
    episode_reward, elapsed_step = 0., 0
    while True:
        action = agent.step(observation)
        image.append(env.render())
        if terminated or truncated:
            break
        observation, reward, terminated, truncated, _ = env.step(action)
        episode_reward += reward
        elapsed_step += 1
    return episode_reward, elapsed_step


episode_reward, elapsed_steps = play_episoe(env, agent, render=True)
env.close()
print("奖励:", episode_reward, "行动次数:", elapsed_steps)

# 创建一个空白的图形窗口
fig, ax = plt.subplots()


# 定义更新函数,用于在每一帧中更新图像
def update(frame):
    ax.clear()  # 清空当前图轴
    ax.imshow(image[frame])
    ax.set_title(f'Frame {frame+1}/{len(image)}')


# 创建动画对象
animation = FuncAnimation(fig, update, frames=len(image), repeat=False)
# 显示动画
plt.show()

运行后代码将打印最终奖励与行动次数,以及显示一个智能体与环境交互的动画,效果如下

77820ec1368444efb523a90208c91054.gif


结语

  • 了解了什么是强化学习
  • 学习了强化学习的基本概念
  • 通过一个简单示例直观感受了强化学习的基本流程
  • 学习了将图片动画化的技术

9741edbb1a0546229968c1f90d259244.gif

感谢阅读,觉得有用的话就订阅下本专栏吧,有错误也欢迎指出

 

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

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

相关文章

0基础学java-day15

一、泛型 1 泛型的理解和好处 1.1 看一个需求 【不小心加入其它类型&#xff0c;会导致出现类型转换异常】 package com.hspedu.generic;import java.util.ArrayList;/*** author 林然* version 1.0*/ public class Generic01 {SuppressWarnings("all")public st…

企业数字档案馆室建设指南

数字化时代&#xff0c;企业数字化转型已经成为当下各行业发展的必然趋势。企业数字化转型不仅仅是IT系统的升级&#xff0c;也包括企业内部各种文件、档案、合同等信息的数字化管理。因此&#xff0c;建设数字档案馆室也变得尤为重要。本篇文章将为您介绍企业数字档案馆室建设…

SpringMVC修炼之旅(2)基础入门

一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…

初识MQ——消息队列技术选型

文章目录 同步和异步通讯同步通讯异步通讯 技术对比 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c…

CCF编程能力等级认证GESP—C++1级—20230318

CCF编程能力等级认证GESP—C1级—20230318 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)每月天数长方形面积 答案及解析单选题判断题编程题1编程题2 单选…

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

国内AI翘楚,看看有没有你心动的offer?

科技创新争占高地&#xff0c;AI领域各显神通。从一战成名的阿尔法狗到引起轩然大波的ChatGPT&#xff0c;我们早已卷入了一场没有硝烟的革命。前方世人看到的科技日新日异、岁月静好&#xff0c;后方是各大企业的绞尽脑汁、争先恐后。人工智能时代&#xff0c;AI是挡不住的时代…

Lebesgue积分及应用

Lebesgue积分及应用 文章目录 Lebesgue积分及应用一、Lebesgue测度和可测函数1.1 Riemann积分和Lebesgue积分1.2 直线上的Lebesgue测度【定义】外测度&#xff08;Outer Measure&#xff09;【定理】外测度的性质【定义】内测度【定义】可测、Lebesgue测度【定理】卡氏条件&…

Java注册并监听全局快捷键

背景 之前在博客中分享了SWT托盘功能, 随之带来一个问题, 当程序最小化后无法快速唤醒, 按照平时使用软件的思路, 自然想到了注册全局快捷键, 本文介绍使用java方式实现全局快捷键的注册. 方案 通过google,搜到一个现成的库: jintellitype, 使用maven可以直接引用, 非常方便…

C语言易错知识点八(整形与浮点型在内存中存储的实质)

整形与浮点型在内存中存储的实质 当我们在刷抖音或者其他短视频平台时&#xff0c;可能会时不时(总是&#xff0c;我相信大家肯定是不会被外表骗到的那一类人ヾ(●゜ⅴ゜)&#xff89;)刷到各种帅哥美女的视频&#xff0c;或者我们在学校里看到帅哥美女时&#xff0c;如果我们只…

NFC和蓝牙在物联网中有什么意义?如何选择?

#NFC物联网# #蓝牙物联网# 在物联网中&#xff0c;NFC和蓝牙有什么意义&#xff1f; NFC在物联网中代表近场通信技术。它是一种短距离、高频的无线通信技术&#xff0c;可以在近距离内实现设备间的数据传输和识别。NFC技术主要用于移动支付、电子票务、门禁、移动身份识别、防…

Vue2中v-html引发的安全问题

前言&#xff1a;v-html指令 1.作用&#xff1a;向指定节点中渲染包含html结构的内容。 2.与插值语法的区别&#xff1a; (1).v-html会替换掉节点中所有的内容&#xff0c;{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意&#xff1a;v-html有安全性问题&#xff0…

STM32串口接收数据包(自定义帧头帧尾)

1、基本概述 本实验基于stm32c8t6单片机&#xff0c;串口作为基础且重要的外设&#xff0c;具有广泛的应用。本文主要理解串口数据包的发送与接收是如何实现的&#xff0c;重要的是理解程序的实现思路。 2、关键程序 定义好需要用到的变量&#xff1a; uint8_t rxd_buf[4];//…

湖南麒麟下默认使用串口输出系统日志

有时候为了调试方便&#xff0c;需要将系统日志通过CPU的串口进行输出&#xff0c;以下是针对至强E5V4处理器上安装湖南麒麟操作系统后将日志通过串口输出的配置。 首先在bios中打开串口重定向功能&#xff0c;这里的BIOS是AMI的BIOS 内部配置如下&#xff0c;波特率115200配置…

ESP32网络开发实例-发送邮件

发送邮件 文章目录 发送邮件1、邮件发送配置2、软件准备3、硬件准备4、代码实现本文将详细介绍在ESP32中如何使用SMTP协议发送邮件。 1、邮件发送配置 在本次实例中,我们将通过QQ邮箱向指定邮件地址发送邮件。 第一步,注册QQ邮箱 第二步,开启QQ邮箱SMTP/IMAP 服务: 生成…

一文搞懂Git版本控制系统

1. Git简介 当涉及到软件开发或协作时&#xff0c;版本管理是一个不可或缺的概念。无论你是一个独立开发者还是一个团队成员&#xff0c;都会遇到需要跟踪和管理代码变更的情况。这时候&#xff0c;Git作为一个强大而流行的版本控制系统就发挥着重要的作用。 Git&#xff08;读…

使用Pytoch实现Opencv warpAffine方法

随着深度学习的不断发展&#xff0c;GPU/NPU的算力也越来越强&#xff0c;对于一些传统CV计算也希望能够直接在GPU/NPU上进行&#xff0c;例如Opencv的warpAffine方法。Opencv的warpAffine的功能主要是做仿射变换&#xff0c;如果不了解仿射变换的请自行了解。由于Pytorch的图像…

每日一题:LeetCode-75. 颜色分类

每日一题系列&#xff08;day 12&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

【多线程】线程的三种常见创建方式

文章目录 线程创建方式1——Thread线程创建方式2——Runnable线程创建方式2——匿名内部类线程创建方式3——Callable、FutureTask,带返回值 线程其实是程序中的一条执行路径。 那怎样的程序才是多线程程序呢&#xff1f; 例如12306网站就是支持多线程的&#xff0c;因为同时可…

通过仿真理解信道化接收机分析过程

概要 信道化从子信道带宽划分上可分为临界抽取和非临界抽取两种&#xff0c;从各子信道中心频率布局上可分为偶型排列和奇型排列&#xff0c;从处理流程上可分为信道化分析与信道化综合过程。本文主要通过仿真来理解偶型排列/临界抽取/信道化分析过程。 基本原理 常规的数字…