从0开始学习R语言--Day25--A/B测试 vs 多臂老虎机

通常在比较两个不同的方案对数据的影响时,我们会各拿50%的数据去进行对照试验,这样观测到的结果会最大程度地保留统计学上的特点。但实际上,并不是所有对比不同方案都要这样做,一来,我们需要等到两组实验都完全结束后,才能知道结果如何,等待时间周期较长;二来,在很多场景中,差的方案会在落地测试时不可避免地对用户造成不好的体验。

后者对应的一般是在用户的实时反馈和广告的点击率上,那么这种情况,我们会采用动态规划的方式,随着实验的进行,不断地减少差方案的数据,通过这种迭代的方式来降低额外的损失,从而实现快速地聚焦到优质方案。当然,这样做会在一定程度上破坏数据的分布,统计显著性会减弱。

以下是一个例子:

R 复制代码
library(bayesAB)
# 生成模拟数据集:3个广告版本(A/B/C)的点击率
# 生成模拟数据集:每天随机选一个广告测试
set.seed(123)
n_days <- 25  # 测试5天
true_rates <- c(A = 0.1, B = 0.15, C = 0.2)  # 真实点击率

generate_data <- function(day) {
  chosen_ad <- sample(c("A", "B", "C"), 1)  # 每天随机选一个广告
  impressions <- sample(100:500, 1)
  clicks <- rbinom(1, size = impressions, prob = true_rates[chosen_ad])
  data.frame(
    day = day,
    ad_version = chosen_ad,
    impressions = impressions,
    clicks = clicks
  )
}

ad_data <- do.call(rbind, lapply(1:n_days, generate_data))
head(ad_data)

# 多臂老虎机算法(Epsilon-Greedy)
run_bandit <- function(data, epsilon = 0.1) {
  total_rewards <- c(A = 0, B = 0, C = 0)
  total_trials <- c(A = 0, B = 0, C = 0)
  choices <- character(n_days)
  
  for (day in 1:n_days) {
    day_data <- subset(data, day == day)
    if (nrow(day_data) == 0) next
    
    if (runif(1) < epsilon) {
      chosen_ad <- sample(day_data$ad_version, 1)  # 从当天实际广告中随机选
    } else {
      ctr <- ifelse(total_trials > 0, total_rewards / total_trials, 0)
      chosen_ad <- names(which.max(ctr))
    }
    
    # 只取第一个匹配项(避免多行问题)
    ad_data <- subset(day_data, ad_version == chosen_ad)[1, ]
    if (!is.na(ad_data$ad_version)) {
      total_rewards[chosen_ad] <- total_rewards[chosen_ad] + ad_data$clicks
      total_trials[chosen_ad] <- total_trials[chosen_ad] + ad_data$impressions
      choices[day] <- chosen_ad
    }
  }
  
  prop.table(table(choices[choices != ""]))
}

result <- run_bandit(ad_data)
print(paste("最终选择比例:", round(result * 100, 1), "%"))

输出:

R 复制代码
[1] "最终选择比例: 24 %" "最终选择比例: 76 %"

结果显示,在25天的模拟中,多臂老虎机算法最终分配了24%的流量给某个广告版本(可能是A或B),76%给另一个版本,符合原理的表现,同时24%的数据给另一个方案则保留了可能万一真的忽略了潜在方案的可能。

相关推荐
小陈phd18 分钟前
多模态大模型学习笔记(二十一)—— 基于 Scaling Law方法 的大模型训练算力估算与 GPU 资源配置
笔记·深度学习·学习·自然语言处理·transformer
丝斯201121 分钟前
AI学习笔记整理(75)——Python学习4
人工智能·笔记·学习
小帅学编程32 分钟前
英语学习笔记
java·笔记·学习
AI成长日志33 分钟前
【datawhale】hello agents开源课程学习记录第4章:智能体经典范式构建
学习·开源
EnglishJun35 分钟前
ARM嵌入式学习(七)--- 汇编基础(数据指令、函数调用原理、中断原理)
arm开发·学习
今儿敲了吗38 分钟前
python基础学习笔记第七章——文件操作
笔记·python·学习
ADHD多动联盟1 小时前
提升自控力差孩子的学习生活:有效的学习障碍帮助与冲动控制训练方法
学习·学习方法·玩游戏
次旅行的库1 小时前
【问渠哪得清如许-数据分析】学习笔记-下
数据库·笔记·sql·学习
Dfreedom.2 小时前
机器学习经典算法全景解析与演进脉络(监督学习篇)
人工智能·学习·算法·机器学习·监督学习
sheji34162 小时前
【开题答辩全过程】以 基于Android的奥运英语学习软件的设计与实现为例,包含答辩的问题和答案
学习