多臂bandit算法

mabalgs的Python项目详细描述


多臂bandit算法(mab)

多臂bandit(mab)是一个问题,当每个选择的属性在分配时只有部分已知时,必须在竞争(替代)选择之间以最大化其预期收益的方式分配一组固定的有限资源,而且随着时间的推移或通过将资源分配给所选内容,可能会更好地理解这些内容。

在这个问题中,每台机器都从特定于该机器的概率分布中提供随机奖励。赌徒的目标是通过一系列的杠杆拉动来获得最大的回报。赌徒在每次试玩中所面临的关键权衡是在"开发"预期收益最高的机器和"探索"获得其他机器预期收益的更多信息之间进行。在机器学习中,探索和开发之间也面临着取舍。

mab帮助解决的主要问题是在线实验中的种群分裂。

安装

pip install mabalgs

算法(bandit策略)

非线性上下文bandit算法(onn_ths)

如果您正在寻找上下文盗贼算法,请转到我的另一个存储库

UCB1(置信上限)

是一种针对多武装匪徒的算法,该算法在事先不知道所需奖励分配的情况下,只会随着所采取行动的数量呈对数增长而产生遗憾。

获取选定的手臂
frommabimportalgs# Constructor receives number of arms.ucb_with_two_arms=algs.UCB1(2)ucb_with_two_arms.select()

奖励手臂
frommabimportalgs# Constructor receives number of arms.ucb_with_two_arms=algs.UCB1(2)my_arm=ucb_with_two_arms.select()[0]ucb_with_two_arms.reward(my_arm)

UCB调谐(置信上限调谐)

通过调整ucb1决策规则中的上界参数,可以对两个ucb解进行严格的改进。在频率方面,经经验调谐的UCB优于UCB1和UCB2 选择最好的手臂。此外,指出调谐的UCB对臂的变化"不是很"敏感。

获取选定的手臂
frommabimportalgs# Constructor receives number of arms.ucbt_with_two_arms=algs.UCBTuned(2)ucbt_with_two_arms.select()

奖励手臂
frommabimportalgs# Constructor receives number of arms.ucbt_with_two_arms=algs.UCBTuned(2)my_arm=ucbt_with_two_arms.select()[0]ucbt_with_two_arms.reward(my_arm)

汤普森抽样

汤普森抽样是完全贝叶斯的:它从一个后验分布中产生一个bandit配置(即一个期望回报向量),然后就好像这是真正的配置(即它用最高的期望回报拉动杠杆)。

"关于一个未知概率超过另一个未知概率的可能性 鉴于两个样本的证据,第一篇论文提出了一个多武装匪徒的等价问题,其中伯努利问题的解 提出了一种称为汤普森抽样的分布bandit问题。

获取选定的手臂
frommabimportalgs# Constructor receives number of arms.thomp_with_two_arms=algs.ThompsomSampling(2)thomp_with_two_arms.select()

奖励手臂
frommabimportalgs# Constructor receives number of arms.thomp_with_two_arms=algs.ThompsomSampling(2)my_arm=thomp_with_two_arms.select()[0]thomp_with_two_arms.reward(my_arm)

蒙特卡罗模拟算法的比较

蒙特卡罗模拟是调试/测试mab算法的最佳方法。该模拟实时生成数据 关于一段时间内的交付概率(由模拟执行者选择)。 例如,这些概率可以代表大多数用户对mab arm(选项)随时间变化的品味。

示例:我们要测试一个将用于广告问题的5臂mab,mab必须选择5个广告中的哪一个 接收用户最多的点击。您可以使用以下概率设置([0.9,0.1,0.1,0.1,0.1,0.1])。 每个数组元素表示一个arm及其被单击的概率。 我们可以观察到,ad 0(数组的索引0)有90%的点击率,而其他的有10%的点击率。 这些信息可以帮助我们分析算法是否运行良好。

使用以下设置进行模拟:

{0: [0.9, 0.6, 0.2, 0.2, 0.1], 1000: [0.3, 0.8, 0.2, 0.2, 0.2], 4000: [0.7, 0.3, 0.2, 0.2, 0.1]}

字典的键告诉我们在过去的时间里概率必须被激活的时间。 模拟的总时间为5000步,图表中的每个点平均为1000个模拟,每个点5000步。

从这本词典我们可以推断出:

  • 从时间0到1000,手臂0是赢家。
  • 从时间1000到4000,ARM 1是赢家
  • 从时间4000开始,ARM 0就是赢家。

您可以在这本笔记本上查看此模拟的完整示例。

结果:

ucb1

ucb tuned

Thompsom Sampling

累计奖励

记住所有这些分析都是在模拟环境中进行的,结果可能会根据 MAB将执行的信息类型。为了更合理地选择真实世界的数据,请执行 在场景中的算法之间进行AB测试。


多武装匪徒算法排名

rba(分级bandit算法)

这是一个在线学习算法,可用于排序问题。在这个算法中,我们有一定数量的 武器将在一定数量的排名插槽(如Netflix电影列表)显示。每只手臂在某些排名位置上都是最好的 此算法使用mab实例来完成此操作。

在所选手臂的排位中获取所选手臂

frommabimportalgs,ranked_algs# Constructor receives number of arms, number of ranks and a MAB algorithm reference.rba_algorithm=ranked_algs.RBA(10,10,algs.ThompsomSampling)# Any MAB from algs can be used.ranked_selected_arms=rba_algorithm.select()# Best arms in its best position.

奖励处于某个等级位置的手臂

pip install mabalgs
0

rba-m(等级bandit算法-修改)

这和rba是一样的,但是在arm冲突方法中做了修改。 这种新的冲突方法是由我和我的团队合作伙伴f a bio制定的。有关此方法的详细信息,请参阅代码文档。

在所选手臂的排位中获取所选手臂

pip install mabalgs
1

奖励处于某个等级位置的手臂

pip install mabalgs
2

蒙特卡罗模拟rba-m算法的行为

与之前一样,我们将使用rba-m算法进行蒙特卡洛实验,以显示其行为。

示例:我们要测试一个5臂和4列mab,它将用于电影插槽的重新编译问题, mab必须在4个电影横幅中选择每个位置的用户点击次数最多的一个。

使用以下设置进行模拟:

pip install mabalgs
3

在这个模拟中我们有一些不同的东西。现在,在给定的时间内,我们需要设置所有可用武器在每个级别位置的概率,并且 最后一个数组是排名位置点击概率(给定排名位置的收敛速度)。

模拟的总时间为3000步,图表中的每个点平均为1000个模拟,每个点3000步。

从这本词典我们可以推断出:

  • 从0到1500,臂3是0级的获胜者,臂2是1级的获胜者,臂1是2级的获胜者,臂0是3级的获胜者。
  • 从1500到3000,0臂是0级的获胜者,1臂是1级的获胜者,2臂是2级的获胜者,3臂是3级的获胜者。
  • 排名位置点击概率对所有人都一样,以便更好地了解他们的行为。

您可以在本笔记本上查看此模拟的完整示例。

结果:

ucb1

Thompsom Sampling

累计奖励

记住所有这些分析都是在模拟环境中进行的,结果可能会根据 对于RMAB将执行的信息类型。为了更合理地选择真实世界的数据,请执行 在场景中的算法之间进行AB测试。

RBA与RBA-M的比较

如果您想查看rba算法的行为,可以使用这个笔记本来执行它。只需在run方法中将"rbam"更改为"rba"。它们之间的行为是相同的,只是在"相同重量"的情况下,手臂处于相同的位置,RBA-M表现得更好。


贡献者

参考文献

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaSpring事件发射器停止在新连接上向以前的客户端发送事件   javascript如何在Ionic 4中向选项卡添加模式?   java Hibernate hbm2ddl。自动更新不会删除mysql中的列   java如何使用instanceof根据子类类型对子类执行不同的操作?   java在JPanel中动态添加JLabel(重新验证无效)   java我的计算机上可以有两个版本的JDK吗?   spring在Java中管理每个表单提交的版本   java获取装饰器对象的所有类型:包装对象的类型和包装对象的类型   多线程Java区分可运行线程类型   javajavax。网ssl。SSLexException:填充长度无效   java JSP将单引号和双引号显示为符号   java当使用TestNG DataProvider时,有没有办法从同一个Excel工作表中读取和写入参数?   java不同的枚举哈希代码生成?   java ASM AdviceAdapter onMethodEnter打印所有参数   JavaStruts2(版本2.3.28)只接受注册的区域设置   excel如何使用Java中的Apache POI库对数据透视表数据进行排序   如果没有Kotlin库,是否可以将Kotlin翻译成Java?   安卓中用于JSON数据的java Junit