paper2skills Playbook

Thompson Sampling for Multi-Armed Bandit

Skill-Thompson-Sampling-MAB · 02-A_B实验

experimentoptimizationrecommendation广告与投放推荐与搜索WF-B 广告优化WF-G Listing内容优化
业务优先级⭐⭐☆☆☆
业务视角
适用角色运营负责人 / 产品经理 · 广告优化师 · 选品负责人
适用平台Amazon Listing · TikTok 广告素材 · DTC 落地页
什么情况下用改了主图/标题/价格,不确定销量变化是改动导致的还是流量波动;两个方案团队各持己见,需要数据裁决
成功是什么样的每次改动都有 ≥95% 置信度的数据结论,好的改动快速全量,坏的及时止损
业务痛点
改了主图感觉好多了但不确定小范围测试结果好全量后没效果测试周期短结论不可靠

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 卡片。