# encoding:utf-8
import numpy as np
import matplotlib.pylab as plt '''
随机行走问题
0 - 1 - 2 - 3 - 4 - 5 - 6
e s e
0终点r为0. 6终点r为1
中间每个选择r为0 策略 [-1, 1] 每种选择0.5, -1向左,1向右
这个策略下,理论上数字越大回报越高
''' stats = range(7)
start = 3
end = [0, 6]
actions = [-1, 1] r = 1 # 衰减因子
alpha = 0.5 # 学习率
echos = [5, 10, 50, 100, 500, 1000, 10000] def choose_act(stat):
# 策略
if np.random.rand() > 0.5:
return 1
else:
return -1 v = np.zeros([len(stats)]) for i in echos:
for j in range(i):
act = choose_act(start)
stat_ = start + act if stat_ in end:
if stat_ == 6:
v[start] += alpha * (1 + v[stat_] - v[start])
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6)
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6) plt.plot(v[1:-1])
plt.text(stats[-4], v[-3], j+1) plt.xlabel('state')
plt.ylabel('v')
plt.text(1, 0.8, 'alpha = %s'%alpha)
plt.show()

可以看到 随着学习率的增大,效果越来越好,当学习率为0.5时,已经明显过拟合了

这个是单步的,书上是单回合的,所以不同,后续有空会更新代码

# encoding:utf-8
from __future__ import division
import numpy as np
import matplotlib.pylab as plt stats = range(7)
end = [0, 6]
actions = [-1, 1]
r = 1 # 衰减因子 def choose_act(stat):
# 策略
if np.random.rand() > 0.5:
return 1
else:
return -1 v_t = [0, 1/6, 1/3, 1/2, 2/3, 5/6, 0]
alpha_td = [0.1, 0.15, 0.2] # 学习率
alpha_mc = [0.01, 0.02, 0.04]
for c in range(3):
# TD
alpha = alpha_td[c]
# v = np.random.rand(len(stats))
# v = np.zeros(len(stats))
v = [0.2] * len(stats)
errors = []
start = 3 for j in range(100):
act = choose_act(start)
stat_ = start + act if stat_ in end:
if stat_ == 6:
v[start] += alpha * (1 + v[stat_] - v[start])
else:
v[start] += alpha * (v[stat_] - v[start])
start = np.random.randint(1,6)
else:
v[start] += alpha * (v[stat_] - v[start])
start = stat_ # np.random.randint(1,6) error = np.sqrt(sum([pow(value - v_t[index], 2) for index, value in enumerate(v)]))
errors.append(error) plt.plot(range(100), errors)
index = np.random.randint(40,100)
plt.text(index-3, errors[index], 'alpha_td = %s'%alpha) # MC
alpha = alpha_mc[c]
# v_mc = np.random.rand(len(stats))
# v_mc = np.zeros(len(stats))
v_mc = [0.2] * len(stats)
count_mc = np.zeros(len(stats))
errors = []
for j in range(100):
process = []
start = 3 # np.random.randint(1, 6)
while True:
if start in end:
process.append([start])
break
act = choose_act(start)
if start == 5 and act == 1:
r = 1
else:
r = 0
process.append([start, act, r])
start = start + act T = len(process[:-1])
s_all = [i[0] for i in process[:-1]]
s_dealed = []
for k in range(T):
sar = process[k]
s = sar[0]
if s in s_dealed:continue # first visit
t = s_all.index(s) # 该s 首次出现的位置
num = s_all.count(s) # 该s 总共出现的次数
r_all = sum([i[2] for i in process[t:-1]]) / num
v_mc[s] += alpha * (r_all - v_mc[s])
# v_mc[s] = (v_mc[s] * count_mc[s] + r_all) / (count_mc[s] + 1)
# count_mc[s] += 1 s_dealed.append(s)
error = np.sqrt(sum([pow(value - v_t[index], 2) for index, value in enumerate(v_mc)]))
errors.append(error)
plt.plot(range(100), errors, '.')
index = np.random.randint(40,100)
plt.text(index-3, errors[index], 'alpha_mc = %s'%alpha) plt.xlabel('echo')
plt.ylabel('mse')
plt.show()

随机行走有个特殊性:两个终点,有一个终点奖励为0,也就是说在前几个回合中,单步更新的TD如果一开始向左走,需要好多步才能到达右边终点,而MC由于是整个回合,要么左,要么右,先到右边终点的概率要大得多,所以,前几步MC收敛明显比TD快

但是从总体来看,TD收敛比MC要快,而且收敛值要小,故TD效率更高

上述代码的问题

1.TD 是单步计算MSE,而MC是单回合计算MSE,比较的前提不同

2.在计算MSE时,只是计算了一次评估的误差,并不是平均误差

更新代码

强化学习6-MC与TD的比较-实战的更多相关文章

  1. 强化学习4-时序差分TD

    之前讲到强化学习在不基于模型时可以用蒙特卡罗方法求解,但是蒙特卡罗方法需要在每次采样时生产完整序列,而在现实中,我们很可能无法生成完整序列,那么又该如何解决这类强化学习问题呢? 由贝尔曼方程 vπ(s ...

  2. 【强化学习RL】model-free的prediction和control —— MC,TD(λ),SARSA,Q-learning等

    本系列强化学习内容来源自对David Silver课程的学习 课程链接http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html 本文介绍了在m ...

  3. 强化学习(五)用时序差分法(TD)求解

    在强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列.如果我 ...

  4. 【转载】 强化学习(五)用时序差分法(TD)求解

    原文地址: https://www.cnblogs.com/pinard/p/9529828.html ------------------------------------------------ ...

  5. 强化学习 3—— 使用蒙特卡洛采样法(MC)解决无模型预测与控制问题

    一.问题引入 回顾上篇强化学习 2 -- 用动态规划求解 MDP我们使用策略迭代和价值迭代来求解MDP问题 1.策略迭代过程: 1.评估价值 (Evaluate) \[v_{i}(s) = \sum_ ...

  6. 强化学习(四)用蒙特卡罗法(MC)求解

    在强化学习(三)用动态规划(DP)求解中,我们讨论了用动态规划来求解强化学习预测问题和控制问题的方法.但是由于动态规划法需要在每一次回溯更新某一个状态的价值时,回溯到该状态的所有可能的后续状态.导致对 ...

  7. 强化学习-时序差分算法(TD)和SARAS法

    1. 前言 我们前面介绍了第一个Model Free的模型蒙特卡洛算法.蒙特卡罗法在估计价值时使用了完整序列的长期回报.而且蒙特卡洛法有较大的方差,模型不是很稳定.本节我们介绍时序差分法,时序差分法不 ...

  8. 【转载】 强化学习(四)用蒙特卡罗法(MC)求解

    原文地址: https://www.cnblogs.com/pinard/p/9492980.html ------------------------------------------------ ...

  9. 强化学习3-蒙特卡罗MC

    之前讲到强化学习可以用马尔科夫决策过程来描述,通常情况下,马尔科夫需要知道  {S A P R γ},γ是衰减因子,那为什么还需要蒙特卡罗呢? 首先什么是蒙特卡罗? 蒙特卡罗实际上是一座赌城的名字,蒙 ...

  10. 【整理】强化学习与MDP

    [入门,来自wiki] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...

随机推荐

  1. CentOS优化

    一.CentOS6.x优化 #.更改yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup ...

  2. POJ-2955 Brackets(括号匹配问题)

    题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...

  3. selenium chrome 自动加载flash

    #coding:utf-8from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom ...

  4. Spring Framework启动详解

    之前一直对Spring启动的过程很迷糊,所以这次国庆梳理一下. Spring启动一言以蔽之:创建一个根应用上下文.(因为其他的所有的应用上下文都可以通过各种方式继承它) (一)了解应用上下文 Spri ...

  5. Linux下查看相应端口的进程

    1)查找被占用的端口:netstat -tln | grep 7777 2)查看被占用端口的PID:lsof -i:7777 3)禁用使用kill -9 PID来禁用端口进程

  6. Android(二)——frida安装教程

    pc端下载:pip install frida 之后就是在手机端或者模拟器下载对应版本的server 在手机或者模拟器上查看cpu版本型号,就根据这个来下载server system/build.pr ...

  7. python-flask-script定制manage命令

    安装: pip3 install flask-script #!/usr/bin/env python # -*- coding:utf-8 -*- from flask_script import ...

  8. leetcode-algorithms-28 Implement strStr()

    leetcode-algorithms-28 Implement strStr() mplement strStr(). Return the index of the first occurrenc ...

  9. Leetcode 1002. 查找常用字符

    1002. 查找常用字符  显示英文描述 我的提交返回竞赛   用户通过次数301 用户尝试次数324 通过次数303 提交次数480 题目难度Easy 给定仅有小写字母组成的字符串数组 A,返回列表 ...

  10. virtualbox 中centOS在不能ssh

    这个重要跟虚拟机的网络设置有关系.废话不多说. 针对一个网卡的形式.可以如下进行配置 1.网络-- 连接方式还选择“网络地址转换(NAT)” 其他不变,展开高级,设置端口转发  主机IP设为本机IP, ...