汤普森采样(Thompson sampling)理论支持

news2024/12/26 10:39:57

目录

  • 一、UCB与TS算法数学原理
    • (1)Upper Confidence Bounds 数学原理
    • (2)Thompson sampling 数学原理
      • 1、TS 基本数据原理
        • 1. beta 分布
        • 2. 共轭分布与共轭先验
        • 3. 采样的编程实现
      • 2、TS 算法流程
        • (1) TS算法基础版本
  • 二、UCB与TS算法的优缺点
    • 1、TS算法的优缺
      • a、TS的一些基本性质:
      • b、结合业务,TS为什么有效:
      • c、TS的不足:
    • 2、UCB算法的优缺
      • a、UCB算法的一些基本性质:
      • b、ucb 优点
      • c、ucb 缺点:
      • 3、TS与UCB对比总结
  • 三、参考资源

一、UCB与TS算法数学原理

(1)Upper Confidence Bounds 数学原理

在这里插入图片描述
在这里插入图片描述

Python demo

# !/usr/bin/python
# -*- coding=utf-8 -*-
# Name:         UCB
# Description:
# Author:       liu
# Date:         2021/9/14
# Mail:         

from __future__ import absolute_import
from __future__ import print_function
from __future__ import division

import numpy as np

N = 3  # 物品总数
T = 100  # 试验次数/轮数
epsilon = 0.1  # 贪婪系数
P = [0.5, 0.6, 0.55]  # 每个物品的真实被转化率
Round = [0, 0, 0]  # 每个物品被选中的次数
Reward = [0, 0, 0]  # 每个物品被转化的次数


def pull(N, epsilon, P):
    """通过epsilon-greedy来选择物品

    Args:
        N(int) :- 物品总数
        epsilon(float) :- 贪婪系数
        P(iterables) :- 每个物品被转化率
    Returns:
        本次选择的物品
    """
    # 通过一致分布的随机数来确定是搜索还是利用
    exploration_flag = True if np.random.uniform() <= epsilon else False

    # 如果选择探索
    if exploration_flag:
        i = int(min(N - 1, np.floor(N * np.random.uniform())))

    # 如果选择利用
    else:
        i = np.argmax(P)
    return i


def calculate_delta(Round, i):
    """利用所有物品被选中的次数和i物品被选中的次数来计算delta

    Args:
        Round(iterables) :- 每个物品被选择的次数
        i(int) :- 物品序号
    Returns:
        使得置信度为1-2/ sum(Round) ** 2的delta
    """
    round_i = Round[i]
    if round_i == 0:
        return 1
    else:
        return np.sqrt(np.log(sum(Round)) / round_i)


def calculate_empirical(Round, Reward, i):
    """利用所有物品被选中和获得奖励的次数来计算实证参数

    Args:
        Round(iterables) :- 每个物品被选择的次数
        Reward(iterables) :- 每个物品获得奖励的次数
        i(int) :- 物品序号
    Returns:
        i物品的实证参数
    """
    round_i = Round[i]
    if round_i == 0:
        return 1
    else:
        return Reward[i] / round_i


def trial_ucb(Reward, Round, rounds=T):
    """做rounds轮试验

    Args:
        Reward(iterables) :- 每个物品的被转化次数
        Round(iterables) :- 每个物品被选择的次数
        rounds(int) :- 一共试验的次数
    Returns:
        一共的转化数

    rewards来记录从头到位的奖励数
    """
    rewards = 0
    for t in range(rounds):
        P_ucb = [calculate_empirical(Round, Reward, i) + calculate_delta(Round, i) for i in range(len(Round))]
        i = pull(N, epsilon, P_ucb)
        Round[i] += 1
        reward = np.random.binomial(1, P[i])
        Reward[i] += reward
        rewards += reward
    return rewards


if __name__ == '__main__':
    trial_ucb(Reward, Round, rounds=T)

(2)Thompson sampling 数学原理

1、TS 基本数据原理

1. beta 分布

Beta分布Bernoulli分布二项式分布 共轭先验,是(0, 1)上的随机变量的一种分布,它有两个大于0的参数(???),概率密度函数为(???),其中:

  • 1> 其中B(α,β)是B函数,Γ(x)是伽马函数,B函数可以理解为归一化因子(Normalizer),其存在是为了使得概率的积分为1
  • 2> beta分布的支撑集(???),意义为二元随机变量(???) 其中一种结果(???)的概率,所以Beta分布是一种“概率的概率分布”,其具体形式是为了满足贝叶斯推断过程中其内涵的一致性确定出来的。一般被用于建模伯努利试验事件成功的概率的概率分布。
  • 3>B函数在计算机求解中一般用Γ函数(分布)换算(如上面公式),计算机的内部实现就由积分变成阶乘
  • 4>Beta分布直观理解(可视化)
    图1 Probability density function (PDF)
    图1 Probability density function (PDF)
    在这里插入图片描述图2 Cumulative distribution function (CDF)

2. 共轭分布与共轭先验

  • 1> Beta分布与二项分布的关系 (解释建模问题)
    进行n次伯努利试验,其出现试验成功的概率p服从一个先验概率密度分布(???),试验结果出现k次试验成功,则试验成功的概率p的后验概率密度分布为(???),解释为什么beta分布用建模伯努利实验。

  • 2> 共轭分布与共轭先验 (解释参数更新问题)
    a、 {先验概率分布}*{实验数据/似然函数/似然概率} ∝ {后验概率分布} ,∝表示等比于。通过贝叶斯推理,可发现先验概率与后验概率具有同样的数学形式,所以也称它们为共轭分布(Conjugate Distribution),称先验概率似然函数共轭先验(Conjugate Prior)
    b、在MAB问题中,Bernoulli分布正好有Beta分布作为共轭先验,有了共轭先验,就容易做贝叶斯更新。为什么?因为beta 分布的更新只要考虑两个参数即可。
    c、所以 Thompson sampling,允许我们利用每个物品被转化率先验知识来设定每个beta分布的参数。
    d、在业务中的应用:α表示为点击的次数β表示为曝光了但没有点击的次数,所以α+β表示曝光数

3. 采样的编程实现

Python:np.random.beta(α, β)   #  返回值[0,1] 概率大小,其中α > 0,β > 0
C++:boost::random::beta_distribution<>(alpha, beta)  // alpha > 0,beta > 0

2、TS 算法流程

(1) TS算法基础版本

在这里插入图片描述

  • 为每个物品预估一对Beta分布的参数,可通过历史数据计算出来
  • 每次试验前从每个物品(???) 的Beta分布中随机采样获得对应的被转化率 (???)
  • 选择被转化率最大的物品,进行输出/播放
  • 根据用户对物品是否转化,来更新该物品的Beta分布参数,具体来说,就是被转化则 (???) 加 1,否则 (???) 加 1。(这个过程可以实时计算或者小时粒度进行在线计算)
  • python demo:
# !/usr/bin/python
# -*- coding=utf-8 -*-
# Name:         demo
# Description:
# Author:       liu
# Date:         2021/9/14
# Mail:         

from __future__ import absolute_import
from __future__ import print_function
from __future__ import division


import numpy as np

N = 3                # 物品总数
T = 100              # 试验次数/轮数
epsilon = 0.1        # 贪婪系数
P = [0.5, 0.6, 0.55]  # 每个物品的真实被转化率
Round = [0, 0, 0]    # 每个物品被选中的次数

Alpha = [25, 50, 75]  # 每个物品被转化率的Beta先验参数
Beta = [75, 50, 25]

# 在代码中加入了 epsilon-greedy 策略,这个过程不是必要的


def pull(N, epsilon, P):
    """通过epsilon-greedy来选择物品

    Args:
        N(int) :- 物品总数
        epsilon(float) :- 贪婪系数
        P(iterables) :- 每个物品被转化率
    Returns:
        本次选择的物品
    """
    # 通过一致分布的随机数来确定是搜索还是利用
    exploration_flag = True if np.random.uniform() <= epsilon else False

    # 如果选择探索
    if exploration_flag:
        i = int(min(N-1, np.floor(N*np.random.uniform())))

    # 如果选择利用
    else:
        i = np.argmax(P)
    return i


def trial_thompson(Alpha, Beta, rounds=T):
    """做rounds轮试验

    Args:
        Alpha, Beta(iterables) :- 每个物品被转化率的Beta分布的参数
        rounds(int) :- 一共试验的次数
    Returns:
        一共的转化数

    rewards来记录从头到位的奖励数
    """
    rewards = 0
    for t in range(rounds):
        P_thompson = [np.random.beta(Alpha[i], Beta[i]) for i in range(len(Round))]
        i = pull(N, epsilon, P_thompson)
        Round[i] += 1
        reward = np.random.binomial(1, P[i])
        Alpha[i] += reward
        Beta[i] += 1 - reward
        rewards += reward
    return rewards


if __name__ == '__main__':
    trial_thompson(Alpha, Beta, rounds=T)

(2)Batched Thompson Sampling
在这里插入图片描述
在这里插入图片描述
BTS算法特点:Beta 分布只在每批次的结束时进行更新,例如一个小时一次等

二、UCB与TS算法的优缺点

1、TS算法的优缺

a、TS的一些基本性质:

  • (1)贝塔分布主要有 α和 β两个参数,这两个参数决定了分布的形状,从上图及其均值和方差的公式可以看出
  • (2)α/(α+β)也就是均值,其越大,概率密度分布的中心位置越靠近1,依据此概率分布产生的随机数也多说都靠近1,反之则都靠近0
  • (3)α+β越大,则分布越窄,也就是集中度越高,这样产生的随机数更接近中心位置,从方差公式上也能看出来
  • (4)实现相对简单,计算量较小
  • (5)TS更大程度上利用了先验知识
  • (6)TS 基于贝叶斯思想,全部用概率分布来表达不确定性

b、结合业务,TS为什么有效:

  • (1)如果一个候选项被选中的次数越多,也就是α+β (曝光)越大,它的分布就会变窄,换言之,这个候选项的收益已经非常确定了,不管分布中心靠近0,还是靠近1,都几乎比较确定。用它产生的随机数,基本上就在中心位置附近,接近平均收益。
  • (2)如果一个候选项不但α+β 很大,即分布很窄,而且α/(α+β) 也很大(点击率很高),靠近1,那就确定这是个好的候选项,平均收益很好,每次选择很占优势,就进入利用阶段(Exploitation)。反之则有可能平均分布比较靠近0,几乎再无出头之日
  • (3)如果一个候选的α+β很小(曝光很少),分布很宽,也就是没有被选择太多次,说明这个候选项是好是坏还不确定,那么分布就是跳跃的,这次可能好,下次就可能坏,也就是还有机会被选中,没有完全抛弃。那么用它产生随机数就有可能得到一个较大的随机数,就在排序时被优先输出,这就是所说的探索作用(Exploration)。

c、TS的不足:

  • (1)返回的结果具有一定随机性,不是确定的事件

2、UCB算法的优缺

a、UCB算法的一些基本性质:

  • (1)UCB是一种乐观的算法,选择置信区间上界排序(如果是悲观保守的做法,是选择置信区间下界排序)
  • (2)置信因子c一般是固定的,同一个粒度下一般是相同
  • (3)上界修正项,是根据霍夫丁不等式推导出来的

b、ucb 优点

  • (1)充分利用历史信息进行选择

c、ucb 缺点:

  • (1)算法是确定性的,结果也是固定的,在模型更新前,推荐结果不会改变
  • (2)在先验知识利用方面,仅在置信区间上界利用,也就是部分使用了概率分布
  • (3)相对TS计算量大些

3、TS与UCB对比总结

  • a、UCB算法部分使用概率分布(仅置信区间上界)来量化不确定性,而Thompson sampling基于贝叶斯思想,全部用概率分布来表达不确定性(避免马太效应)
  • b、UCB采用确定的选择策略,可能导致每次返回结果相同(不是推荐想要的),而Thompson Sampling则是随机化策略
  • c、Thompson sampling实现相对更简单,UCB计算量更大(可能需要离线/异步计算),在计算机广告、文章推荐领域,效果与UCB不相上下
  • d、Thompson sampling是逐步完善的模型,从采样的角度讲,TS的探索能力更好

三、参考资源

1、Bandit算法在携程推荐系统中的应用与实践 https://cloud.tencent.com/developer/news/615633
2、Multi-armed bandit and Thompson Sampling in C++ and Python https://www.gcardone.net/2019-04-02-thompson-sampling/
3、汤普森采样(Thompson sampling)https://blog.csdn.net/sinat_37422398/article/details/113381119
4、多臂老虎机之Thompson Sampling https://zhuanlan.zhihu.com/p/84338172
5、Bate分布公式推导 https://zhuanlan.zhihu.com/p/69606875
6、Beta分布与贝叶斯推断 https://zhuanlan.zhihu.com/p/102969748

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习2.神经网络、机器学习、人工智能

目录 深度学习、神经网络、机器学习、人工智能的关系 大白话解释深度学习 传统机器学习 VS 深度学习 深度学习的优缺点 4种典型的深度学习算法 卷积神经网络 – CNN 循环神经网络 – RNN 生成对抗网络 – GANs 深度强化学习 – RL 总结 深度学习 深度学习、神经网络…

ModaHub魔搭社区:WinPin经营大脑助手

产品介绍 智慧经营助手:企业专属的“数据工程师”“BI分析师” WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分析模型 预测模型 决策模型 应用 精准预测

微信视频号下载,个人在用的好使工具,就一个可执行文件,打开直接用

比其它一些工具好使&#xff0c;目前个人在用的好使工具&#xff0c;就一个可执行文件&#xff0c;打开直接用&#xff1a; 先监听&#xff08;安装一下证书&#xff09;&#xff08;图1&#xff09;打开视频号左侧选择地址&#xff0c;点“复制链接”&#xff08;图2&#xf…

二叉树链式结构的实现

文章目录 1.前置说明 2.二叉树的遍历 文章内容 1.前置说明 学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在我们对于二叉树的了解还处于初级阶段&#xff0c;所以我们手动创建一棵简单的二叉树&#xff0c;以便…

文本编辑器Vim常用操作和技巧

文章目录 1. Vim常用操作1.1 Vim简介1.2 Vim工作模式1.3 插入命令1.4 定位命令1.5 删除命令1.6 复制和剪切命令1.7 替换和取消命令1.8 搜索和搜索替换命令1.9 保存和退出命令 2. Vim使用技巧 1. Vim常用操作 1.1 Vim简介 Vim是一个功能强大的全屏幕文本编辑器&#xff0c;是L…

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中&#xff0c;全部都是单线的程序&#xff0c;也就是从头到尾…

Windows商店引入SUSE Linux Enterprise Server和openSUSE Leap

在上个月的Build 2017开发者大会上&#xff0c;微软宣布将SUSE&#xff0c;Ubuntu和Fedora引入Windows 商店&#xff0c;反应出微软对开放源码社区的更多承诺。 该公司去年以铂金会员身份加入Linux基金会。现在&#xff0c;微软针对内测者的Windows商店已经开始提供 部分Linux发…

JavaScript——为什么静态方法不能调用非静态方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

C++中的const成员变量和成员函数

在类中&#xff0c;如果你不希望某些数据被修改&#xff0c;可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似&#xff0c;只需要在声明时加上 const 关键字。初始化 const 成员变量只有…

VUE笔记(六)vue路由

一、路由的简介 1、实现生活中的路由 路由&#xff1a;路由其实就是一个key-value对应关系 路由器&#xff1a;用于管理多个路由关系的设备被称为路由器 2、前端的路由 目前使用的前端项目都是单页面的应用&#xff08;SPA&#xff09;&#xff0c;一个项目中只有一个html页…

网络学生用品商店系统设计与实现(论文+源码)_kaic

摘 要 随着互联网的发展&#xff0c;人们的生活发生了巨大的变化&#xff0c;给人们的生活、工作等方面带来了相当大的提高&#xff0c;电子化成为了节约成本、调高效率的代名词。电子商务是利用微电脑技术和网络通讯技术进行的商务活动&#xff0c;买卖双方通过网络所进行各…

亚马逊云科技 云技能孵化营 初识机器学习

目录 前言 一、课程介绍 二、什么是机器学习 三、机器学习算法进阶过程 四、亚马逊云科技能给我们什么 总结 前言 近期参加了“亚马逊云科技 云技能孵化营”&#xff0c;该孵化营的亚马逊云科技培训与认证团队为开发者准备了云从业者的精要知识及入门课程&#xff0c;帮助…

python 面试题--3(15题)

目录 Python中的生成器是什么&#xff1f;如何创建一个生成器&#xff1f; 解释Python中的递归函数及其使用场景。 Python中的迭代器和可迭代对象有什么区别&#xff1f; 什么是Python中的模块和包&#xff1f;它们有什么区别&#xff1f; 如何在Python中处理异常&#xf…

提升团队效率!探索多款热门一站式团队协作工具

“常见的几种团队协作工具有&#xff1a;Zoho Projects、Slack、Microsoft Teams、Asana、Trello等。” 团队协作已经成为了企业、组织和个人工作的重要组成部分。为了提高工作效率和协同能力&#xff0c;各种团队协作工具应运而生。本文将介绍团队协作工具的功能以及常见的几种…

E. Nastya and Potions - 记忆化搜索

分析&#xff1a; dfs永远都需要记忆化搜索&#xff0c;也算是优化技巧吧&#xff0c;首先不知道哪种方法更加好&#xff0c;本质就是找每种材料的最小费用&#xff0c;能通过几种费用更少的材料代替就可以将费用优化成更小&#xff0c;这也就需要dfs来找最小费用&#xff0c;但…

vue 实现word文档页面内预览docx-preview 和 vue-office

1.先下载引入 npm i docx-preview --save import { renderAsync } from docx-preview;2.使用 fetch(url) .then((response) > {let docData response.blob(); //将文件转换成bolb形式//选择要渲染的元素let childRef document.getElementsByClassName("childRef&qu…

单片机学习-蜂鸣器如何发出声音

硬件电路 软件编写 ①发出声音 #include "reg52.h" typedef unsigned int u16; // 重新定义 类型 typedef unsigned char u8; // 重新定义 类型sbit BEEP P2^5; //定义 P2第五个管教 为BEEP // 延时函数 void delay_time(u16 times) {while(times--); } vo…

从探索到明确,比特币与美股等传统资产相关性如何?

早期阶段&#xff0c;比特币经历了一段摸索和模仿的时期&#xff0c;这是因为当比特币刚刚出现时&#xff0c;比特币的价值和用途在这一阶段并不明确&#xff0c;人们对其性质和潜力还不太了解。 然而&#xff0c;随着时间的推移&#xff0c;比特币去中心化、固定供应上限等特点…

jmeter 性能测试用 csv

⏩很多人在使用 jmeter 做接口测试、自动化测试和性能测试时&#xff0c;都喜欢用 CSV 数据文件设置功能&#xff0c;来读取准备好的测试数据。虽然这种方法并不是最优方案&#xff0c;在我们的性能测试课程中&#xff0c;讲解了更优的方案&#xff0c;但是&#xff0c;没有上过…

红蓝攻防:浅谈削弱WindowsDefender的各种方式

前言 随着数字技术的日益进步&#xff0c;我们的生活、工作和娱乐越来越依赖于计算机和网络系统。然而&#xff0c;与此同时&#xff0c;恶意软件也日趋猖獗&#xff0c;寻求窃取信息、破坏系统或仅仅为了展现其能力。微软Windows&#xff0c;作为世界上最流行的操作系统&…