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

  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

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

 

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

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

相关文章

LLM大语言模型(一):ChatGLM3-6B本地部署

目录 前言 本机环境 ChatGLM3代码库下载 模型文件下载 修改为从本地模型文件启动 启动模型网页版对话demo 超参数设置 GPU资源使用情况 &#xff08;网页对话非常流畅&#xff09; 前言 LLM大语言模型工程化&#xff0c;在本地搭建一套开源的LLM&#xff0c;方便后续的…

一致性哈希详解

目录 一. 前言 二. 一致性哈希算法 三. Redis Cluster 的一致性哈希算法 四. Java 实现的一致性哈希 五. 分库分表中一致性哈希实践 5.1. 基于 hash 环一致性哈希算法的分库分表 5.2. 美团一致性哈希算法 5.3. 平均分布方案 一. 前言 普通的 hash 算法&#xff08;hash…

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的&#xff0c;低于 20.04 则默认安装是 MySQL5.7.33 s…

Day03 linux高级系统编程--进程

概念 进程与程序的区别 进程&#xff1a;一个正在运行的代码就叫做进程&#xff0c;是动态的&#xff0c;会占用内存 程序&#xff1a;一段封装好的待运行的代码或可执行文件&#xff0c;是静态的&#xff0c;会占用磁盘空间 单道与多道程序 单道&#xff1a;程序一个一个…

[NAND Flash 2.1] NAND Flash 闪存改变了现代生活

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 1989年NAND闪存面世了&#xff0c;它曾经且正在改变了我们的日常生活。 NAND 闪存发明之所以伟大&#xff0c;是因为&#xff0c…

Hello World

世界上最著名的程序 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get("/hello/{name}") async def say_hello(name: str):return {"message": f"…

Vue2与Vue3的语法对比

Vue2与Vue3的语法对比 Vue.js是一款流行的JavaScript框架&#xff0c;通过它可以更加轻松地构建Web用户界面。随着Vue.js的不断发展&#xff0c;Vue2的语法已经在很多应用中得到了广泛应用。而Vue3于2020年正式发布&#xff0c;带来了许多新的特性和改进&#xff0c;同时也带来…

D. In Love

贪心&#xff0c;维护最靠左的右端点以及最靠右的左端点 // Problem: D. In Love // Contest: Codeforces - Codeforces Round 905 (Div. 3) // URL: https://codeforces.com/contest/1883/problem/D // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Edi…

一:C语言常见概念

一&#xff1a;C语言常见概念 1.认识C语言&#xff1a; ​ C语言是人和计算机交流的语言 ​ C语言是一门面向过程的语言&#xff0c;而C&#xff0c;Java&#xff0c;Python等是一门面向对象的语言 ​ 软件开发&#xff08;项目&#xff09;&#xff1a;面向过程面向对象 …

芯片半导体科普

我们在日常工作和生活中&#xff0c;经常会使用到各种各样的电子或电器产品&#xff0c;例如电脑、手机、电视、冰箱、洗衣机等。 这些产品&#xff0c;如果我们把它拆开&#xff0c;都会看到类似下面这样的一块绿色板子。 有时候是蓝色或黑色的 大家都知道&#xff0c;这个绿…

Android开发之横屏模式布局

创建一个同名的layout文件 Android Studio会创建res/layout-land目录&#xff0c;并放入一个名为activity_main.xml的新布局文件中。要查看新建文件和文件夹&#xff0c;可把项目工具窗口切换至Project视角模式&#xff1b;要查看文件汇总&#xff0c;请切回Android视角模式。…

基于jsp+servlet+mybatis的简易在线选课系统

目录 一.数据库 1.数据库和表的创建 2.数据插入 二.代码实现 1.pojo类 &#xff08;1&#xff09;Course &#xff08;2&#xff09;User &#xff08;3&#xff09;Elective 2.mapper接口 &#xff08;1&#xff09;UserMapper &#xff08;2&#xff09;ElectiveMap…

Park Unpark

文章目录 当先调用park时&#xff1a;如果_counter0&#xff0c;这时候该线程阻塞&#xff0c;进入_cond阻塞&#xff0c;之后Unpark设置_counter为1后停止阻塞 当先调用Unpark时&#xff1a;此时先将_counter设置为1&#xff0c;当后面出现park时一判断_counter为1&#xff0c…

IntelliJ IDEA 之初体验

文章目录 第一步&#xff1a;下载与安装 IntelliJ IDEA1&#xff09;官网下载2&#xff09;选择那种安装包3&#xff09;开始下载4&#xff09;解压 第二步&#xff1a;启动 IntelliJ IDEA第三步&#xff1a;创建第一个 Java 项目第四步&#xff1a;运行第一个 Java 程序1&…

Java注册并监听全局快捷键

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

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我&#xff0c;他和同事&#xff08;c端&#xff09;协商了一个协议&#xff0c;如果使…

http和https的区别有哪些

目录 HTTP&#xff08;HyperText Transfer Protocol&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; 区别与优势 应用场景 未来趋势 当我们浏览互联网时&#xff0c;我们经常听到两个常用的协议&#xff1a;HTTP&#xff08;HyperText Tra…

【LeetCode刷题-链表】--92.反转链表II

92.反转链表II /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ cla…

项目中使用之Maven BOM

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 工具教程 ✨特色专栏&#xff1a; MyS…

MYSQL全语法速查(含示例)

文章目录 1.从简单的查询开始查找所有记录(SELECT *)查找记录中的所有登录名(SELECT)查找登录名为admin的密码(WHERE)查找电话号码非空的记录(IS NOT NULL)查找所在城市为北京或者用户名字是李四的记录(OR)查找所在城市为北京并且用户名字是张三的记录(AND)查找用户名字是李四或…