前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PYTHON 贝叶斯概率推断序列数据概率和先验、似然和后验图可视化

PYTHON 贝叶斯概率推断序列数据概率和先验、似然和后验图可视化

作者头像
拓端
发布于 2025-04-10 08:32:41
发布于 2025-04-10 08:32:41
11300
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

原文链接:http://tecdat.cn/?p=24191

在这篇文章中,我将集中讨论一个给定一个短数据序列的推断概率的例子。我将首先介绍如何用贝叶斯方法进行期望推理的理论,然后在 Python 中实现该理论,以便我们能够处理这些想法。为了使文章更容易理解,我将只考虑一小组候选概率。我能够最小化推理的数学难度,同时仍然能够得到非常好的结果,包括先验、似然和后验图

具体来说,我将考虑以下情况:

  • 计算机程序输出一个由 1和 0组成的随机字符串。例如,一个示例输出可能是:
  • 目标是推断程序用于生成 D 的 0 的概率。我们使用符号 p0 表示 0 的概率。当然这也意味着 1 的概率必须是 p1=1−p0。
  • 如上所述,我们只考虑一组候选概率。具体来说,对上面的数据序列使用候选 p0=0.2,0.4,0.6,0.8。我们如何明智地在这些概率中进行选择,以及我们对结果有多大把握?

概率

我的出发点是写出数列的概率,就好像我知道0或1的概率一样。当然,我不知道这些概率——找到这些概率是我们的目标——但这是先验的有用的地方。例如,我们的示例数据系列的概率,不需要具体说明 p0的值,可以写成:

我使用 p1=1−p0 来写出 p0的概率。我还可以以更紧凑的方式写出上述概率:

上面给出的概率的形式称为 伯努利过程 。我也可以用非常通用的方式来写这个概率,而不是具体关于数据系列 D 或概率 p0,如:

n0 和 n1 表示数据系列中 0 和 1 的数量。

通过替换相关的计数和概率,我可以将一般形式与特定示例联系起来。我首先计算上面给出的数据系列和概率的似然值:

检查结果,我发现 p0 = 0.6的可能性最大,略高于 p0 = 0.8。这里有几点需要注意:

  • 我有最大似然值(在考虑的值中)。我可以提供答案 p0=0.6 并完成。
  • 概率(似然)的总和 不是 1—— 这意味着我没有正确归一化关于 p0的概率质量函数(pmf) ,我试图推断的参数。贝叶斯推理的一个目标是为 p0 提供一个适当归一化的 pmf,称为后验。

进行上述计算的能力使我能够很好地应用贝叶斯定理并获得所需的后验 pmf。在继续讨论贝叶斯定理之前,我想再次强调似然函数的一般形式 :

写下对数似然也很有用:

因为当我在下面创建一些 Python 代码时,这种形式增加了数值稳定性。需要明确的是,我使用的是自然(以 e 为底)对数,即 loge(x)=ln(x)。

先验

我已经决定了部分先验——选择 p0∈{0.2,0.4,0.6,0.8} 作为我将考虑的一组概率。剩下的就是为每个候选 p0 分配先验概率,这样我就可以从正确归一化的先验 pmf 开始。假设先验相等,这是一种推理:

其中使用 A1表示我所做的假设。以上信息构成了先验的 pmf。

贝叶斯定理和后验

接下来,我使用 上面定义的 似然 和 先验pmf 来推断 p0 的潜在值。也就是说,我将使用贝叶斯定理来计算 给定似然和先验的 后验pmf。后验有形式:

换句话说,这是 给定数据序列 D 和假设 A1_的_ p0 _的概率,_我可以使用贝叶斯定理计算后验:

其中先验 P(p0|A1)是红色,似然 P(D|p0) 是黑色,后验 P(p0|D,A1)是蓝色的。

这使我的 p0信息从假设(A1)更新到假设 + 数据(d,A1) :

我可以通过定义边际似然函数来简化贝叶斯定理 :

我可以将贝叶斯定理写成以下形式:

后验部分应该被看作是一组方程,对应于 p0的每个候选值,就像我们对似然和先验所做的那样。

最后,对于理论,我计算了 p0 的后验 pmf。让我们从计算依据开始(我知道上面的似然和先验的所有值):

因此,贝叶斯定理中的分母等于 9.57440e-04。现在,完成后验 pmf 计算。

第一,

第二,

第三,

最后,

回顾

在 Python 代码之前,让我们稍微回顾一下结果。使用数据和贝叶斯定理我已经从 先验的 pmf

到 后验pmf

在贝叶斯设置中,这个后验 pmf 是我们推断 p0的答案,反映了我们对给定假设和数据的参数的知识。通常人们想报告一个单一的数字,但这个后验反映了相当多的不确定性。一些选择是:

  • 报告 p0的 _最大后验_值——在本例中为 0.6。
  • 报告 后验平均值_、 _后验中位数 ——使用_后验_ pmf 进行计算。
  • 包括后验方差或置信区间来描述估计中的不确定性。

然而,报告的推论,沟通不确定性是工作的一部分。在实际操作中,后面的图确实有助于完成任务。所以,让我们离开理论,在 Python 中实现这些想法。

用 Python 编写推理代码

首先,代码导入 numpy 和 matplotlib。使用 ggplot 样式来绘图。

代码语言:javascript
代码运行次数:0
运行
复制
imprt matlli.pplt as plt

# 使用 mapltlb 样式表
try:
    pl.stye.use('gglot')

首先,我创建了一个类来处理 似然。该类接收数据序列并提供一个接口,用于计算给定概率 p0的似然。你能够在方法中找到对数似然方程(对于边际情况需要特别注意)。

代码语言:javascript
代码运行次数:0
运行
复制
class liihd:
    def \_\_int\_\_(elf,dat):
        """二进制数据"""
        slff._possa(data)

    def \_pss\_a(slf,data):
        tep = \[str(x) for x in dta\]
        for s in \['0', '1'\]:
            slf.cnts\[s\] = emp.ount(s)

        iflen(tmp) != sum(ef.conts.valus()):
            rase Exepon("!")

    def \_prcs\_pobites(self, p0):
        """处理数据."""
        n0 = slf.couts\['0'\]
        n1 = slf.conts\['1'\]

        if p0 != 0and p0 != 1:
            # 例子
            log_dta = n0*np.og(p0) + \
                         n1*np.log(1.-p0)
            p\_daa = np.ep(opr\_dta)
        elif p0 == 0and n0 != 0:
            # 如果不是0,p0就不是0
            lordta= -np.inf
            prta = np.exp(lor_daa)
        elif p0 == 0and n0 == 0:
            ## 数据与 p0 = 0一致
            logpr_data = n1*np.log(1.-p0)
            prdat = np.exp(lor_dta)
        elif p0 = 1and n1 != 0:
            # 如果 n1不是0 p0就不是1
            loprta = -np.inf
            paa = np.exp(lgpaa)
        elif p0 == 1and n1 == 0:
            ordta = n0*np.log(p0)
            prta = np.xp(lgp_dta)


    defprb(self, p0):
        """获取数据的概率"""
        p\_at, \_ = sef.pcrbbes(p0)

        retrn prdta

    deflo_pb(sef, p0):
        """获取数据对数概率"""
        _, lp\_at = slf.p\_plie(p0)

        reurn lor_ta

接下来我为先验的 pmf创建一个类 。给定 p0 的候选值列表,默认情况下会创建一个均匀先验。如果需要其他,可以传递先验概率来覆盖此默认值。下面我举个例子。

代码语言:javascript
代码运行次数:0
运行
复制
class prior:
    def \_\_ni\_\_(self, pls, pobs=Nne):
        """先验  
           列表: 允许的 p0’列表
           P_pos: \[可选\]先验概率
        """
        if p_prbs:
            # 确保先验正态
            nom = sum(p_pbs.vaes())
            sel.lopct = {p:np.log(_prbs\[p\]) - \
                                np.log(nrm) for p in p_lst}
        else:
            n = len(p_is)
            sef.lo\_pict = {p:-np.log(n) for p in p\_lst}

    def \_\_iter\_\_(self):
        rturn ier(sre(slf.lopit))

    deflgpob(self, p):
        """获取p 0的对数/先验概率."""
        if p in sef.ogpdt:
            return sf.og_ic\[p\]
        else:
            return -np.inf

    defprob(slf, p):
        """获取p 0的先验概率."""
        if p in slf.gt:
            retun np.ep(sf.o_pt\[p\])
        else:
            reurn 0.0

最后,我为后验构造一个类, 它采用数据和先验类的一个实例构造后验 pmf。plot() 方法提供了一个非常好的推理可视化,包括 先验、 似然 和 后验的图。

请注意,后验的所有计算都是使用对数概率完成的。这对于数值精度来说是绝对必要的,因为概率可能变化很大,可能非常小。

代码语言:javascript
代码运行次数:0
运行
复制
class posir:
    def \_\_it\_\_(slf, da ta, p ior):
        """数据:作为列表的数据样本
        """
        sel.lod = lklio(dta)
        lf.prr = prir
        self.possior()

    def \_pocss\_ostrior(elf):
        """使用传递的数据和先验处理后验。"""

        nuts = {}
        deniaor = -npnf
        for p in slf.prir:
            netor\[p\] = sef.lieioo.logrob(p) + \
                            slf.riorog_rob(p)

            if nurts\[p\] != -np.inf:

                deoior = nplgxp(eoior,
                                           ners\[p\])

        # 保存贝叶斯定理中的分母
        sef.lo_lielod = deoiato

        # 计算后验
        slf.ogict = {}
        for p in slf.pior:
            elf.lopct\[p\] = umros\[p\] - \
                                slf.lmllio

    deflogpob(self, p):
        """获取通过 p 的对数后验概率"""
        if p in self.loic:
            retrn self.ogdt\[p\]
        else:
            retrn -np.inf

    defprob(self, p):
        """获取通过的 p 的后验概率"""
        if p in sl.lo_pdit:
            rtrn np.exp(sef.lct\[p\])
        else:
            rurn 0.0

    defplot(slf):
        """绘制推理结果"""

        f, ax= plt.sbs3, 1, ise=(8, 6), hae=Tre)
        # 从先验中获取候选概率
        x = \[p for p in elf.prir\]

        # 绘制先验ob(p) for p in x\])
        ax\[0\].sem y1,inf='-, meft'', bef = -')


        # 绘图似然
        ax\[1\].stem(x, y, lifm= -',aerf t=ko bafmt=w')

        # 绘图后验
        ax\[2\].tm,y3 if='b-, mmt=bo, sefm-')

例子

让我们测试一下代码。首先,我将复制我们在理论例子中所做的例子,以确保一切正常:

代码语言:javascript
代码运行次数:0
运行
复制
#数据
data1

# 先验
A1 = prior(\[0.2, 0.4, 0.6, 0.8\])

# 后验
pt1 = postior(da1, A1)
plot()

请注意后验 pmf 如何很好地表明 p0=0.6 和 p0=0.8 都有很大的概率——这里存在不确定性!这是有道理的,因为我们只有一个长度为 10 的数据系列,而且只有四个候选概率。

另外,请注意:

  • 先验和后验中所有数字的总和为 1,反映这些是合适的 pmfs。

接下来,让我们考虑设置一个强先验——偏好 p0 的一个值。使用我们的 Python 代码很容易看到这个先验对结果后验的影响:

代码语言:javascript
代码运行次数:0
运行
复制
# 先验- 将按类标准化
A2

# 后验
po2 = ptror(data, A2)
pot()

注意以下几点:

  • 后验和似然不再具有相同的形状。
  • p0=0.2,0.4 的后验概率_相对于它们的先验概率_都 下降了, 因为它们对于提供的数据序列的似然性很低。以类似的方式,p0=0.6,0.8 的后验概率_相对于它们的先验概率_有所 _增加_。

最后,让我们用更多的候选概率(这里是100)和更长的数据序列来做一个例子。

代码语言:javascript
代码运行次数:0
运行
复制
# 设置为0的概率
p0 = 0.2
# 设置 rng 种子为 4
np.andom.ed(4)
# 生成据
da2= np.roie(\[0,1\],  p=\[p0, 1.-p0\])

# 先验
A3 = pir(np.aane)

# 后验
ps3 = porir(daa2, A3)
plot()

注意几点:

  • 后验有一个很好的光滑的形状-我处理的概率看起来像是一个连续的值。
  • 注意这个数据量的似然值(y 轴)很小。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
腾讯云运维干货沙龙-海量运维实践大曝光 (二)
织云平台团队
2017/12/17
8.7K1
腾讯云运维干货沙龙-海量运维实践大曝光 (二)
从鹿晗关晓彤恋情事件看运维的节假日准备工作
织云平台团队
2017/10/10
3K0
从鹿晗关晓彤恋情事件看运维的节假日准备工作
海量服务实践──手Q游戏春节红包项目设计与总结
1. 需求背景 1.1.红包类别 2017年的手Q春节游戏红包共有刷一刷/AR地图/扫福三种,如下图所示: 1.2.体验流程 虽然红包分三种,但在游戏业务侧这边的体验都是一样:用户得到一个红包卡券,打开后展示一个(刷一刷红包)或者多个(AR地图红包)游戏的礼包列表,用户选择一个礼包后弹出区服组件,用户确认对应的区服角色信息后会礼包会在48个小时内发放到账。体验如下: 1.3.后台需求 游戏红包的设计容量为入口卡券页流量80k/s,以上体验流程一共涉及三个后台接口: 礼包列表:用户界面的礼包内容需
小时光
2018/01/29
1.5K0
海量服务实践──手Q游戏春节红包项目设计与总结
腾讯海量数据仓库运维系统 : 鹦鹉螺
willsiom
2017/09/11
2.2K0
腾讯海量数据仓库运维系统 : 鹦鹉螺
腾讯云运维干货沙龙-海量运维实践大曝光 (一)
织云平台团队
2017/12/17
5.3K0
腾讯云运维干货沙龙-海量运维实践大曝光 (一)
8 亿人晒军装,背后的运维技术大揭密!
织云平台团队
2017/08/04
3.8K0
8 亿人晒军装,背后的运维技术大揭密!
看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
本文主要讲述了腾讯SNG在社交网络事业群中,在运维领域的探索和实践。通过不断演进的运维技术,提高了运维效率和成本效益,保障了业务的高可用性。同时,运维团队贯彻“养兵千日用兵一时”的理念,通过标准化、流程化、自动化的运维体系建设,确保在突发事件中能够快速响应和处置。通过不断实践和优化,最终实现了在相册、直播、点播、微信、手Q、应用宝、游戏、新闻、微云、企鹅影业、腾讯云等多个业务领域的运维支撑。
织云平台团队
2018/01/04
1.3K0
看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
从技术角度谈一谈,我参与设计开发的手Q春节红包项目
今年春节期间,QQ以AR技术为支撑、娱乐体验为导向在春节期间推出系列红包并成功刷屏,系列红包包括三大玩法+年初一彩蛋,分别是“LBS+AR天降红包”、刷一刷红包和“面对面”红包,加上“娱乐红包”(明星刷脸红包),共计在春节期间派发了2.5亿现金红包和价值30亿的卡券礼包。根据企鹅智酷提供的数据,手机QQ的用户渗透率在全平台排名第二,为52.9%(第一是微信)。本文将会详细介绍手Q春节红包项目的设计、容灾、运维、架构以及总结。
Java高级架构
2018/08/16
1K0
从技术角度谈一谈,我参与设计开发的手Q春节红包项目
海量服务实践:手 Q 游戏春节红包项目设计与总结(下篇)
接上篇《海量服务实践:手 Q 游戏春节红包项目设计与总结(上篇)》 5.系统保障 第四部分讲述了业务需求的开发,但是否功能开发完成后我们就这样就可放到线上安心睡大觉了呢? 如果出现一部分
吴逸翔
2017/02/09
1.8K0
海量服务实践:手 Q 游戏春节红包项目设计与总结(下篇)
这样的CMDB设计,居然阻止了海量告警对运维的轰炸
梁定安(大梁),运维技术总监,复旦大学客座 DevOps讲师。多年运维、运营开发和 DevOps 的工作经验,曾负责 Qzone、相册等 SNG 社交平台类业务的运维规划与管理,经历了 SNG 运维标准化、自动化、智能化建设的全程。腾讯织云负责人。 1 标题党一回!本文主要介绍运维 CMDB 的设计思路,恰当的 CMDB 设计,对运维效率的提升,如收敛告警和故障自愈等,有着意想不到的效果。 在运维自动化平台的设计理念中,我们一直提倡“减少运维对象”,并将运维对象进行抽象化、模型化、配置化的录入 CMDB 中
织云平台团队
2018/06/19
1.6K0
重磅!腾讯云首次披露自研业务上云历程
导语:传统行业转型的过程中,腾讯向来扮演的是数字化助手的角色,腾讯云作为帮助企业数字化转型的入口,也已经成为腾讯的“独角兽”业务。 然而伴随着云业务的增长,腾讯内部业务如何上云,对于外界来说一直是个秘密。近日,腾讯自研上云项目负责人周小军首次披露,腾讯如何把内部海量的自研业务搬上云端的故事。以下是他的分享内容。 大家好,我今天分享的核心内容有三个: 腾讯自研业务如何从私有云的模式搬迁到公有云; 如何把这些大体量的业务搬到云端; 如何拥抱云原生。 腾讯的业务量非常庞大,社交业务包括QQ和空间的体量有
腾讯技术工程官方号
2019/08/15
15.6K0
重磅!腾讯云首次披露自研业务上云历程
织云Lite V1.5|如何规范管理运维对象
小明所在公司业务发展迅速,设备数量从十多台增加到几十上百台,业务架构也从原先简单的前端、后台,发展出十几个逻辑分支。
织云平台团队
2018/10/29
2K2
腾讯云上快速爆发的腾讯会议
庚子新春,一场突其而来的疫情打乱了中国经济秩序。但经济终要复苏,此时,线上会议服务成为企业远程工作的重要协同工具。
周小军@运维专家
2020/04/22
9.1K0
腾讯云上快速爆发的腾讯会议
腾讯云+运维,助力运维领域技术发展
摘要总结:本文主要介绍了腾讯云和织云联合举办的“腾讯云运维干货”系列沙龙,旨在推进运维领域技术交流发展,让更多的企业完成向云计算的转变。沙龙每期都会邀请腾讯运维领域的专家分享云计算时代的运维思考和实践,同时还会提供腾讯云代金券,助力企业和个人体验腾讯云产品。
腾讯云开发者社区
2017/12/18
5.3K0
腾讯云+运维,助力运维领域技术发展
TEG Cheers | 腾讯技术工程运维技术沙龙精彩回顾(内置现场视频)
7月28日,腾讯技术工程运维技术沙龙-深圳站在腾讯大厦2楼多功能厅举行。现场集结了数十家知名企业的技术开发和运维小伙伴,通过5个小时的思维碰撞,运维人员和导师们一起打造了一场运维人的知识盛宴。 这次,
腾讯技术工程官方号
2018/08/03
9290
裴泽良:海量存储与CDN的自动化运维
架构平台部提供的服务大家都使用过,微信QQ聊天的图片,朋友圈图片,QQ音乐里面的歌曲,腾讯游戏,应用宝里面的app的下载,腾讯云的COS对象存储,点播,直播,以及腾讯视频的点播,直播等产品。目前总存储量超过2EB,储备带宽超过100Tb,使用的服务器超过20W台,建设了1000多个OC机房,我们提供的服务总流量占据了腾讯90%以上的出口流量,负责托管的服务本身的运维人员只有50人。
TEG云端专业号
2018/09/25
8.8K4
春节微信访问突发,存储业务如何平稳度过?
腾讯技术工程官方号
2017/11/30
1.2K0
春节微信访问突发,存储业务如何平稳度过?
海量服务实践:手 Q 游戏春节红包项目设计与总结(上篇)
吴逸翔
2017/02/09
2.2K0
海量服务实践:手 Q 游戏春节红包项目设计与总结(上篇)
自研路由如何解决运维六大挑战?
腾讯内部一些基础服务比如统一鉴权登录、社交关系链、支付被内部很多其他业务调用,调用方往往横跨几个事业群,几十个部门,有数百个模块,上万台设备。
织云平台团队
2018/01/10
1.4K0
自研路由如何解决运维六大挑战?
QQ会员2018春节红包抵扣券项目实践与总结
整体系统是在2017年架构的基础上进行改造扩展,TGW + QZHTTP + RocketMQ + SPP逻辑服务架构 。
小时光
2018/06/08
3.3K3
推荐阅读
相关推荐
腾讯云运维干货沙龙-海量运维实践大曝光 (二)
更多 >
目录
  • 原文链接:http://tecdat.cn/?p=24191
    • 概率
    • 先验
    • 贝叶斯定理和后验
    • 回顾
    • 用 Python 编写推理代码
    • 例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档