Python 运筹优化11 BernoulliBandit 解读

说明

以广告点击的案例继续MultiArmed Bandit的学习。

内容

1 概要

样例假设存在5个广告,通过伯努利分布来模拟广告的点击可能。

adA = BernoulliBandit(0.004)
adB = BernoulliBandit(0.016)
adC = BernoulliBandit(0.02)
adD = BernoulliBandit(0.028)
adE = BernoulliBandit(0.031)

这是一个假设-验证的过程。其中广告E的概率期望最高,是3.1%。

2 BernoulliBandit

定义高光

class BernoulliBandit(object):def __init__(self, p):self.p = pdef display_ad(self):reward = np.random.binomial(n=1, p=self.p)return reward
adA = BernoulliBandit(0.004)
adB = BernoulliBandit(0.016)
adC = BernoulliBandit(0.02)
adD = BernoulliBandit(0.028)
adE = BernoulliBandit(0.031)ads = [adA, adB, adC, adD, adE]

要几十次才能出一个1

adE.display_ad()
1

程序解读,chatgpt做的挺好
在这里插入图片描述

3 测试阶段:找到最好的广告

在测试阶段,随机的选取一个广告,然后增量的更新奖励值

n_test = 10000
n_prod = 90000
n_ads = len(ads)
Q = np.zeros(n_ads)  # Q, action values
N = np.zeros(n_ads)  # N, total impressions
total_reward = 0
avg_rewards = []  # Save average rewards over time# A/B/n test
for i in range(n_test):ad_chosen = np.random.randint(n_ads)R = ads[ad_chosen].display_ad()  # Observe rewardN[ad_chosen] += 1Q[ad_chosen] += (1 / N[ad_chosen]) * (R - Q[ad_chosen])total_reward += Ravg_reward_so_far = total_reward / (i + 1)avg_rewards.append(avg_reward_so_far)best_ad_index = np.argmax(Q)  # Find the best action
print("The best performing ad is {}".format(chr(ord('A') + best_ad_index)))The best performing ad is E(有时候甚至是D)

在这里插入图片描述
在这里插入图片描述
跑完之后,Q,N的样子大致如下。所以Q就是代表了核心的动作价值。
在这里插入图片描述
其中,核心的Q增量计算逻辑如下:
在这里插入图片描述

4 生产阶段:使用最好的广告进行持续实验

生产部分是接着测试持续进行的,所以avg_reward_so_far后面的次数是在n_test基础上叠加的。

ad_chosen = best_ad_index
for i in range(n_prod):R = ads[ad_chosen].display_ad()total_reward += Ravg_reward_so_far = total_reward / (n_test + i + 1)avg_rewards.append(avg_reward_so_far)

5 画图展示

import pandas as pd
df_reward_comparison = pd.DataFrame(avg_rewards, columns=['A/B/n'])import cufflinks as cf
import plotly.offline
cf.go_offline()
cf.set_config_file(world_readable=True, theme="white")
# cf.set_config_file(world_readable=True, theme="green")df_reward_comparison['A/B/n'].iplot(title="A/B/n Test Avg. Reward: {:.4f}".format(avg_reward_so_far),xTitle='Impressions', yTitle='Avg. Reward')

在这里插入图片描述

6 结论

  • 1 仍然是从bandit开始,我们可以把模型、策略、规则视为一个bandit,在训练结束时,我们应该有一个default p。
  • 2 注意增量更新的方式
  • 3 测试(选择)-生产(应用)的过程几乎是无缝衔接的
  • 4 可以用产生候选-实测-误差估计-修正候选的方式进行长期迭代

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/687651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sipeed 的 MaixCam UART操作

发现问题 根据sipeed MaixCam官方文档 使用MaixVision会报错。 正确的接线 1,usb转ttl的RX和TX与sipeed MaixCam官方赠送的usb转接头反向连接,GND互相连接。 2,再用一根tpyc-c为其供电。 连接WiFi路由器 MaixCam液晶屏输入WiFi名称和密…

requestAnimationFrame请求动画帧

一、前言 在Web应用中,实现动画效果的方法比较多: CSS3:Transition(过度) / Animation(动画) HTML5:Canvas JavaScript:setInterval(定时器) /…

腾讯云服务器部署前后端服务

服务器:OpenCloudOS (兼容centos8) 后端:javaSpringboot 前端:Vue 下载jdk 1)下载jdk11 wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz 2)解压jdk …

印象笔记大师:揭秘高效管理的终极技巧,让你的信息整理事半功倍!

印象笔记(Evernote)是一款功能强大的笔记应用,它可以帮助用户记录、整理和管理各种信息。无论是工作、学习还是日常生活,印象笔记都能为我们提供便捷的服务。本文将全面详细地介绍印象笔记的使用技巧,包括基本介绍、主…

Gartner发布降低企业软件供应链安全风险指南:全球软件供应链相关法规、指南以及企业需要开展的三个方面工作

软件供应链攻击呈三位数增长,但很少有企业机构采取措施对这些复杂攻击的风险进行评估。安全和风险管理领导者可参考本文,采用三种实践来检测和预防攻击,保护企业机构的安全。 主要发现 虽然软件供应链攻击频繁发生,但其安全评估尚…

2024数维杯B题详细思路代码数学建模高质量保姆级

2024年第九届数维杯大学生数学建模挑战赛题目 B 题 生物质和煤共热解问题的研究 (1)基于附件一,请分析正己烷不溶物(INS)对热解产率(主要 考虑焦油产率、水产率、焦渣产率)是否产生显著影响?并利用图像 加…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主…

从RAID 0到RAID 10:全面解析RAID技术与应用

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、磁盘阵列简介 2、磁盘阵列诞生背景 3、硬件RA…

无人播剧项目怎么做,快手无人播剧全攻略,版权难题一招破解!

相信大家比较关注的问题就是快手无人直播无人播剧到底是不是真的?是不是骗人的?靠不靠谱?是不是真的能赚钱?会不会涉及到版权问题?等等。接下来我就给大家一一做解答! 首先关于快手无人播剧是不是骗人的&a…

Element快速上手!

Element是饿了么公司前端团队开发的一套基于Vue的组件库,用于快速构建网页~ 官网链接: Element - The worlds most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.elem…

Rust编程语言的特点及其适合做什么

Rust编程语言的特点 Rust是一门系统级编程语言,它有如下特点。 1. 类C的语言语法 Rust的具体语法和C/C类似,都是由花括号限定代码块,还有一样的控制流关键字,例如if、else、while和for。然而,也并非所有的C或者C关键…

大数据Scala教程从入门到精通第六篇:Scala源文件编写和运行

一:Scala源文件编写和运行 1:源代码比较 public class HelloJava{public static void main(String[] args){System.out.println("hello scala")} } object HelloScala{//用于声明方法 入参是一个String类型的数组。返回值类型为空def main…