贝叶斯建模:从先验合理性到后验分布

news2025/1/9 12:38:27

一、说明

        本文探讨贝叶斯模型,首先用摸球游戏展开模型构建步骤,然后讨论分类算法,以及实际操作方法:网格法、二次近似、蒙特卡洛。

二、针对贝叶斯的模型构建

2.1 分支剪枝和假设

        在贝叶斯分析中,我们可以将这个过程想象成照料一个充满数据分支路径的花园。这个花园代表了我们考虑的不同可能性或事件顺序。每条路径代表对观察到的数据的不同假设或解释。

        当我们收集信息并更多地了解实际发生的情况时,我们开始修剪花园里的树枝。正如园丁移除不需要的植物或树枝一样,我们丢弃与我们收集的数据不一致的替代事件序列。这些修剪过的路径代表了在有证据的情况下不太可能的假设。

        最终,通过这个迭代过程,我们的花园中剩下的只是与我们的先验知识和观察到的数据在逻辑上一致的路径。这些剩余的分支代表了与我们所知相符的最合理的解释。通过仔细修剪和选择逻辑一致的路径,我们可以获得一组最能解释观察到的数据的精确假设。

        我们探索各种替代事件序列,根据新数据不断更新我们的信念,并有选择地仅保留逻辑上与证据和我们先验知识一致的假设。

2.2 蓝白蓝摸球

        让我们想象一下这样的情况:我们有一个袋子,里面有四颗弹珠。弹珠可以有两种不同的颜色,蓝色或白色。我们知道总共有四颗弹珠,但我们缺乏有关袋子内颜色具体分布的信息

        我们已经获得了一些证据:通过反复从袋子中抽取弹珠,一次一个,并在每次抽取后将它们放回袋子中,我们创建了三个弹珠的序列。

        首先,让我们关注一个假设。假设袋子里有一颗蓝色大理石和三颗白色大理石。

        我们可以想象可能性像树枝一样散开。总共有 64 条潜在路径需要考虑 (4^3=64)。只有 3 个符合我们对袋子中所装物品的假设以及我们收集的数据。

        对于每个可能的猜想,产生观察数据的方法:

        三个蓝色弹珠和一个白色弹珠的组合提供了获得观察序列的最高概率。这些弹珠的初始计数构成了我们的起点,我们随后将对其进行修改或更新。我们将这些初始计数称为“先验计数”。

        我们从袋子里取出另一个弹珠,这为我们提供了额外的观察结果:这次是蓝色弹珠。我们获取先前的计数,称为先前计数 (0, 3, 8, 9, 0),并根据新的观察结果更新它们。我们只是根据这些新信息修改先前的计数,而不是推测或做出新的假设。

        例如,想象一下大理石工厂的一个人告诉您蓝色大理石不常见。此外,他们还确认每个袋子中至少包含一颗蓝色和一颗白色大理石,这提供了更多信息。根据这一新知识,我们可以再次相应地修改和更新我们的计数。

        让我们通过标准化合理性来创建概率,使所有可能假设的合理性之和等于 1。为了实现这种标准化,您只需将所有乘积相加,每个乘积对应于p可以假设的潜在值,然后将每个乘积除以乘积的总和。

ways = np.array([0, 3, 8, 9, 0])
ways / ways.sum()

# array([0.  , 0.15, 0.4 , 0.45, 0.  ])
  • p称为参数值。这只是对数据的可能解释进行索引的一种方式。
  • 生成数据的值p的相对频率称为似然度。它是通过考虑所有可能的数据并去除那些与观测数据不一致的数据来确定的。
  • 任何特定p的先验合理性就是先验概率
  • 任何特定p的新的、更新的似然性是后验 概率

        想象一下你有一个代表地球的地球仪。您旋转地球仪并在其表面上随机选择一个点。接下来,观察并记录所选点是否对应于水或陆地。

呜呜呜呜呜呜呜呜呜呜

我们有 9 个观测值(6 个水体和 3 个陆地),这个序列就是我们的数据。

 地球。 来源

        为了启动推理过程,我们必须建立某些假设,这些假设构成我们模型的基础。创建基本贝叶斯模型涉及一个由三个步骤组成的设计循环:

  1. 数据故事:首先构建一个叙述,解释观察到的数据是如何生成的。这个讲故事的过程有助于激发模型并为模型提供背景。
  2. 更新:继续通过输入可用数据来训练模型。此步骤涉及将观察到的数据合并到模型中,并根据这些新信息更新其信念或参数。
  3. 评估:与任何统计模型一样,评估和评估其性能至关重要。该评估过程可能会揭示模型是否需要修订或调整,以提高其准确性和实用性。此步骤包括检查模型与数据的拟合度、评估其预测能力以及考虑任何限制或需要改进的领域。

        针对我们的具体情况,我们可以通过以下方式构建故事:

        p代表水的实际比例。当我们旋转地球仪时,观测到的水的概率为p ,观测到的陆地的概率为1-p 。每个旋转都独立于其他旋转。

        在贝叶斯模型开始时,初始合理性被分配给每个可能的结果或假设。这些初始似真性被称为先验似真性。随着新数据的出现,模型会更新这些似真性以生成后验似真性。此更新过程是一种称为贝叶斯更新的学习形式。

        每条虚线代表上一张图中的实线,从左到右、从上到下过渡。每当观察到“W”(代表水)时,似然曲线的峰值就会向较大的p值移动,表明水的比例较大的可能性较高。相反,当观察到“L”(代表土地)时,峰值向相反方向移动,表明p值较小的概率较高,表明土地比例较大。

        目前,重要的是要认识到目标不是验证模型假设的绝对真实性。我们知道模型的假设永远不会与实际的数据生成过程完全一致。因此,从这个意义上来说,审查模型是否完全准确或真实是没有意义的。

        相反,目的是评估模型对于特定目的的适用性或充分性。这通常涉及提出额外的问题并寻求超出模型原始构造的答案。重点转向评估模型服务其预期目标的效果。

2.3 模型的组成部分

        变量是可以具有不同值的符号。第一个感兴趣的变量是p,代表地球上水的比例。p是不可观测的(称为参数),但可以从其他变量推断出来。其他变量是观测到的水和土地数量。

列出变量后,我们必须定义每个变量。在我们的场景中,我们引入两个假设:

  1. 每次抛掷都独立于其他抛掷,
  2. 每次抛掷得到水的概率保持不变

概率论提供了一个确定的解决方案,称为二项式分布。

“水”W 和“地”L 的计数呈二项式分布,每次抛掷“水”的概率为 p。

W 和 L 是观测变量。

stats.binom.pmf(6, n=9, p=0.5)

# 0.16406250000000003

stats.binom.pmf()函数计算二项式分布的概率质量函数 (PMF)。PMF 给出了在给定次数的试验(由 指定)中获得特定次数的成功(在本例中为“6”)的概率,n并且每次试验的成功概率(由 指定p)固定。

因此,通过调用stats.binom.pmf(6, n=9, p=0.5),我们计算在 9 次独立试验(旋转)中准确获得 6 次成功(或 6 个水观察结果)的概率,每次试验成功(获得水)的概率为 0.5 (50%)。

probabilities = [stats.binom.pmf(6, n=9, p=(x+1)*0.1) for x in range(10)]
plt.plot(np.arange(0, 1., 0.1), probabilities, 'bo-')
plt.xlabel('Probability (p)')
plt.ylabel('Probability of 6 successes')
plt.title('Probability of 6 successes in 9 trials for different p values')
plt.show()

不同 p 值的概率。图片由作者提供。

我们有参数 p,它表示对水进行采样的概率。p无法直接观察到(未观察到的 变量)。尽管无法观察到,但定义p仍然至关重要。

对于贝叶斯机打算考虑的任何参数,有必要提供表示初始合理性的先验分布。

我们现在可以获得我们的模型。

W ∼ 二项式(N, p)

N 次试验中的 W 概率为p。

p ∼ 均匀(0, 1)

p在其整个可能的范围内具有均匀的(平坦的)先验。

贝叶斯模型能够将所有先验分布更新为其逻辑结果,从而得到后验分布。后验分布表示给定观测数据的参数的概率分布。在这种特殊情况下,我们将其表示为Pr(p|W, L),它表示每个可能值p的概率,以我们所看到的 W 和 L 的具体观察为条件。

后验分布的精确数学定义源于贝叶斯定理的原理。如果您需要复习贝叶斯定理,您可以参阅我之前详细介绍该主题的文章。

三、朴素贝叶斯分类算法

多项式和高斯朴素贝叶斯的解释

        它表示,考虑到数据, p的任何特定值的概率等于以p为条件的数据的相对合理性和p 的先验合理性的乘积除以Pr(W, L),我将其称为数据的平均概率。

        概率 Pr(W, L) 表示观测数据的平均概率,通过对先验分布求平均值来计算。其目的是对后验分布进行归一化或标准化,确保后验分布内的概率总和(或积分)为 1。

        E 是期望。计算连续值分布的平均值,例如p的无限可能值。

        贝叶斯模型可以被视为具有预定义组件的机器。它包括一个电机,用于处理数据并通过根据观察到的数据调节先验分布来生成后验分布。

        虽然形式条件并不总是可行,但可以引入网格近似、二次近似马尔可夫链蒙特卡罗等数值技术来近似从贝叶斯定理导出的数学。

        这些技术用作计算后验分布的条件引擎,可适应广泛的先验以进行灵活的推理。

四、网格近似

        网格近似是贝叶斯推理中的一种简单调节技术。不是考虑无限数量的参数值,而是使用参数值的有限网格来近似连续后验分布。

        该过程涉及将先验概率乘以网格中每个参数值的似然度来计算后验概率。

由于参数数量不断增加带来的可扩展性问题,网格近似对于复杂建模来说并不实用。

def posterior_grid_approx(grid_points=5, success=6, tosses=9):
    """
    """
    # define grid
    p_grid = np.linspace(0, 1, grid_points)

    # define prior
    prior = np.repeat(5, grid_points)  # uniform
    #prior = (p_grid >= 0.5).astype(int)  # truncated
    #prior = np.exp(- 5 * abs(p_grid - 0.5))  # double exp

    # compute likelihood at each point in the grid
    likelihood = stats.binom.pmf(success, tosses, p_grid)

    # compute product of likelihood and prior
    unstd_posterior = likelihood * prior

    # standardize the posterior, so it sums to 1
    posterior = unstd_posterior / unstd_posterior.sum()
    return p_grid, posterior
points = 20
w, n = 6, 9
p_grid, posterior = posterior_grid_approx(points, w, n)
plt.plot(p_grid, posterior, 'o-', label='success = {}\ntosses = {}'.format(w, n))
plt.xlabel('probability of water', fontsize=14)
plt.ylabel('posterior probability', fontsize=14)
plt.title('{} points'.format(points))
plt.legend(loc=0);

网格近似。图片由作者提供。

五、二次近似

        二次近似是贝叶斯推理中的一种有价值的方法。它基于这样的观察:在一般条件下,后验分布的峰值周围的区域非常类似于高斯分布。这种高斯近似通过仅需要两个参数来简化后验分布:均值(中心)和方差(分布)。

        “二次近似”一词的出现是因为高斯分布的对数形成抛物线,而抛物线是二次函数。因此,该近似表示使用抛物线形状的后验分布的对数。

        通过利用高斯近似,可以用更简单的抛物线表示来有效地近似复杂的后验分布。

data = np.repeat((0, 1), (3, 6))
with pm.Model() as normal_approximation:
    p = pm.Uniform('p', 0, 1)
    w = pm.Binomial('w', n=len(data), p=p, observed=data.sum())
    mean_q = pm.find_MAP()
    std_q = ((1/pm.find_hessian(mean_q, vars=[p]))**0.5)[0]
mean_q['p'], std_q

# (array(0.66666667), array([0.15713484]))
# shows the posterior mean value of p = 0.67
# the standard deviation of the posterior distribution 0.16
# Assuming the posterior is Gaussian, it is maximized at 0.67, 
# and its standard deviation is 0.16

由于我们已经知道后验,让我们比较一下近似值有多好。

norm = stats.norm(mean_q, std_q)
prob = .89
z = stats.norm.ppf([(1-prob)/2, (1+prob)/2])
pi = mean_q['p'] + std_q * z 
pi
# array([0.41553484, 0.91779849]) the lower and upper bounds of the confidence interval.

通过使用stats.norm.ppf,我们计算与所需概率水平的下尾部和上尾部相对应的 z 分数。该[(1-prob)/2, (1+prob)/2]部分确保我们计算双尾区域的 z 分数。

pi变量表示值的数组。std_q它通过将标准差 ( ) 乘以先前计算的 z 分数并加上平均值 ( mean_q['p'])来计算置信区间的下限和上限。

# analytical calculation
w, n = 6, 9
x = np.linspace(0, 1, 100)
plt.plot(x, stats.beta.pdf(x , w+1, n-w+1),
         label='True posterior')

# quadratic approximation
plt.plot(x, stats.norm.pdf(x, mean_q['p'], std_q),
         label='Quadratic approximation')
plt.legend(loc=0, fontsize=13)

plt.title('n = {}'.format(n), fontsize=14)
plt.xlabel('Proportion water', fontsize=14)
plt.ylabel('Density', fontsize=14);

随着数据量的增加,二次逼近的准确性提高。

六、马尔可夫链蒙特卡罗

对于复杂模型(例如具有大量参数的多级模型),网格近似和二次近似可能无法令人满意。由于计算限制,网格近似变得不切实际,并且二次近似可能无法很好地拟合模型。此外,多级模型通常缺乏后验分布的统一函数,因此很难找到最大后验(MAP)估计。

为了解决这些问题,马尔可夫链蒙特卡罗(MCMC)作为一种流行的模型拟合技术应运而生。MCMC 是一个能够处理复杂模型的调节引擎系列,在贝叶斯数据分析的兴起中发挥了重要作用。虽然 MCMC 的历史早于 20 世纪 90 年代,但它因经济实惠的计算机能力的可用性而获得了关注。

MCMC 的独特之处在于其从后验分布中采样的策略,而不是直接计算或近似它。通过采样收集一组参数值,这些值的频率代表后验的似然性。后验分布可以通过构建这些样本的直方图来可视化。

参考来源

        除非另有说明,本内容中的所有图像和公式均直接源自 Richard McElreath 所著的《统计反思,第二版》一书。 奥坎·耶尼贡

·

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

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

相关文章

【C++】多文件的代码规范

算是C嘎嘎入门教程(但至少需要知道HelloWorld怎么写 内容不能说全,因为是想到哪写到哪,再次就是C是真的很杂。 (写完后博文编辑器提示我,本文章可能要20分钟读完,做好心理准备… 1、头文件(*.h)、源文件(*.cpp) 头文件…

bin.zip和bin.tar.gz以及src.zip和src.tar.gz以及rpm和dmg的区别

下载JDK时Java Downloads | Oracle会有很多文件,时间长了容易混淆,在此记录一下。 如上面三张图所示: bin代表二进制文件,是编译后的文件,而src是源码。.tar.gz是linux的压缩包,.zip是windows的压缩包 所以: bin.ta…

11.6哈夫曼树

创建哈夫曼树 经过这一步后,树的集合里就有n个叶子结点 不断从树集合里取出两个权重最小的树合并成一个新树,这时候就是两个根节点并成兄弟到一个新的根节点下,这个新的根节点的权重是两个兄弟的权重和,之后再把 每次合并的时…

32岁华为员工合同不续约,赔偿N+1,额外3个月年终奖,加班费10万+,总共25万多...

各位中生代社区的读者大大们好,我是你们的老朋友大白:) 一直以来,IT行业都有着“程序员是吃青春饭”的说法,这一年龄危机甚至逐渐演变为“45岁退休,35岁换人”的段子。 作为国内知名互联网大厂,华为近几年就曾几次三番…

Bash脚本实现Linux开机自启Redis,Nginx,MySQL等服务

一. MySQL服务自启 在CentOS 7及以上版本,MySQL以服务形式进行启动,运行两行命令即可实现。 systemctl start mysqld systemctl enable mysqld 只需运行一次即可实现MySQL开机自启动 二. 编写bash脚本 使用bash命令编写脚本实现 #!/bin/bashfunction …

linux下实现电脑开机后软件自启动

实现linux的软件自启动,需要四个文件 第一个【displayScreen.desktop】文件,.desktop文件就是一个用来运行程序的快捷方式,也叫启动器,常用来自启动用的文件,内容如下 [Desktop Entry] #要执行的脚本位置 Exec/home/yicaobao/te…

19.7 Boost Asio 传输序列化数据

序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。 序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节…

串台 fit4life | 催吐辟谷减肥药,你没看错这就是我们仨的黑历史!

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 运动博主/食品博士/营养师居然也都曾有程度不同的进食障碍?! 是,这没…

笔记本电脑 禁用/启用 自带键盘

现在无论办公还是生活 很多人都会选择笔记本电脑 但很多人喜欢机械键盘 或者 用一些外接键盘 但是很多时候我们想操作 会碰到笔记本原来的键盘导致错误操作 那么 我们就需要将笔记本原来的键盘禁用掉 我们先以管理员身份运行命令窗口 然后 有两个命令 禁用默认键盘 sc conf…

Apex的addError()显示的消息中实现换行

直接用‘<br/>’是无效的&#xff0c;因为addError默认不转义HTML符号&#xff0c;如果需要转义&#xff0c;应该将第二个参数escape设置为false。不过即使设置了也只对classic页面生效&#xff0c;lightning页面还是无法转义。 官方文档&#xff1a; 参考资料&#xf…

QQ邮箱批量发送

场景 已有用户邮箱,需要批量对他们发送一些广告信息。 完整代码 # coding=gbk import smtplib import csv from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipartdef send_email(msg_from, passwd, msg_to_list, text_content)

服务器数据恢复—误还原虚拟机快照后如何恢复之前的数据?

服务器数据恢复环境&#xff1a; vmfs文件系统&#xff0c;存放的是SqlServer数据库及其他办公文件。 服务器故障&#xff1a; 工作人员误操作还原快照&#xff0c;导致了SqlServer数据库数据丢失。 服务器数据恢复过程&#xff1a; 1、拿到故障服务器的所有磁盘后&#xff0c…

【Linux】拓展:运维面试题,进程管理常见的7大问题

目录 一、如何判断一个程序是单线程还是多线程 二、僵尸进程是什么&#xff0c;有什么危害&#xff0c;如何解决 三、如何找回删掉的文件 四、删除文件以后&#xff0c;空间不释放 五、遇到一个病毒&#xff08;如死循环病毒&#xff09;&#xff0c;解决思路 六、机器开机…

Pytorch里面参数更新前为什么要梯度手动置为0?

因为在一般情况下&#xff0c;每次minibatch之后&#xff0c;都会计算得到一个loss&#xff0c;进而计算该loss关于全局参数的梯度。如果在下一次minibatch 进入模型&#xff0c;计算得到相应的loss和梯度之前&#xff0c;不对优化器的梯度进行置0操作&#xff0c;那么几次batc…

生成式人工智能的“经济学”,The Economic Case for Generative AI#a16z

a16z召集了行业精英&#xff0c;为我们带来了有关生成式AI的洞察。在创造力方面&#xff0c;生成式AI带来了3-4倍量级的成本优势&#xff0c;更多新的需求将诞生。 AI REVOLUTION The Economic Case for Generative AI Martin Casado MixCopilot 大家好&#xff0c;欢迎来到本期…

年营收增长30%起!武汉迪赛威用飞桨助推智慧执法

智慧执法已成为建设文明城市不可忽视的环节。而“智慧执法”这四个字背后&#xff0c;却是社会治理中无穷无尽的需要考虑和衡量的微小细节。有时候&#xff0c;仅仅是一个环节的改进&#xff0c;就能节省极大的人力物力财力。 例如&#xff0c;“随身物品智能识物终端”&#x…

Amazon Fargate使用Seekable OCI 实现更快的容器启动速度

前言 虽然在部署和扩展应用程序时&#xff0c;使用容器进行开发的方式已日趋流行&#xff0c;但仍有一些领域可以改进。扩展容器化应用程序的主要问题之一是启动时间长&#xff0c;尤其是在纵向扩展期间&#xff0c;需要添加较新的实例。此问题可能会对客户体验&#xff08;例如…

python图像处理 —— 实现图像滤镜效果

python图像处理 —— 实现图像滤镜效果 前言一、浮雕二、素描三、怀旧四、水彩画五、水波六、卡通七、流年八、美颜完整代码 前言 随着数字图像处理技术的不断发展&#xff0c;越来越多的人开始关注图像滤镜的应用。其中&#xff0c;使用Python的Opencv库实现图像滤镜效果成为…

零门槛,不等待!立刻领取 Embedding API 密钥及 1 万免费 tokens!

2023 年 10 月 30 号&#xff0c;Jina AI 正式发布了 jina-embeddings-v2&#xff0c;是全球首个唯一支持 8K&#xff08;8192&#xff09;输入长度的开源向量大模型&#xff0c;今天&#xff0c;我们趁热打铁&#xff0c;为企业和开发者提供 Embedding API&#xff0c;即插即用…

Rabbit的高可用机制

RabbitMQ是一个消息中间件&#xff0c;提供了多种高可用机制来确保系统在出现故障时仍能保持可用性。以下是RabbitMQ的一些高可用机制&#xff1a; 镜像队列&#xff08;Mirrored Queues&#xff09;&#xff1a; 作用&#xff1a; 镜像队列可以在集群中复制队列的消息到多个节…