《贝叶斯方法:概率编程与贝叶斯推断》一1.2 我们的贝叶斯框架

1.2 我们的贝叶斯框架

我们感兴趣的估计,可以通过贝叶斯的思想被解释为概率。我们对事件A有一个先验估计——例如,在准备测试之前,我们对代码中的漏洞就有了一个先验的估计。

接下来,观察我们的证据。继续拿代码漏洞为例:如果我们的代码通过了X个测试,我们会相应地调整心里的估计。我们称这个调整过后的新估计为后验概率。调整这个估计值可以通过下面的公式完成,这个公式被称为贝叶斯定理,得名于它的创立者托马斯·贝叶斯。

上面的公式并不等同于贝叶斯推论,它是一个存在于贝叶斯推论之外的数学真理。在贝叶斯推论里它仅仅被用来连接先验概率P(A)和更新的后验概率P(A|X)。

1.2.1 不得不讲的实例:抛硬币

几乎所有统计书籍都包含一个抛硬币的实例,那我也从这个开始着手吧。假设你不确定在一次抛硬币中得到正面的概率(剧透警告:它是50%),你认为这里肯定是存在某个比例的,称之为p,但是你事先并不清楚p大概会是多少。

我们开始抛硬币,并记录下每一次抛出的结果——正面或反面,这就是我们的观测数据。一个有趣的问题是:“随着收集到越来越多的数据,我们对p的推测是怎么变化的呢?”

说得更具体一些,当面对着很少量的数据或拥有大量数据时,我们的后验概率是怎么样的呢?下面,我们按照观测到的越来越多的数据(抛硬币数据),逐次更新我们的后验概率图。

在图中我们用曲线表示我们的后验概率,曲线越宽,我们的不确定性越大。如图1.2.1所示,当我们刚刚开始观测的时候,我们的后验概率的变化是不稳定的。但是最终,随着观测数据(抛硬币数据)越来越多,这个概率会越来越接近它的真实值p=0.5(图中用虚线标出)。

注意到图中的波峰不一定都出现在0.5那里,当然它也没有必要都这样。应该明白的是我们事前并不知道p会是多少。事实上,如果我们的观测十分的极端,比如说抛了8次只有1次结果是正面的,这种情况我们的分布会离0.5偏差很多(如果缺少先验的知识,当出现8次反面1次正面时,你真的会认为抛硬币结果是公平的吗?)。随着数据的累积,我们可以观察到,虽然不是每个时候都这样,但越来越多地,概率值会出现在p=0.5。

下面这个实例就简单地从数据角度演示一下贝叶斯推断。

1.2.2 实例:图书管理员还是农民

下面这个故事灵感来自于Daniel Kahneman的《思考,快与慢》一书,史蒂文被描述为一个害羞的人,他乐于助人,但是他对其他人不太关注。他非常乐见事情处于合理的顺序,并对他的工作非常细心。你会认为史蒂文是一个图书管理员还是一个农民呢?从上面的描述来看大多数人都会认为史蒂文看上去更像是图书管理员,但是这里却忽略了一个关于图书管理员和农民的事实:男性图书管理员的人数只有男性农民的1/20。所以从统计学来看史蒂文更有可能是一个农民。

怎么正确地看待这个问题呢?史蒂文实际上更有可能是一个农民还是一个图书管理员呢?把问题简化,假设世上只有两种职业——图书管理员和农民,并且农民的数量确实是图书管理员的20倍。

设事件A为史蒂文是一个图书管理员。如果我们没有史蒂文的任何信息,那么P(A)=1/21=0.047。这是我们的先验。现在假设从史蒂文的邻居们那里我们获得了关于他的一些信息,我们称它们为X。我们想知道的就是P(A|X)。由贝叶斯定理得:

我们知道P(A)是什么意思,那P(X|A)是什么呢?它可以被定义为在史蒂文真的是一个图书管理员的情况下,史蒂文的邻居们给出的某种描述的概率,即如果史蒂文真的是一个图书管理员,他的邻居们将他描述为一个图书管理员的概率。这个值很可能接近于1。假设它为0.95。

P(X)可以解释为:任何人对史蒂文的描述和史蒂文邻居的描述一致的概率。现在这种形式有点难以理解,我们将其做一些逻辑上的改造:

其中~A表示史蒂文不是一个图书管理员的事件,那么他一定是一个农民。现在我们知道P(X|A)和P(A),另外也可知P(~A)=1-P(A)=20/21。现在我们只需要知道P(X|~A),即在史蒂文为一个农民的情况下,史蒂文的邻居们给出的某

种描述的概率即可。假设它为0.5,这样,

结合以上:

这个值并不算高,但是考虑到农民的数量比图书管理员的数量多这么多,这个结果也非常合理了。在图1.2.2中,对比了在史蒂文为农民和史蒂文为图书管理员时的先验和后验概率。

%matplotlib inline
from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt
figsize(12.5, 4)
plt.rcParams['savefig.dpi'] = 300
plt.rcParams['figure.dpi'] = 300
 
colors = ["#348ABD", "#A60628"]
prior = [1/21., 20/21.]
posterior = [0.087,1-0.087]
plt.bar([0, .7], prior, alpha=0.70, width=0.25,
       color=colors[0], label="prior distribution",
       lw="3", edgecolor="#348ABD")
 
plt.bar([0+0.25, .7+0.25], posterior, alpha=0.7,
       width=0.25, color=colors[1],
       label="posterior distribution",
       lw="3", edgecolor="#A60628")
 
plt.xticks([0.20, 0.95], ["Librarian", "Farmer"])
plt.title("Prior and posterior probabilities of Steve's\
         occupation")
plt.ylabel("Probability")
plt.legend(loc="upper left");

在我们得到X的观测值之后,史蒂文为图书管理员的概率增加了,虽然增加的不是很多,史蒂文为农民的可能性依旧是相当大的。

这是一个关于贝叶斯推断和贝叶斯法则的一个简单的实例。不幸的是,除了在人工结构的情况下,要执行更加复杂的贝叶斯推断所使用到的数学只会变得更加的复杂。在后面我们将看到执行这种复杂的属性分析并没有必要。首先,我们必须扩充我们的建模工具。下一章的概率分布,如果你已经对它很熟悉了,可以选择跳过(或只是浏览一下),但是对于不熟悉的读者,下一章是很有必要的。

时间: 2024-11-05 21:34:18

《贝叶斯方法:概率编程与贝叶斯推断》一1.2 我们的贝叶斯框架的相关文章

《贝叶斯方法:概率编程与贝叶斯推断》——导读

前言 贝叶斯方法:概率编程与贝叶斯推断 贝叶斯方法是一种常用的推断方法,然而对读者来说它通常隐藏在乏味的数学分析章节背后.关于贝叶斯推断的书通常包含两到三章关于概率论的内容,然后才会阐述什么是贝叶斯推断.不幸的是,由于大多数贝叶斯模型在数学上难以处理,这些书只会为读者展示简单.人造的例子.这会导致贝叶斯推断给读者留下"那又如何?"的印象.实际上,这曾是我自己的先验观点. 最近贝叶斯方法在一些机器学习竞赛上取得了成功,让我决定再次研究这一主题.然而即便以我的数学功底,我也花了整整3天时间

《贝叶斯方法:概率编程与贝叶斯推断》——第1章 贝叶斯推断的哲学 1.1 引言

第1章 贝叶斯推断的哲学 贝叶斯方法:概率编程与贝叶斯推断 1.1 引言 尽管你已是一个编程老手,但bug仍有可能在代码中存在.于是,在实现了一段特别难的算法之后,你决定先来一个简单的测试用例.这个用例通过了.接着你用了一个稍微复杂的测试用例.再次通过了.接下来更难的测试用例也通过了.这时,你开始觉得也许这段代码已经没有bug了. 如果你这样想,那么恭喜你:你已经在用贝叶斯的方式思考!简单地说,贝叶斯推断是通过新得到的证据不断地更新你的信念.贝叶斯推断很少会做出绝对的判断,但可以做出非常可信的判

《贝叶斯方法:概率编程与贝叶斯推断》——1.4 使用计算机执行贝叶斯推断

1.4 使用计算机执行贝叶斯推断 接下来模拟一个有趣的实例,它是一个有关用户发送和收到短信的例子. 1.4.1 实例:从短信数据推断行为 你得到了系统中一个用户每天的短信条数数据,如图1.4.1中所示.你很好奇这个用户的短信使用行为是否随着时间有所改变,不管是循序渐进地还是突然地变化.怎么模拟呢?(这实际上是我自己的短信数据.尽情地判断我的受欢迎程度吧.) figsize(12.5, 3.5) count_data = np.loadtxt("data/txtdata.csv") n_

《贝叶斯方法:概率编程与贝叶斯推断》一第1章 贝叶斯推断的哲学1.1 引言

第1章 贝叶斯推断的哲学 贝叶斯方法:概率编程与贝叶斯推断 1.1 引言 尽管你已是一个编程老手,但bug仍有可能在代码中存在.于是,在实现了一段特别难的算法之后,你决定先来一个简单的测试用例.这个用例通过了.接着你用了一个稍微复杂的测试用例.再次通过了.接下来更难的测试用例也通过了.这时,你开始觉得也许这段代码已经没有bug了. 如果你这样想,那么恭喜你:你已经在用贝叶斯的方式思考!简单地说,贝叶斯推断是通过新得到的证据不断地更新你的信念.贝叶斯推断很少会做出绝对的判断,但可以做出非常可信的判

《贝叶斯方法:概率编程与贝叶斯推断》一1.4 使用计算机执行贝叶斯推断

1.4 使用计算机执行贝叶斯推断 接下来模拟一个有趣的实例,它是一个有关用户发送和收到短信的例子. 1.4.1 实例:从短信数据推断行为 你得到了系统中一个用户每天的短信条数数据,如图1.4.1中所示.你很好奇这个用户的短信使用行为是否随着时间有所改变,不管是循序渐进地还是突然地变化.怎么模拟呢?(这实际上是我自己的短信数据.尽情地判断我的受欢迎程度吧.) figsize(12.5, 3.5) count_data = np.loadtxt("data/txtdata.csv") n_

《贝叶斯方法:概率编程与贝叶斯推断》——1.5结论

1.5结论 这一章介绍了频率派和贝叶斯派对概率的解释的差别.同时我们也学到了两个重要的分布:Poisson分布和指数分布.这是今后我们构建更多贝叶斯模型的两块重要基石,就像我们在短信接收例子中所做的那样.在第2章中,我们会探讨更多的建模和PyMC策略.

《贝叶斯方法:概率编程与贝叶斯推断》一1.5结论

1.5结论 这一章介绍了频率派和贝叶斯派对概率的解释的差别.同时我们也学到了两个重要的分布:Poisson分布和指数分布.这是今后我们构建更多贝叶斯模型的两块重要基石,就像我们在短信接收例子中所做的那样.在第2章中,我们会探讨更多的建模和PyMC策略.

数学之美:平凡又神奇的贝叶斯方法

◆ ◆ ◆ 前言 这是一篇关于贝叶斯方法的科普文,我会尽量少用公式,多用平白的语言叙述,多举实际例子.更严格的公式和计算我会在相应的地方注明参考资料.贝叶斯方法被证明是非常 general 且强大的推理框架,文中你会看到很多有趣的应用. ◆ ◆ ◆ 1.历史 托马斯·贝叶斯(Thomas Bayes)同学的详细生平在这里.以下摘一段 wikipedia 上的简介: 所谓的贝叶斯方法源于他生前为解决一个"逆概"问题写的一篇文章,而这篇文章是在他死后才由他的一位朋友发表出来的.在贝叶斯写这

《树莓派开发实战(第2版)》——1.1 什么是概率编程

1.1 什么是概率编程 概率编程是一种系统创建方法,它所创建的系统能够帮助我们在面对不确定性时做出决策.许多日常决策涉及在确定无法直接观测的相关因素时的判断能力.历史上,帮助在不确定性下做出决策的方法之一是使用概率推理系统.概率推理将我们对某种情况的认识和概率法则结合起来,确定无法观测的决策关键因素.直到最近,概率推理系统的范围仍然有限,难以应用到许多现实情况中.概率编程是一种新方法,它使概率推理系统更容易构建,适用范围更广. 要理解概率编程,首先要观察不确定性条件下的决策过程和涉及的主观判断.

《树莓派开发实战(第2版)》——1.2 为什么使用概率编程

1.2 为什么使用概率编程 概率推理是机器学习的基础技术之一.Google.Amazon和Microsoft等公司使用它理解可用数据.概率推理已经用于各种各样的应用程序,如预测股价.推荐电影.诊断计算机和检测网络入侵.许多应用都使用了本书中将要学习的技术. 前一小节中,有两个引人注目的要点. 概率推理可用于预测未来.推断过去,以及从过去的事实中学习更好地预测未来. 概率编程是使用图灵完备编程语言作为表示语言的概率推理. 将上面两个要点结合起来,可以得到如下表示. 事实:概率推理+图灵完备=概率编