Scikit-learn强化学习代码批注及相关练习

这篇具有很好参考价值的文章主要介绍了Scikit-learn强化学习代码批注及相关练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、游戏介绍

木棒每保持平衡1个时间步,就得到1分。每一场游戏的最高得分为200分每一场游戏的结束条件为木棒倾斜角度大于41.8°或者已经达到200分。最终获胜条件为最近100场游戏的平均得分高于195。代码中env.step(),的返回值就分别代表了。观测Observation:当前step执行后,环境的观测。奖励Reward:执行上一步动作(action)后,智能体(agent)获得的奖励,不同的环境中奖励值变化范围也有不同,但是强化学习的目标就是总奖励值最大。完成Done表示是否需要将环境重置env.reset,大多数情况下,当Done为True时,就表明当前回合(episode)结束。信息Info:针对调试过程的诊断信息,在标准的智能体仿真评估当中不会使用到这个info。
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习

二、代码批注

import gym
import numpy as np

env = gym.make('CartPole-v0')

max_number_of_steps = 200   # 每一场游戏的最高得分
#---------获胜的条件是最近100场平均得分高于195-------------
goal_average_steps = 195
num_consecutive_iterations = 100
#----------------------------------------------------------
num_episodes = 5000 # 共进行5000场游戏
last_time_steps = np.zeros(num_consecutive_iterations)  # 只存储最近100场的得分(可以理解为是一个容量为100的栈)

# q_table是一个256*2的二维数组
# 离散化后的状态共有4^4=256中可能的取值,每种状态会对应一个行动
# q_table[s][a]就是当状态为s时作出行动a的有利程度评价值
# 我们的AI模型要训练学习的就是这个映射关系表
q_table = np.random.uniform(low=-1, high=1, size=(4 ** 4, env.action_space.n))

# 分箱处理函数,把[clip_min,clip_max]区间平均分为num段,位于i段区间的特征值x会被离散化为i
def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

# 离散化处理,将由4个连续特征值组成的状态矢量转换为一个0~~255的整数离散值
def digitize_state(observation):
    # 将矢量打散回4个连续特征值
    cart_pos, cart_v, pole_angle, pole_v = observation
    # 分别对各个连续特征值进行离散化(分箱处理)
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    # 将4个离散值再组合为一个离散值,作为最终结果
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

# 根据本次的行动及其反馈(下一个时间步的状态),返回下一次的最佳行动
def get_action(state, action, observation, reward):
    next_state = digitize_state(observation)    # 获取下一个时间步的状态,并将其离散化
    next_action = np.argmax(q_table[next_state])    # 查表得到最佳行动
    #-------------------------------------训练学习,更新q_table----------------------------------
    alpha = 0.2     # 学习系数α
    gamma = 0.99    # 报酬衰减系数γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

def get_action2(state, action, observation, reward, episode):
    next_state = digitize_state(observation)
    epsilon = 0.2*(0.95**episode)   # ε-贪心策略中的ε
    if epsilon <= np.random.uniform(0, 1):
        next_action = np.argmax(q_table[next_state])
    else:
        next_action = np.random.choice([0, 1])
    #-------------------------------------训练学习,更新q_table----------------------------------
    alpha = 0.2     # 学习系数α
    gamma = 0.99    # 报酬衰减系数γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

# 重复进行一场场的游戏
for episode in range(num_episodes):
    observation = env.reset()   # 初始化本场游戏的环境
    state = digitize_state(observation)     # 获取初始状态值
    action = np.argmax(q_table[state])      # 根据状态值作出行动决策

    episode_reward = 0
    # 一场游戏分为一个个时间步
    for t in range(max_number_of_steps):
        env.render()    # 更新并渲染游戏画面
        observation, reward, done, info = env.step(action)  # 获取本次行动的反馈结果
        print(reward)
        if done:
            reward = -200
        action, state = get_action2(state, action, observation, reward, episode)  # 作出下一次行动的决策
        episode_reward += reward
        if done:
            # print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))  # 更新最近100场游戏的得分stack
            break
            # 如果最近100场平均得分高于195
        if (last_time_steps.mean() >= goal_average_steps):
            # print('Episode %d train agent successfuly!' % episode)
            break

print('Failed!')

三、问题回答

代码中两个策略get_action和get_action2分别对应哪个算法?去除第73-74行游戏结束的reward值赋值,结果有什么变化?

get_action:Q-learning
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习
上面的α被称为学习系数,γ被称为报酬衰减系数,rt为时间步为t时得到的报酬。如果在时间步t时,状态为st,我们采取的行动为at,本次行动的有利程度记为Q(st,at)。
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习
get_action2:Q-learning +ε-贪心策略
在get_action2中加入了贪心的策略。以ε的概率以均匀概率随机选一个方向进行移动;以1-ε的概率选择目前为止探索到的对于当前状态的最佳行动方向进行移动。
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习
如果取去掉reward,得不到反馈。在main函数中的开头,这里的意思其实就是每次获得一个最好的action,然后计算,用更好的去填补他。这里evn.step每次返回的reward都是1,if done其实就代表了游戏被迫结束,如果不减值,那么相当于对模型没有反馈,模型会每次会找最好的值,但呢个最好的值是随机算出来的,最终的结果会卡在一个比较低的分数附近上上下下。
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习
Scikit-learn强化学习代码批注及相关练习,机器学习,scikit-learn,python,机器学习文章来源地址https://www.toymoban.com/news/detail-667725.html

到了这里,关于Scikit-learn强化学习代码批注及相关练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Scikit-Learn 和深度学习怎么选择

    大家好,今天我们要聊聊一个机器学习的话题:Scikit-Learn 和深度学习,到底哪一个更适合解决你的问题?我们先来看看这两种技术的异同点,然后再讲讲如何在实际问题中做出选择。 1.1 Scikit-Learn:传统机器学习的优秀代表 Scikit-Learn 是一个使用 Python 语言编写的开源机器学习

    2024年02月10日
    浏览(40)
  • 【机器学习笔记】 6 机器学习库Scikit-learn

    Scikit-learn是基于NumPy、 SciPy和 Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。 自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括 分类,回归,降维

    2024年02月20日
    浏览(44)
  • Python数据科学:Scikit-Learn机器学习

    Scikit-Learn使用的数据表示:二维网格数据表 鸢尾花数据集说明: sepal_length:萼片长度 sepal_width:萼片宽度 petal_length:花瓣长度 petal_width:花瓣宽度 species:鸢尾花类型,Iris-setosa(山鸢尾),Iris-versicolor(变色鸢尾),Iris-virginica(维吉尼亚鸢尾) df_iris.head() 样本:鸢尾花数据集矩阵,矩阵

    2024年02月21日
    浏览(56)
  • 探索 Scikit-learn:Python 机器学习初级篇

    Scikit-learn 是 Python 中最著名的机器学习库之一,它提供了大量实用的机器学习算法以及相关的工具,可以方便我们进行数据挖掘和数据分析。在这篇文章中,我们将介绍 Scikit-learn 的基本使用,包括如何导入数据、预处理数据、选择和训练模型,以及评估模型的性能。 在使用

    2024年02月17日
    浏览(44)
  • 机器学习算法实战(scikit-learn版本)---线性回归

    目录 文章目标: 1,导入库  2,导入数据集 3,缩放/归一化训练数据 4,创建并拟合回归模型 5,查看参数 6,预测 7,可视化  有一个开源的、商业上可用的机器学习工具包,叫做[scikit-learn](https://scikit-learn.org/stable/index.html)。这个工具包包含了你在本课程中要使用的许多算法的实

    2024年02月05日
    浏览(40)
  • Python机器学习:Scikit-learn库与应用

    当涉及到Python机器学习时,Scikit-learn是一个非常流行且功能强大的库。它提供了广泛的算法和工具,使得机器学习变得简单而高效。下面是一个简单的Scikit-learn库与应用示例,其中包括代码。 首先,确保你已经安装了Scikit-learn库。你可以使用pip命令来安装它: bash复制代码

    2024年02月19日
    浏览(50)
  • 使用Scikit-Learn实现多标签分类,助力机器学习

    大家好,在机器学习任务中,分类是一种监督学习方法,用于根据输入数据预测标签。例如,我们想要根据历史特征预测某人是否对销售优惠感兴趣,通过使用可用的训练数据训练机器学习模型,可以对输入数据执行分类任务。 平常会遇到一些经典分类任务,例如二元分类(

    2024年02月11日
    浏览(41)
  • 掌握 Scikit-Learn: Python 中的机器学习库入门

    机器学习 (Machine Learning) 是一个近年来频繁出现在科技新闻, 研究报告, 行业分析和实际应用中的热门领域. 机器学习 (Machine Learning) 正以前所未有的速度影响着我们的生活. 从智能音响的语音识别, 手机摄像头的人脸解锁, 到金融领域的评估, 医疗健康的预测分析. 机器学习的应

    2024年02月07日
    浏览(55)
  • 【100天精通Python】Day74:python机器学习的生态圈(numpy,scipy,scikit-learn等),库安装环境搭建(conda virtualenv), 以及入门代码示例

    目录  1 python 机器学习的生态圈        1.1 NumPy 和 SciPy: 1.2 Pandas: 1.3 Matplotlib 和 Seaborn: 1.4 Scikit-Learn: 1.5 TensorFlow 和 PyTorch: 1.6 Jupyter Notebooks: 1.7 NLTK(Natural Language Toolkit): 1.8 Statsmodels: 1.9 Virtualenv 和 Conda: (1)virtualenv  安装和使用 (2)conda安装和使用 1.10 Flask

    2024年02月03日
    浏览(66)
  • 【机器学习】scikit-learn机器学习中随机数种子的应用与重现

    随机数种子是为了能重现某一次实验生成的随机数而设立的,相同的随机数种子下,生成的随机数序列一样 一、随机数种子基础应用 在python中简单运用随机数种子 结果如下 可以看到out[6]之前加载了随机数种子1之后可以重现第一次随机数的生成结果 二、随机数种子在scikit

    2024年02月01日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包