K-Arms Bandit Epsilon-Greedy Policy

我一直在尝试实现强化学习书籍中的练习2.5

我根据这个伪代码版本编写了这段代码

enter image description here

class k_arm:    def __init__(self, iter, method="incrementally"):        # self.iter 占位符        self.iter = iter        self.k = 10        self.eps = .1                # 这里是 Q(a) 和 N(a)        self.qStar = np.zeros(self.k)        self.n = np.zeros(self.k)                # 方法仅用于实验不同的函数        self.method = method            def pull(self):                # 以 (1 - eps) 的概率选择 argmax(Q(A)) 动作        eps = np.random.uniform(0, 1, 1)        if eps < self.eps or self.qStar.argmax() == 0:            a = np.random.randint(10)        else: a = self.qStar.argmax()                # R bandit(A)        r = np.random.normal(0, 0.01, 1)                # N(A) <- N(A) + 1        self.n[a] += 1                # Q(A) <- Q(A) i / (N(A)) * (R - Q(A))        if self.method == "incrementally":            self.qStar[a] +=  (r - self.qStar[a]) / self.n[a]             return self.qStar[a]`
iter = 1000rewards = np.zeros(iter)c = k_arm(iter, method="incrementally")for i in range(iter):        k = c.pull()    rewards[i] = k

我得到的结果是这样的

enter image description here

而我期望的结果是这样的。

enter image description here

我一直在尝试理解我哪里出错了,但没能找到原因。


回答:

你的平均奖励约为0,因为这是正确的估计。你的奖励函数定义为:

 # R bandit(A) r = np.random.normal(0, 0.01, 1)

这意味着你的奖励分布的期望值为0,标准差为0.01。书中作者使用了不同的奖励函数。虽然这仍然存在根本性问题,但如果你将代码更改为

 # R bandit(A) r = np.random.normal(1.25, 0.01, 1)

你可以获得类似的奖励。给每个匪徒设置不同的奖励函数是有意义的,否则所有动作值都将相同。所以你真正应该做的是从k个具有不同期望值的不同分布中抽样。否则动作选择将毫无意义。在你的init函数中添加以下内容:

self.expected_vals = np.random.uniform(0, 2, self.k)

并更改奖励的计算方式,使其依赖于动作:

r = np.random.uniform(self.expected_vals[a], 0.5, 1)

我还将方差增加到0.5,因为0.01在匪徒的上下文中基本上是无意义的方差。如果你的代理工作正常,他的平均奖励应该大约等于np.max(self.expected_vals)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注