强化学习 | 强化学习基础知识(图解)

强化学习是机器学习的一个领域。它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来找到在特定情况下应该采取的最佳行为或路径。强化学习与监督学习的不同之处在于,在监督学习中,训练数据具有答案键,因此模型本身使用正确答案进行训练,而在强化学习中,没有答案,但强化代理决定如何执行给定的任务。在没有训练数据集的情况下,它必然会从它的经验中学习。

强化学习(RL)是一门决策科学。它是关于学习环境中的最佳行为以获得最大的奖励。在 RL 中,数据是从使用试错法的机器学习系统中累积的。数据不是在有监督或无监督机器学习中找到的输入的一部分。

强化学习使用从结果中学习并决定下一步要采取的操作的算法。在每个操作之后,算法都会收到反馈,帮助它确定它所做的选择是正确的、中立的还是不正确的。对于必须在没有人工指导的情况下做出大量小决策的自动化系统来说,这是一个很好的技术。

强化学习是一种自主的自学系统,本质上是通过反复试验来学习的。它执行旨在最大化奖励的行动,或者换句话说,它是边做边学,以达到最佳结果。

1.理论基础

强化学习(Reinforcement Learning)的基本概念从马尔科夫决策过程(MDP)出发。MDP 是指在状态传播过程中遵循马可夫属性的过程。

2.强化学习算法:使用 Q 学习实现 Python

环境:jupyter lab

步骤 1:导入所需的库

#步骤 1:导入所需的库
import numpy as np 
import pylab as pl 
import networkx as nx 

步骤 2:定义和可视化图形

# 步骤 2:定义和可视化图形
edges = [(0, 1), (1, 5), (5, 6), (5, 4), (1, 2), (1, 3), (9, 10), (2, 4), (0, 6), (6, 7), (8, 9), (7, 8), (1, 7), (3, 9)] # 
goal = 10
G = nx.Graph() 
G.add_edges_from(edges) 
pos = nx.spring_layout(G) 
nx.draw_networkx_nodes(G, pos) 
nx.draw_networkx_edges(G, pos) 
nx.draw_networkx_labels(G, pos) 
pl.show() 

#上面的图表在代码的复制上可能看起来不一样,因为python中的networkx库从给定的边缘生成一个随机图。

步骤 3:为机器人定义系统的奖励

# 步骤 3:为机器人定义系统的奖励
MATRIX_SIZE = 11
M = np.matrix(np.ones(shape =(MATRIX_SIZE, MATRIX_SIZE))) 
M *= -1for point in edges: print(point) if point[1] == goal: M[point] = 100else: M[point] = 0if point[0] == goal: M[point[::-1]] = 100else: M[point[::-1]]= 0# reverse of point M[goal, goal]= 100
print(M) 
# add goal point round trip 

步骤 4:定义一些要在训练中使用的实用程序函数

# 步骤 4:定义一些要在训练中使用的实用程序函数
Q = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) gamma = 0.75
# learning parameter 
initial_state = 1# Determines the available actions for a given state 
def available_actions(state): current_state_row = M[state, ] available_action = np.where(current_state_row >= 0)[1] return available_action available_action = available_actions(initial_state) # Chooses one of the available actions at random 
def sample_next_action(available_actions_range): next_action = int(np.random.choice(available_action, 1)) return next_action action = sample_next_action(available_action) def update(current_state, action, gamma): max_index = np.where(Q[action, ] == np.max(Q[action, ]))[1] if max_index.shape[0] > 1: max_index = int(np.random.choice(max_index, size = 1)) else: max_index = int(max_index) max_value = Q[action, max_index] Q[current_state, action] = M[current_state, action] + gamma * max_value if (np.max(Q) > 0): return(np.sum(Q / np.max(Q)*100)) else: return (0) 
# Updates the Q-Matrix according to the path chosen update(initial_state, action, gamma) 

步骤 5:使用 Q 矩阵训练和评估机器人

# 第 5 步:使用 Q 矩阵训练和评估机器人
scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) scores.append(score) # print("Trained Q matrix:") 
# print(Q / np.max(Q)*100) 
# You can uncomment the above two lines to view the trained Q matrix # Testing 
current_state = 0
steps = [current_state] while current_state != 10: next_step_index = np.where(Q[current_state, ] == np.max(Q[current_state, ]))[1] if next_step_index.shape[0] > 1: next_step_index = int(np.random.choice(next_step_index, size = 1)) else: next_step_index = int(next_step_index) steps.append(next_step_index) current_state = next_step_index print("Most efficient path:") 
print(steps) pl.plot(scores) 
pl.xlabel('No of iterations') 
pl.ylabel('Reward gained') 
pl.show() 

步骤 6 :使用环境线索定义和可视化新图形

# 第 6 步:使用环境线索定义和可视化新图形
# Defining the locations of the police and the drug traces 
police = [2, 4, 5] 
drug_traces = [3, 8, 9] G = nx.Graph() 
G.add_edges_from(edges) 
mapping = {0:'0 - Detective', 1:'1', 2:'2 - Police', 3:'3 - Drug traces', 4:'4 - Police', 5:'5 - Police', 6:'6', 7:'7', 8:'Drug traces', 9:'9 - Drug traces', 10:'10 - Drug racket location'} H = nx.relabel_nodes(G, mapping) 
pos = nx.spring_layout(H) 
#nx.draw_networkx_nodes(H, pos, node_size =[200, 200, 200, 200, 200, 200, 200, 200]) 
nx.draw_networkx_nodes(H, pos)
nx.draw_networkx_edges(H, pos) 
nx.draw_networkx_labels(H, pos) 
pl.show() 

上图可能看起来与上一张图略有不同,但实际上它们是相同的图表。这是由于networkx库随机放置节点。

步骤 7:为训练过程定义一些实用程序函数

# 步骤 7:为训练过程定义一些实用程序函数
Q = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
env_police = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
env_drugs = np.matrix(np.zeros([MATRIX_SIZE, MATRIX_SIZE])) 
initial_state = 1# Same as above 
def available_actions(state): current_state_row = M[state, ] av_action = np.where(current_state_row >= 0)[1] return av_action # Same as above 
def sample_next_action(available_actions_range): next_action = int(np.random.choice(available_action, 1)) return next_action # Exploring the environment 
def collect_environmental_data(action): found = [] if action in police: found.append('p') if action in drug_traces: found.append('d') return (found) available_action = available_actions(initial_state) 
action = sample_next_action(available_action) def update(current_state, action, gamma): max_index = np.where(Q[action, ] == np.max(Q[action, ]))[1] if max_index.shape[0] > 1: max_index = int(np.random.choice(max_index, size = 1)) else: max_index = int(max_index) max_value = Q[action, max_index] Q[current_state, action] = M[current_state, action] + gamma * max_value environment = collect_environmental_data(action) if 'p' in environment: env_police[current_state, action] += 1if 'd' in environment: env_drugs[current_state, action] += 1if (np.max(Q) > 0): return(np.sum(Q / np.max(Q)*100)) else: return (0) 
# Same as above 
update(initial_state, action, gamma) def available_actions_with_env_help(state): current_state_row = M[state, ] av_action = np.where(current_state_row >= 0)[1] # if there are multiple routes, dis-favor anything negative env_pos_row = env_matrix_snap[state, av_action] if (np.sum(env_pos_row < 0)): # can we remove the negative directions from av_act? temp_av_action = av_action[np.array(env_pos_row)[0]>= 0] if len(temp_av_action) > 0: av_action = temp_av_action return av_action 
# Determines the available actions according to the environment 

步骤 8:可视化环境矩阵

# 步骤 8:可视化环境矩阵
scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) # print environmental matrices 
print('Police Found') 
print(env_police) 
print('') 
print('Drug traces Found') 
print(env_drugs) 

步骤 9:训练和评估模型

scores = [] 
for i in range(1000): current_state = np.random.randint(0, int(Q.shape[0])) available_action = available_actions_with_env_help(current_state) action = sample_next_action(available_action) score = update(current_state, action, gamma) scores.append(score) pl.plot(scores) 
pl.xlabel('Number of iterations') 
pl.ylabel('Reward gained') 
pl.show() 

参考文献

【1】Part 1: Key Concepts in RL — Spinning Up documentation (openai.com)

【2】 BartoSutton.pdf (cmu.edu)

【3】 Reinforcement learning - GeeksforGeeks

【4】ML | Reinforcement Learning Algorithm : Python Implementation using Q-learning - GeeksforGeeks 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ从0到1完整学习笔记一:《基础篇》

目录 启篇 一、初识MQ 1.1 同步调用 1.2异步调用 1.3 技术选型 二、RabbitMQ 架构 2.2 收发消息 2.2.1 交换机 2.2.2 队列 2.2.3 绑定关系 2.2.4 发送消息 2.3 数据隔离 2.3.1 用户管理 2.3.2 virtual host 三、SpringAMQP 3.1 案例入门 3.1.1 导入依赖 3.1.2 消息发送 3.1.2 消…

图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

threejs(2)-Geometry进阶详解

一、全面讲解UV与应用 在本节中&#xff0c;我们将讨论Three.js中的UV映射&#xff0c;包括UV映射的概念、与顶点位置的关系和区别以及如何在Geometry中设置UV坐标。我们将使用BufferGeometry进行示例说明。 颜色对应 什么是UV映射&#xff1f; UV映射是一种将二维纹理映…

Ubuntu系统如何进行网络连接-连接电脑局域网-物联网开发-Ubuntu系统维护

一、前言 在Ubuntu系统的维护中&#xff0c;我们常常需要对VMware中的Ubuntu虚拟机配置网络连接&#xff0c;以连接服务器下载或安装软件包以及进行网络通信等。 基于上述问题&#xff0c;本文将着重分享Ubuntu配置网络链接的若干方法。 二、网络连接模式 打开VM&#xff0c;右…

【Java 进阶篇】JavaScript 动态表格案例

在这篇博客中&#xff0c;我们将深入了解JavaScript如何创建和操作动态表格。我们将从头开始构建一个动态表格&#xff0c;并逐步添加各种功能&#xff0c;使其能够实现数据的添加、删除和编辑。这个示例将有助于理解如何在前端开发中使用JavaScript创建交互性强大的表格。 准…

网站如何优化加速,让网站降低延迟

优化网站架构 精简页面加载过程&#xff1a;通过消除冗余代码和不必要的图像&#xff0c;并采用CDN资源分发&#xff0c;以减少加载时间。 精心规划内容架构&#xff1a;通过使用恰当的标题和描述&#xff0c;使搜索引擎能够快速理解页面的内涵。 选择性能出众的前端框架&…

RT-Thread学习笔记(三):线程管理

线程管理 线程管理相关概念什么是时间片轮转调度器锁线程运行机制线程的五种状态 动态和静态创建线程区别动态和静态创建线程优缺点RT-Thread动态线程管理函数动态创建线程动态删除线程 RT-Thread静态线程管理函数静态创建线程 线程其他操作线程启动线程延时获得当前执行的线程…

Java并发面试题:(六)悲观锁和乐观锁和Java内存模型和CAS原理

悲观锁和乐观锁的区别 什么是悲观锁&#xff1f; 基本上我们理解的操作前对资源加锁&#xff0c;操作完后释放锁。说的都是悲观锁。悲观锁认为所有的资源都是不安全的&#xff0c;随时会被其他线程操作、更改。所以操作资源前一定要加一把锁、防止其他线程访问。 什么是乐观锁&…

【23种设计模式】装饰器模式

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

Excel·VBA单元格区域数据对比差异标记颜色

之前的一篇博客《ExcelVBA单元格重复值标记颜色》&#xff0c;是对重复的整行标记颜色 而本文是按行对比2个单元格区域的数据&#xff0c;并对有差异的区域&#xff08;一个单元格区域有的&#xff0c;而另一个单元格区域没有的&#xff09;标记颜色&#xff0c;且只要存在任意…

单链表经典OJ题:合并有序链表

目录 ​编辑 题目&#xff1a; 图例&#xff1a; 分析&#xff1a; 解法&#xff1a; 解法1: 解法2: 解法的对比&#xff1a; 解法2&#xff1a; 注意事项&#xff1a; 图例&#xff1a; 代码演示&#xff1a; 代码分析&#xff1a; 代码缺点&#xff1a; 重复…

[MySQL]BLOB/TEXT column ‘xxx‘ used in key specification without a key length

报错信息&#xff1a; SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column xxx used in key specification without a key length 原因&#xff1a; MySQL的唯一索引不支持text类型的字段&#xff01;

C++初阶-类和对象(上)

类和对象&#xff08;上&#xff09; 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装访问限定符封装 五、类的作用域六、类的实例化七、类的对象大小的计算如何计算类对象的大小类对象的存储方式猜测 八、类成员函数的this指针this指针的引出…

网站如何才能不被黑,如何做好网络安全

当企业网站受到攻击时&#xff0c;首页文件可能被篡改&#xff0c;百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而&#xff0c;许多企业缺乏建立完善的网站安全防护体系的知识。因此&#xff0c;需要专业的网站安全公司来提供相应的保护措施。今…

番外8.1 配置+管理文件系统

Task01: Linux 文件系统结构&#xff1b; 可以进行Linux操作系统的文件权限管理与方式切换&#xff0c;可以应用磁盘与文件权限管理工具&#xff1b; 01&#xff1a;常见文件系统类型&#xff08;Ext4[rhel6默认文件管理系统], 存储容量1 EB1073741824 GB; XFS[rhel 7/8默认的文…

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP&#xff08;One-Time Password&#xff09;是一种用于身份验证的协议&#xff0c;它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录&#xff0c;以下是一些实现步骤&#xff1a; 1、安装Radius服务器 首先需要安装Radius服务器…

【量化交易笔记】9.量化投资理论及一般流程

前言 在第7篇文章中指出&#xff0c;量化交易的主要有两方面应用&#xff0c;基于的数据主要是两个类型&#xff0c;如前面讲的用之前的数据预测股价&#xff0c;这类数据我们可归为纵向研究数据&#xff0c;又称时间序列数据&#xff0c;另一类是横截面数据&#xff0c;以称截…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接&#xff1a;武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链&#xff1a; • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

Android MediaMetadataRetriever setDataSource failed: status = 0xFFFFFFEA

Android MediaMetadataRetriever setDataSource抛错&#xff1a; java.lang.RuntimeException: setDataSource failed: status 0xFFFFFFEA 原因是 setDataSource(String path) path指向的视频文件大小为0或者是破损视频资源。 Android AppGlideModule,DataFetcher,ModelLoad…

环境变量【使用命令行参数引出环境变量】

前提&#xff1a;命令行参数 大家在写C/C程序的时候肯定见过下面这种情况&#xff1a; main函数里面携带的参数&#xff0c;平常写代码过程中很少用到这两个参数&#xff0c;接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么&#xff0c;也不知道这个a…