Thompson Sampling for Multi-Armed Bandit
Skill-Thompson-Sampling-MAB · 02-A_B实验
1. 解决的问题
Thompson Sampling是一种基于贝叶斯后验采样的在线决策算法,用于解决探索-利用权衡(Exploration-Exploitation Tradeoff)问题。算法的核心洞见是:按照每个动作是最优动作的概率来选择动作,而非简单地选择当前估计奖励最高的动作。
2. 核心算法逻辑
Thompson Sampling是一种基于贝叶斯后验采样的在线决策算法,用于解决探索利用权衡(ExplorationExploitation Tradeoff)问题。算法的核心洞见是:按照每个动作是最优动作的概率来选择动作,而非简单地选择当前估计奖励最高的动作。
3. 业务应用场景
业务问题 母婴出海APP首页有5个Banner位,每个位置可展示不同内容(新品推广、促销活动、育儿知识、用户UGC、跨境物流优势)。运营团队不知道哪种内容组合能带来最高的点击率(CTR)和转化率,传统的A/B测试需要大量流量且无法自适应变化。
数据要求 | 字段 | 说明 | 格式 | |------|------|------| | timestamp | 展示时间 | datetime | | banner_id | Banner编号(1-5) | int | | content_type | 内容类型 | categorical | | clicked | 是否点击(0/1) | binary | | converted | 是否转化(0/1) | binary | | user_segment | 用户分群(新手妈妈/二胎妈妈/准妈妈) | categorical |
预期产出 - 每个Banner位的内容选择策略,自动平衡探索新内容 vs 利用已知高转化内容 - 相比轮播或随机展示,CTR提升15-30% - 无需人工设定流量分配比例,算法自适应调整
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 算法逻辑简单,代码实现容易
- 无需大规模数据存储
- 主要挑战在于业务场景抽象(将业务问题转化为Bandit框架)
- 高价值:直接提升流量变现效率
- 低成本:实施简单,见效快
- 普适性:适用于推荐、广告、运营等多场景
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
Thompson Sampling for Multi-Armed Bandit
母婴出海场景:Banner投放优化、广告渠道选择
"""
import numpy as np
import pandas as pd
from typing import List, Tuple, Dict
import matplotlib.pyplot as plt
class BernoulliThompsonSampling:
"""
Thompson Sampling for Bernoulli Bandit
适用于:点击率优化、转化率优化等二元结果场景
"""
def __init__(self, n_arms: int, prior_alpha: float = 1.0, prior_beta: float = 1.0):
"""
初始化Thompson Sampling
Args:
n_arms: 动作/臂的数量(如Banner数量、广告渠道数)
prior_alpha: Beta先验的alpha参数(默认1.0即均匀先验)
prior_beta: Beta先验的beta参数(默认1.0即均匀先验)
"""
self.n_arms = n_arms
self.alpha = np.ones(n_arms) * prior_alpha
self.beta = np.ones(n_arms) * prior_beta
self.n_pulls = np.zeros(n_arms)
self.successes = np.zeros(n_arms)
def select_action(self) -> int:
"""
选择下一个动作
从每个臂的后验分布采样,选择样本值最大的臂
Returns:
选择的动作索引
"""
# 从Beta分布采样
samples = np.random.beta(self.alpha, self.beta)
return int(np.argmax(samples))
def update(self, action: int, reward: float):
"""
更新后验分布
Args:
action: 执行的动作索引
reward: 奖励(0或1,或0-1之间的值)
"""
self.n_pulls[action] += 1
# 对于二元奖励
if reward > 0:
self.alpha[action] += 1
self.successes[action] += 1
else:
self.beta[action] += 1
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。