Thompson Sampling–汤普森采样应用之代码篇

关键词:机器学习,在线学习,人工智能,强化学习,汤普森采样解决最优路径问题,汤普森采样代码例子,Thompson Sampling 机器学习代码例子

1.简介

汤普森选样是一种采样方法,其意在研究在探索成本最低的情况下找到最高的收益(Global Maximum)。如果你还不清楚基础概念,可以看这一篇:

【算法】如何根据算法在赌场发家致富?汤普森采样之多臂强盗算法!

汤普森采样的应用前景其实非常非常的广,小到出门上班选择路线,大到赌场梭哈发家致富。

当前比较流行的研究应用有:
1)多臂强盗问题(Multi-armed bandit)也就是我们说的赌场老虎机;
2)EE问题(Exploration-Exploitation),也就是大家说的冷启动问题,旨在研究提高给用户推送广告的准确性;
3)机器学习-强化学习(reinforcement learning),人工智能,都很厉害,但是目前看以看到的研究材料不多。
。。。以及非常非常多,万物皆可汤普森。
这里为了引发大家的思路写一个很简单很basic的应用场景。

2.应用举例

2.1故事背景

我们的赌吧老哥Tom刚刚搬到一个新城市,安顿好住所之后嘛,赌瘾来犯难免手痒,他就想了解一下当地赌场的情况。

对于Tom老哥而言最首要的问题就是交通问题,在这个新城市有很多种到达赌场的路线,我们假设他知道每条路大概消耗的时间而不知道每条路平均的消耗时间。(也就是说他知道这条路距离比较长,但是这条路他不堵车啊,反而到达时间要比别的短)。因此他要做的第一件事就是找到到达赌场平均时间最短的那一条路径

2.2信息分析

假设我们有如下的线路地图,其中有V1到V12一共12个vertex,以及16条路径。Tom老哥的家在V1,赌场的位置在V12。

我们通过注视法可以看出来其实从V1到V12一共只有6条路可以走,设为X1,X2,…,X6。

2.3设置事件属性

因为我们目前要处理的是随机时间,所以我们给Xi定义不同的六种随机属性,然后写一个随机时间模拟器,用来模拟每条路每次的耗时情况。
这里我们模拟器输入为每条路的属性,模拟器会首先提取出该条路段的最高限速,用模拟的概率表示突发时间,如果有突发事件发生速度会有不同比例的减低。
代码不需要看懂,明白意思就行!
我这边是定义了一个x的属性,为了方便修改直接用了list而没有创建类,在比较大的项目中我真的强烈建议大家用类来做,list修改起来会瞎真的。

#每条路属性定义#x=[limited speed, s:km, probability that may rain or tafic jam]x1=[30,15,10,"x1",0,1,1]x2=[40,10,5,"x2",0,1,1]x3=[60,30,30,"x3",0,1,1]x4=[40,30,30,"x4",0,1,1]x5=[55,27,40,"x5",0,1,1]x6=[60,30,50,"x6",0,1,1]
#随机事件模拟器
def trafic_monitor_1(x):rain_prob=random.randint(1, 100)trafic_jam_prob = random.randint(1, 100)simple_prob=[i for i in range(1,x[2])]v=x[0]if rain_prob in simple_prob:print("it's raining")v=v*0.85else:print("it's not raining")if trafic_jam_prob in simple_prob:print("it's a trafic jam")v=v*0.75else:print("there is no trafic jam")return x[1]/v

2.4建立beta模型

我们要为每一个选线建一个独立的beta模型,这个的确一行代码就可以。

x1[4]=beta.rvs(x1[5],x1[6])x2[4] = beta.rvs(x2[5], x2[6])x3[4] = beta.rvs(x3[5], x3[6])x4[4] = beta.rvs(x4[5], x4[6])x5[4] = beta.rvs(x5[5], x5[6])x6[4] = beta.rvs(x6[5], x6[6])

2.5完成汤普森采样模型

随机事件模拟器和beta坐标都有了,现在我们只需要设定一个可以更新模型的机制再让他循环起来就可以了。这里我们简单的把他看作一个Bernoulli问题,也就是说我们要设定一个时间区间(奖惩区间),只要你够快进入到这个时间区间,我就算你成功,就会获得对应的奖励S+=1,如果模拟的时间结果很慢,没有进入到我们所设定的区间,那么就会被判定为失败,相应的获得惩罚F+=1。
这里我们设定完成时间在45分钟(0.75h)就算成功,反之则失败。

if time_i <= 0.75:list_xi[max_index[0]][5]+=1
else:list_xi[max_index[0]][6]+= 1

简单吧,当然如果你不满足于做一个Bernoulli人,你可以对他的奖惩机制做任何你觉得合理的改变。比如细分他的奖励区间,或者用更直观的对应奖励方式,比如胜利后S+=log(reward),失败后F+=1/reward。具体怎么修改要根据你的reward。

3.开始模拟

为了体现出模拟过程,我把每个路径Xi的beta坐标拆出来给你们看。

3.1第一轮


我们可以看到第一次X1有最大的贝塔值,所以我们选择路径X1并且获得了对应的结果:0.5h < 0.75h。X1成功了,我们给他对应的奖励S+=1

3.2第二轮

这一次X2给出了最大的贝塔值,这也体现了Thompson不greedy的特性。但是X2的结果超出了我们的区间,所以X2获得惩罚F+=1.

3.3第三轮

X4被选择,其结果也超出了我们给定的区间,获得惩罚F+=1.

3.4结果

我们直接让他自己运行1000次

可以看到他已经把mean压到了0.259,那么怎么看该算法的好坏呢?我们先介绍一个衡量标准,regret值,也就是后悔值。在我们的Bernoulli问题中,我们可以定义其为
regrett(θ)=maxiθi−θxtregret_{t}(\theta )=max_{i}\theta_{i}-\theta_{xt}regrett​(θ)=maxi​θi​−θxt​
t:代表时间段,也就是循环的第几次
i:用的哪一种方法
这个公式说人话就是看你每一次模拟得到的reward和我们目前得到最好的reward比要差多少。差的越多你当然越后悔,后悔指数也就越高。

这里我们直接用matplotlib里的plot工具把他画出来。

#准备坐标
x=[i for i in range(1,1001)]
y2=[i for i in range(1,1001)]
#画图
plt.plot(x,list_record_regret,lw=2,label="regrets curve")
plt.legend()
plt.show()


从图中我们可以看到大约100次以后我们的后悔值就缩小到一个比较小的区间,之后一直在一个较小的区间震荡。震荡的可能原因有:1)奖惩机制分配不够细腻,我们直接定义了大于45分钟就减一,小于45分钟就加一。那么我们遇到10分钟和40分钟的奖励情况是一样的都是加一,就不能很好的分隔开。假如我们设置奖罚机制更细腻,更和reward相关,得到的结果会更好;2)因为我们应用的体系为beta分布体系,所以即使已经找到最优方案,还是会有次优方案被选到的概率。并且汤普森采样旨在选取一个比较好的mean区间,如果和greedy算法相比较我们会发现汤普森的mean会更好。

4.小结

就目前来看,汤普森采样在人工智能线上学习有着无限的前景,其应用场景以及应用效率远非本文中的例子可以比拟的。本文的目的在于抛砖引玉,启发大家研究更多的汤普森采样的用法。

需要完整代码demo可以留言,有问题交流可以留言或私信。

Reference
1.D.J.Russo, B.V.Roy, A.Kazerouni, I.Osband and Z.Wen4 'A Tutorial on Thompson Sampling ’
url: https://web.stanford.edu/~bvr/pubs/TS_Tutorial.pdf

【算法应用】Thompson Sampling--汤普森采样应用之代码篇 (Python)相关推荐

  1. Thompson Sampling(汤普森采样)

    1.power socket problem 一个robot快没电了,Robot 进入了一个包含 5 个不同电源插座的充电室.这些插座中的每一个都会返回略有不同的电荷量,我们希望在最短的时间内让 Ba ...

  2. Ken Thompson爷爷的经典复制自身代码程序 - Python版本(只用两行!)

    Ken Thompson可是大牛人了!不认识的人赶快Google/百度一下.Ken爷爷是Unix创始人,C语言鼻祖!Ken 当时大学时候没游戏玩,就自己给自己出题目写程序,就有了这个复制自身代码的程序 ...

  3. 【算法】如何根据算法在赌场发家致富?汤普森采样之多臂强盗算法!

    汤普森采样-Thompson Sampling 之概念篇 关键词:机器学习,在线学习,人工智能,强化学习 如果你已经熟悉了概念可以直接看代码篇: [算法应用]Thompson Sampling–汤普森 ...

  4. 蓄水池采样算法(Reservoir Sampling)原理,证明和代码

    有一个在大数据下很现实的例子: "给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等." ...

  5. 【采样算法】拉丁超立方采样

    [采样算法]拉丁超立方采样 简介 过程 一维拉丁超立方采样 多维拉丁超立方采样 python编程 结论 参考 简介 LHS(Latin Hypercube Sampling)是一种分层采样方法,相较于 ...

  6. 如何通俗理解 beta分布、汤普森采样和狄利克雷分布

    如果想理解汤普森采样算法,就必须先熟悉了解贝塔分布. 一次伯努利实验(比如扔硬币,二元变量)叫做伯努利分布(Bernoulli distribution).多次伯努利实验叫做二项式分布(Binomia ...

  7. Introduction to Multi-Armed Bandits——04 Thompson Sampling[2]

    Introduction to Multi-Armed Bandits--04 Thompson Sampling[2] 参考资料 Russo D J, Van Roy B, Kazerouni A, ...

  8. Negative Sampling 负采样详解

    在word2vec中,为了简化训练的过程,经常会用到Negative Sampling负采样这个技巧,这个负采样到底是怎么样的呢?之前在我的博文 word2vec算法理解和数学推导 中对于word2v ...

  9. 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题

    本文对于推荐系统中的采样评估指标进行了讨论,内容略多, 还有一些数学推导, 有兴趣的可以去阅读文末给出的原始论文链接, 此处直接列出核心观点: 在评估推荐算法的效果时,能不采样就不采样! 除了AUC, ...

  10. negative sampling负采样和nce loss

    negative sampling负采样和nce loss 一.Noise contrastive estimation(NCE) 语言模型中,在最后一层往往需要:根据上下文c,在整个语料库V中预测某 ...

最新文章

  1. 全局变量:global与$GLOBALS的区别和使用
  2. Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
  3. 对家庭网络设备行业的理解
  4. Linux下Tomcat与Apache Web服务器的整合
  5. JSON与Java对象的互相转换
  6. 【OpenCV学习笔记】【函数学习】十三(剔除检测到的不符合要求的对象)
  7. 3. mysql的注解驱动的三种方式_注册 Jdbc 驱动程序的三种方式及Class.forName 的作用...
  8. 中海达数据怎么转rinex_GPS_OEM原始数据向Rinex格式转换的方法
  9. 通达OA2019版本全功能
  10. java的list和map区别,list和map的区别是什么
  11. 电赛专题 |国一作品_线路负载及故障检测装置
  12. 【学习笔记】seckill-秒杀项目--(9)接口优化
  13. Linux 权限管理深剖
  14. zabbix通过yum安装,启动报错zabbix-agent.service never wrote its PID file. Failing.
  15. 我们正在努力; 具备人工智能的测试机器人
  16. 数据结构习题--线性表
  17. 低分辨率和畸变严重的棋盘格角点的自动检测
  18. 广告营销用户点击预测分析
  19. FlowFormer: Transformer结构光流估计
  20. Redis的初步使用教程

热门文章

  1. 安卓双摄像头录像_usb双摄像头app下载
  2. 任务栏-IDEA图标变白色
  3. CF1312E Array Shrinking(区间dp模板)
  4. iOS_6_ToolBar+xib+红楼梦
  5. 一篇文章彻底搞懂海明码
  6. ArcGis 加载tif,tpk,shp格式文件
  7. 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
  8. 人名和成绩一起排序_Excel怎么按姓名笔画和拼音排序,后面的数字跟着一起变动...
  9. Dialog_xml制作——博客地址
  10. 多进程统计策略盈亏分布——从零到实盘12