贝叶斯 A/B 测试解释与Python实现

news2024/9/24 15:23:15

一、说明

        A / B测试在各个行业中有许多应用。从试图确定最佳市场群体到医疗药物测试,它具有各种应用,并允许企业根据结果做出决策。有两种常见的A/B检验方法,频率主义方法和贝叶斯方法,两者都是从假设检验的基础出发的。在本文中,我将介绍贝叶斯 A/B 测试方法的解释和实现。本文假设您对 A/B 测试在实践中有一个很好的了解,如果没有,您可以在此处了解有关它和频率主义方法的更多信息。

频率主义者 A/B 测试解释

本文将解释 A/B 测试的频率主义方法,并提供一个示例,其中包含何时以及如何...

towardsdatascience.com

目录

  • 贝叶斯方法
    -贝叶斯机器学习
  • 贝叶斯 A/B 测试
    - 探索漏洞利用困境
  • 问题陈述
  • 贝叶斯强盗/汤普森采样-贝叶斯定理

    -贝塔分布
  • 实现
  • 结束语
  • 资源

一、贝叶斯方法

        贝叶斯方法源于一个主要规则,即一切都是随机变量。例如,如果给定某个数据集,并且要求您查找数据的均值和方差,则输出将只是映射到平均值的数值和映射到方差的数值。但是,在贝叶斯方法中,您不再寻找数字,而是寻找分布。

<span style="background-color:#f2f2f2"><span style="color:#292929">When trying to identify the mean, you can see the difference of approaches below : 
Frequentist : ῦ
Bayesian    : p(ῦ | data)</span></span>

贝叶斯机器学习

如果你从机器学习的角度考虑这个问题,那么你可以看到A / B测试在直觉上与强化学习非常相似。强化学习是指允许智能体在环境中采取行动,以最大化奖励的概念。A / B测试可以被视为一组随机实验,其中随机分区的用户以最大化一些奖励。

例如,如果我们要使用A / B测试对网站上两个按钮的点击率进行建模,则可以将具有不同按钮的不同布局定义为一个操作,并且增加的点击率可以作为奖励。我们希望选择一个能够最大限度地提高点击率的布局。

二、贝叶斯 A/B 测试

        给定一些数据,贝叶斯过程可以通过以下步骤[1]概述:

  1. 识别先验分布(高斯分布、泊松分布、β 分布等),这表示我们在查看任何数据之前对参数(例如 ῦ)的初步理解
  2. 选择一个统计模型(马尔可夫链、贝叶斯强盗等),它反映了我们对给定 x 的信念 ῦ
  3. 观察一些数据后,更新我们的信念并计算后验分布p(ῦ | x)。后验分布是一种概率分布,它描绘了您在观察数据后对参数的更新信念。

        可以想象,观测值 (N) 的数量越大,后验分布的近似越好。但是,如果您的观察次数过多,您将失去大量展示次数,从而为您的网站带来收入。例如,如果您正在为您的网站运行A / B测试,以确定哪个(两个)着陆页产生非常高的点击率,那么您做的样本越多,您向着陆页展示的人就越多,这将减少点击次数,您可能会获得点击次数。因此,具有不太大也不太小的样本量是理想的。

        探索漏洞利用困境

        在强化学习中,当智能体通过评估可能导致积极结果的场景来收集信息时,称为探索。 在探索之后,人们会根据当前已知的信息学习具有最高结果的最佳决策,称为利用。 最好平衡剥削和剥削。

三、问题陈述

        假设您要测试在平台上创建用户的两种不同位置。您的位置 1 位于网站的左上角,而位置 2 位于右上角。两个着陆页之间的唯一区别是注册按钮位于两个不同的位置,其他一切都相同,我们的实验是 iid

3.1 贝叶斯 /汤普森采样

        在我们探索贝叶斯匪算法之前,我们需要对贝叶斯定理和贝塔分布做一些回顾。

        贝叶斯定理

        本质上,后验~可能性*先验

3.2 测试版分布

        这是一个连续概率分布,以区间 [0, 1] 为界,取决于两个参数αβ。 αβ都必须是符号为正的。在不涉及算术的情况下,β分布的PDF可以通过以下等式建模:

        有关更全面的解释和推导,请访问此处的维基百科页面以获取测试版。

        此动画显示了其参数 alpha 和 beta 的各种值的 beta 分布如何变化。来源:来自维基百科的Pabloparsil

        现在我们可以探索贝叶斯土匪/汤普森采样算法。出于本实验的目的,假设我们知道排名 1 和排名 2 中每个位置的点击率概率。当然,在现实世界的例子中,这不会发生,但为了评估我们的算法在这种情况下的表现,假设和p(pos1) = 0.1p(pos2) = 0.55

        由于我们没有任何现有的观察,所以我们不可能有任何先验的信念。为了模拟我们的先验概率,我们可以对 α = 1 和 β=1 使用 beta 分布。这将是 [0,1] 域上的均匀分布。我们选择均匀分布是因为我们不知道结果可能是什么,因此我们对每个可能的值给出相等的概率。请注意,对于行业方案,如果您有可用的先验知识,则应在实现中使用该先验知识。

        对于这种方法,一步中的后验在下一步中成为先验,我们的后验和先验都可以通过 beta 进行建模。

                        <strong> Beta * Data = Beta</strong>
                         |____|        |____|
                         prior         posterior

四、实现

        请注意,由于分布的随机抽样,您的实现的结果可能会略有不同。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import beta

# constants
true_proba = {'L':0.1,'R':0.55}
num_trials = 1000
trial_list = [50, 250, 500]

class BayesianBandit(object):
    def __init__(self, p, alpha = 1, beta = 1, N = 0):
        '''
        params:
            p (Float) : probability bounded between 0 and 1
            alpha (Float) : alpha of the beta distribution, default of 1
            beta (Float) : beta of the beta distribution, default of 1
            N (Integer) : tracks the number of trials, default of 0
        '''
        self.p = p
        self.alpha = alpha
        self.beta = beta
        self.N = N

    def simulate_action(self):
        '''
        This function will simulate the real world of users clicking or different versions of the website.
        '''
        return np.random.random() < self.p

    def sample(self):
        '''
        This function draws a sample from the beta distribution
        '''
        return np.random.beta(self.alpha, self.beta)

    def update(self, x):
        '''
        This function will update the alpha, beta and N for every iteration
        '''
        self.alpha += x
        self.beta += 1 - x
        self.N += 1

def plot(bandits, trial):
    '''
    This function will help visualize the distributions associated to each version
    of the website. It helps in compraison of which version is better.
    
    params:
        bandits (Object) : defined by the BayesianBandit class
        trial (Integer) : number of trials
    '''
    x = np.linspace(0, 1, 200)
    for b in bandits:
        true_prob = b.p
        win_rate = (b.alpha - 1) / b.N
        y = beta.pdf(x, b.alpha, b.beta)
        plt.plot(x, y, label="True p: {}, win rate = {}".format(true_prob, win_rate))
    plt.title("Distributions after {} Trials".format(trial))
    plt.legend()
    plt.show()
    
def experiment():
    bandits = [BayesianBandit(p) for p in list(true_proba.values())]
    
    rewards = np.zeros(num_trials)
    
    for i in range(num_trials):
        # Thompson sampling
        j = np.argmax([b.sample() for b in bandits])

        if i in trial_list:
            plot(bandits, i)

        x = bandits[j].simulate_action()

        # update rewards
        rewards[i] = x

        # update the distribution
        bandits[j].update(x)

    # print total reward
    print("total reward earned:", rewards.sum())
    print("overall win rate:", rewards.sum() / num_trials)
    print("num times selected each bandit:", [b.N for b in bandits])

if __name__ == '__main__':
    experiment()

        如您所见,该算法会快速收敛到最佳分布。根据此实验的结果,很明显,排名 2 的表现优于排名 1,应该是您网站上注册按钮的位置。

五、结束语

        频率主义方法和贝叶斯方法之间的主要区别在于贝叶斯将参数视为随机变量。使用贝叶斯方式进行 A/B 测试的步骤是确定您的先前分布,选择一个统计模型并计算和更新您的后验分布。通常,贝叶斯A/B测试方法比其他传统的A / B测试收敛得更快。这意味着需要较小的样本才能得出结论。

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

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

相关文章

819. 递归求阶乘

链接&#xff1a; 819.递归求阶乘 题目&#xff1a; 请使用递归的方式求 nn 的阶乘。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 nn 的阶乘的值。 数据范围 1≤n≤101≤n≤10 输入样例&#xff1a; 3输出样例&am…

【Linux】查看系统各种信息的常用命令 (CPU、内存、进程、网口、磁盘、硬件、等等)

Linux是一种开源的类Unix操作系统&#xff0c;它有很多不同的发行版&#xff0c;如Ubuntu、CentOS、Debian等。Linux系统提供了很多命令行工具&#xff0c;可以让用户方便地查看和管理系统的各种信息&#xff0c;如硬件配置、内存使用、进程状态、网络连接等。本文将介绍一些常…

解决IDEA项目external libraries依赖包消失的问题

有时候电脑重启后&#xff0c;再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况&#xff0c;只剩下了一个JDK的包 网上说可以通过刷新IDEA的缓存解决&#xff0c;但我试了没有效果&#xff0c;最后使用如下办法解决&#xff1a; 1.删除项目目录下的…

python接口自动化(二十五)--unittest断言——下(详解)

简介 本篇还是回归到我们最初始的话题&#xff0c;想必大家都忘记了&#xff0c;没关系看这里&#xff1a;传送门 没错最初的话题就是登录&#xff0c;由于博客园的登录机制改变了&#xff0c;本篇以我找到的开源免费的登录API为案例&#xff0c;结合 unittest 框架写 2 个用例…

MySQL原理探索——26 备库为什么会延迟好几个小时

在上一篇文章中&#xff0c;介绍了几种可能导致备库延迟的原因。你会发现&#xff0c;这些场景里&#xff0c;不论是偶发性的查询压力&#xff0c;还是备份&#xff0c;对备库延迟的影响一般是分钟级的&#xff0c;而且在备库恢复正常以后都能够追上来。 但是&#xff0c;如果备…

nvm的安装与使用5分钟极速上手

nvm的安装与使用5分钟极速上手 下载 nvm 并安装 nvm官网下载地址推荐下载 nvm-setup.zip 这一个&#xff0c;nvm-noinstall.zip下载之后不用安装&#xff0c;但是得自己配置setting.txt文件&#xff0c;以及环境变量&#xff0c;过于麻烦。nvm-setup.zip 会直接帮我们把环境变…

开篇(变量、运算符、进制)

一、Java简介 JDK&#xff08;JRE&#xff08;JVM & API&#xff09;、Java language&#xff08;tools & APIs&#xff09;&#xff09;&#xff1b;java源文件 → javac的编译 → class类&#xff08;会生成一个或多个class文件&#xff09;&#xff1b; * 使用 jav…

什么是Qt Widgets?一组创建经典桌面应用UI的界面组件!

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Qt Widgets模块提供…

QGIS 根据点位批量出图

背景 在工作中&#xff0c;当有大量项目点位需要结合地图介绍时&#xff0c;则需要批量截图。于是有了今天的教程。 一 工具及材料准备 QGIS 插件 QuickMapServices 点位集合 CSV文件 其他图层文件 二 导入图层 这里根据实际需要导入自己对应格式的就好。 图层-添加…

计算机网络地址

1、ipv4地址 2、网络地址转换 3、子网划分和主机号

Spring MVC 注解实现

注解描述 注解描述Controller用于标记在一个类上&#xff0c;使用它标记的类就是一个SpringMVC Controller 对象&#xff0c;分发处理器将会扫描使用了该注解的类的方法&#xff0c;并检测该方法是否使用了RequestMapping 注解。Controller 只是定义了一个控制器类&#xff0c…

第七章 环境软件的安装

1、nodeJS安装 node -v node版本 安装多个node版本 pnpm i nvm -g nvm -v nvm ls 查看当前安装的版本 nvm install 18.7.0 安装指定的版本 nvm use 18.6.0 切换到别的版本 安装pnpm npm i pnpm -g pnpm -v 安装VSCode 官网直接下载 安装好后 需要配置 按住 CMD +…

基于单片机的老人防摔倒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过LCD1602液晶显示屏显示当前的经纬度及时间的信息&#xff1b;温度传感器采集当前体温&#xff1b;通过GPS接收模块获得当前位置的位置的经度、纬度、时间和高度等信息&#xff1b;通过ADXL345检测老人摔倒的一瞬间重力加速度通…

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述&#xff1a; 从GitHub上克隆仓库到本地&#xff0c;出现错误&#xff1a; unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题&#xff1a;从终端输入&#xff1a; git config --global http.sslVer…

Liunx下的消费者与生产者模型与简单线程池的实现

文章目录 前言1.消费者与生产者模型2.信号量1.信号量的接口2.使用环形队列模拟生产者消费者模型 3.简单实现线程池4.补充说明 前言 本文主要会结束消费者生产者模型&#xff0c;以及简单线程池的实现。 1.消费者与生产者模型 之前我们学了条件变量和互斥等概念。条件变量本质…

vETSTStudio - CAPL - CAN报文未使用位

目录 ChkStart_PayloadGapsObservation 代码示例 ChkStart_PayloadGapsObservationTx 代码示例 ChkStart_PayloadGapsObservationRx 代码示例 我们在做CAN&CANFD通信或者CAN&CANFD网络管理的时候&#xff0c;就会测试到DBC中报文各种信号和位的使用状态&#xff…

从数据采集到智能控制,探寻锂电卷绕机的自动化之路

在锂电池制造过程中&#xff0c;卷绕机被视为关键设备之一。它负责将正负极材料和隔膜按照设计要求卷绕成电芯&#xff0c;是确保锂电池性能和质量的重要环节。为了提高生产效率、确保产品质量&#xff0c;锂电池行业越来越注重引入智能化技术和设备。 图.锂电池生产&#xff0…

spring boot+MySQL福聚苑社区团商品购系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9

尚硅谷Linux学习笔记

文章目录 1. Linux概述2. Linux目录结构3. Linux操作命令3.1 vim编辑命令3.1.1 一般模式3.1.2 编辑模式3.1.3 指令模式 3.2 网络相关命令3.3 系统管理3.4 帮助命令3.4.1 man 获得帮助信息3.4.2 help 获得 shell 内置命令的帮助信息3.4.3 常用快捷键 3.5 文件目录类3.5.1 pwd、e…

ROS:rosbag的使用

目录 一、背景二、概念及作用三、rosbag命令行四、rosbag程序实现4.1C实现4.2Python实现 一、背景 机器人传感器获取到的信息&#xff0c;有时我们可能需要时时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0c;可能…