初探强化学习:置信区上界解决多臂老虎机问题

强化学习(英语:Reinforcement learning,简称RL)是机器学习中的一个领域,**强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。**这个方法具有普适性,因此在其他许多领域都有研究,例如博弈论、控制论、运筹学、信息论、仿真优化、多主体系统学习、群体智能、统计学以及遗传算法。在运筹学和控制理论研究的语境下,强化学习被称作“近似动态规划”(approximate dynamic programming,ADP)。在最优控制理论中也有研究这个问题,虽然大部分的研究是关于最优解的存在和特性,并非是学习或者近似方面。在经济学和博弈论中,强化学习被用来解释在有限理性的条件下如何出现平衡。
机器学习问题中,环境通常被规范为马可夫决策过程(MDP),所以许多强化学习算法在这种情况下使用动态规划技巧。传统的技术和强化学习算法的主要区别是,后者不需要关于MDP的知识,而且针对无法找到确切方法的大规模MDP。
强化学习和标准的监督式学习之间的区别在于,它并不需要出现正确的输入/输出对,也不需要精确校正次优化的行为。强化学习更加专注于在线规划,需要在探索(在未知的领域)和遵从(现有知识)之间找到平衡。强化学习中的“探索-遵从”的交换,在多臂老虎机问题和有限MDP中研究得最多。 -----------(来自维基百科)

以上述多臂老虎机为例,我们假设有10台机器,每台机器的奖励分布情况不同。进行10000次游戏,如何选择机器才能达到最大收益?
为了简化问题,我们把奖励大于我们一次游戏投入,(即收益)记为得分1,否则记为0。(可能不是很恰当,不过作为说明的例子应该没问题)
为了训练,当然需要一个数据集,这里假设我们有一个模拟数据集(10000 * 10)。大致如下:
在这里插入图片描述
解释下这个模拟数据集如何看:假设我们进行了第一次游戏,即第0行,如果我们选择了机器编号为1,5,9则得分1,其他得分0,依次类推…
如果我们进行了随机选择,看下收益情况还有10000此游戏中每个机器选择的次数:

import pandas as pd
import numpy as np
dataset = pd.read_csv('Machine.csv')

import random
machine_selected = []  #用于存储每一轮游戏选择的机器。
final_score = 0    #用于存储第n轮之前的总得分。
for n in range(10000):
    machine_num = random.randrange(10)
    machine_selected.append(machine_num)
    score = dataset.values[n,machine_num]
    finnal_reword = finnal_score + score

import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.hist(machine_selected)
plt.xticks(np.arange(10),[1,2,3,4,5,6,7,8,9,10])
plt.xlabel('机器编号')
plt.ylabel('选择次数')
plt.show()

输出:
在这里插入图片描述
可以看到,最终我们的收益是1254,各个机器的选择次数也很平均,很符合我们的随机结果。


接下来看下强化学习的置信区间算法的结果:
import pandas as pd
import numpy as np
import math
dataset = pd.read_csv('Machine.csv')
number_of_selected = [0] * 10		#初始化每个机器的选择次数
sum_score = [0] * 10			#初始化每个机器的得分
machine_selected = []		#记录10000次游戏的每一次机器选择
total_score = 0		#初始化总得分
'''
这里需要解释下下面的代码。对于每一个机器的第一次选择,由于我们还未进行探索,所以需要先遍历每个机器一次。
实现如下,先设置一个很大的置信区上界(max_UB),这里是10的300次方。
对于每个机器的第一次运行,我们进行赋值UB= 1e300从而运行了每一台机器,
我们的条件UB>max_UB不成立,machine = 0,也就是第一台机器,而后我们有了对每台机器的第一次探索信息
接下来的遍历,每个number_of_selected[i] > 0都是成立的,因此进入该条件下的代码,每次选择了机器,
计算该机器的置信区间上界,比较与其他几个机器的上界,选出最高的那个进行新一轮游戏。
'''
for n in range(0,10000):
    machine = 0
    max_UB = 0
    for i in range(0,10):
        if number_of_selected[i] > 0:
            average = sum_score[i] / number_of_selected[i]
            delta = math.sqrt(3 / 2 * math.log(n+1) / number_of_selected[i])
            UB  = average + delta
        else:
            UB = 1e300
        if UB > max_UB:
            max_UB = UB
            machine = i
    machine_selected.append(machine)
    score = dataset.values[n,machine] 		#根据模拟数据,索引得到得分值。
    number_of_selected[machine] = number_of_selected[machine] + 1
    sum_score[machine] = sum_score[machine] + score
    total_score = total_score + score
print('最终得分是 : ' + str(total_score))

import matplotlib.pyplot as plt
plt.figure(figsize= (10,6))
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.hist(machine_selected)
plt.xticks(np.arange(10),[1,2,3,4,5,6,7,8,9,10])
plt.title('置信区间上界算法的结果',fontsize = 20)
plt.xlabel('机器编号',fontsize = 15)
plt.ylabel('选择次数',fontsize = 15)
plt.show()

输出:
在这里插入图片描述
可以看到相比随机进行游戏,我们的收益提升还是非常明显的,总得分是2178,同时可以看到5号机器被选择的次数最多,从中可以得知,5号机器相比其它几个机器对玩家还是挺友好的…
后续会视情况可能会写篇文章大致介绍下置信区间上界算法的过程。


http://www.niftyadmin.cn/n/1375638.html

相关文章

scrapyd远程连接配置

安装scrapyd: pip install scrapyd 默认scrapyd启动是通过scrapyd就可以直接启动,bind绑定的ip地址是127.0.0.1端口是:6800,这里为了其他主机可以访问,需将ip地址设置为0.0.0.0 即将 bind_address 127.0.0.1 改为 bin…

一个简单的自然语言处理例子

例子是我学习的教程的一个例子,收集了一些客户对于饭店的评价,目标是将他们进行分类,分成好评和差评。 数据的前5项: 这里用到了一个之前没用到的包NLTK对我们的文本数据进行必要的处理,转化,使其变成能够…

MVC中ASCX分部视图的Action在哪里设置

首先,我们一般在shared里面做的公用的ascx分部视图,没有特定的action,一般是把逻辑写在页面上,这样给页面载荷比较大。 事实上MVC2.0提供了一个方法,用来在页面上加载Action,通过这个方法,可以使…

Mysql索引使用解析

摘自:http://blog.chinaunix.net/uid-25063573-id-3032578.htmlMysql索引使用解析1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大&…

构造一个神经网络对银行客户流失做一个分析

例子及数据集是某套教程(避嫌)里的内容,做下记录,个人认为,亲自实现代码可以增强学习效果。 情境: 某家银行发现进来他们的客户流失比较严重,处于业务需要,现在他们将收集的客户资料…

[039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

引言及内容概要 距离写上一篇文章《自己定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还沒有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却沒有在首页公布不论什么通知,貌似微信团队…

【开源】个人浏览器主页制作工具

Github开源地址:https://github.com/velscode/MyHomepage 说明 做本项目是因为之前被各种乱七八糟的导航网站整怕了,花花绿绿全是广告不说,还基本上找不到自己真正要的网站。空白主页每次都要输入网址又太麻烦,收藏夹里一个个找也…

office文档***

出处:2017鱼叉***邮件研究报告{https://www.anquanke.com/post/id/87938} 主要为三类(1)恶意宏文档 (2)利用漏洞常见的有:CVE-2017-0199CVE-2012-0158CVE-2015-1641CVE-2017-11882CVE-2017-8759CVE-2017-11…