《贝叶斯方法:概率编程与贝叶斯推断》——1.1 引言

1.1 引言

尽管你已是一个编程老手,但bug仍有可能在代码中存在。于是,在实现了一段特别难的算法之后,你决定先来一个简单的测试用例。这个用例通过了。接着你用了一个稍微复杂的测试用例。再次通过了。接下来更难的测试用例也通过了。这时,你开始觉得也许这段代码已经没有bug了。

如果你这样想,那么恭喜你:你已经在用贝叶斯的方式思考!简单地说,贝叶斯推断是通过新得到的证据不断地更新你的信念。贝叶斯推断很少会做出绝对的判断,但可以做出非常可信的判断。在上面的例子中,我们永远无法100%肯定我们的代码是无缺陷的,除非我们测试每一种可能出现的情形,这在实践中几乎不可能。但是,我们可以对代码进行大量的测试,如果每一次测试都通过了,我们更有把握觉得这段代码是没问题的。贝叶斯推断的工作方式就在这里:我们会随着新的证据不断更新之前的信念,但很少做出绝对的判断,除非所有其他的可能都被一一排除。

1.1.1 贝叶斯思维

和更传统的统计推断不同,贝叶斯推断会保留不确定性。乍听起来,这像一门糟糕的统计方法,难道不是所有的统计都是期望从随机性里推断出确定性吗?要协调这些不一致,我们首先需要像贝叶斯派一样思考。 在贝叶斯派的世界观中,概率是被解释为我们对一件事情发生的相信程度,换句话说,这表明了我们对此事件发生的信心。事实上,我们一会儿就会发现,这就是概率的自然的解释。 为了更清晰地论述,让我们看看来自频率派关于概率的另一种解释。频率派是更古典的统计学派,他们认为概率是事件在长时间内发生的频率。例如,在频率派的哲学语境里,飞机事故的概率指的是长期来看,飞机事故的频率值。对许多事件来说,这样解释概率是有逻辑的,但对某些没有长期频率的事件来说,这样解释是难以理解的。试想一下:在总统选举时,我们经常提及某某候选人获选的概率,但选举本身只发生一次!频率论为了解决这个问题,提出了“替代现实”的说法,从而用在所有这些替代的“现实”中发生的频率定义了这个概率。

贝叶斯派,在另一方面,有更直观的方式。它把概率解释成是对事件发生的信心。简单地说,概率是观点的概述。某人把概率0赋给某个事件的发生,表明他完全确定此事不会发生;相反,如果赋的概率值是1,则表明他十分肯定此事一定会发生。0和1之间的概率值可以表明此事可能发生的权重。这个概率定义可以和飞机事故概率一致。如果除去所有外部信息,一个人对飞机事故发生的信心应该等同于他了解到的飞机事故的频率。同样,贝叶斯概率的定义也能适用于总统选举,并且使得概率(信心)更加有意义:你对候选人A获胜的信心有多少?

请注意,在之前,我们提到每个人都可以给事件赋概率值,而不是存在某个唯一的概率值。这很有趣,因为这个定义为个人之间的差异留有余地。这正和现实天然契合:不同的人即便对同一事件发生的信心也可以有不同的值,因为他们拥有不同的信息。这些不同并不说明其他人是错误的。考虑下面的例子。

1.在抛硬币中我们同时猜测结果。假设硬币没有被做手脚,我和你应该都相信正反面的概率都是0.5。但假设我偷看了这个结果,不管是正面还是反面,我都赋予这个结果1的概率值。现在,你认为正面的概率是多少?很显然,我额外的信息(偷看)并不能改变硬币的结果,但使得我们对结果赋予的概率值不同了。

2.你的代码中也许有一个bug,但我们都无法确定它的存在,尽管对于它是否存在我们有不同的信心。

3.一个病人表现出x、y、z三种症状,有很多疾病都会表现出这三种症状,但病人只患了一种病。不同的医生对于到底是何种疾病导致了这些症状可能会有稍微不同的看法。

对我们而言,将对一个事件发生的信心等同于概率是十分自然的,这正是我们长期以来同世界打交道的方式。我们只能了解到部分的真相,但可以通过不断收集证据来完善我们对事物的观念。与此相对的是,你需要通过训练才能够以频率派的方式思考事物。

为了和传统的概率术语对齐,我们把对一个事件A发生的信念记为P(A),这个值我们称为先验概率。

伟大的经济学家和思想者John Maynard Keynes曾经说过(也有可能是杜撰的):“当事实改变,我的观念也跟着改变,你呢?”这句名言反映了贝叶斯派思考事物的方式,即随着证据而更新信念。甚至是,即便证据和初始的信念相反,也不能忽视了证据。我们用P(A|X)表示更新后的信念,其含义为在得到证据X后,A事件的概率。为了和先验概率相对,我们称更新后的信念为后验概率。考虑在观察到证据X后,以下例子的后验概率。

1.P(A):硬币有50%的几率是正面。P(A|X):你观察到硬币落地后是正面,把这个观察到的信息记为X,那么现在你会赋100%的概率给正面,0%的概率给负面。

2.P(A):一段很长很复杂的代码可能含有bug。P(A|X):代码通过了所有的X个测试;现在代码可能仍然有bug,不过这个概率现在变得非常小了。

3.P(A):病人可能有多种疾病。P(A|X):做了血液测试之后,得到了证据X,排除了之前可能的一些疾病。

在上述例子中,即便获得了新的证据,我们也并没有完全地放弃初始的信念,但我们重新调整了信念使之更符合目前的证据(也就是说,证据让我们对某些结果更有信心)。

通过引入先验的不确定性,我们事实上允许了我们的初始信念可能是错误的。在观察数据、证据或其他信息之后,我们不断更新我们的信念使得它错得不那么离谱。这和硬币预测正相反,我们通常希望预测得更准确。

1.1.2 贝叶斯推断在实践中的运用

如果频率推断和贝叶斯推断是一种编程函数,输入是各种统计问题,那么这两个函数返回的结果可能是不同的。频率推断返回一个估计值(通常是统计量,平均值是一个典型的例子),而贝叶斯推断则会返回概率值。

例如,在代码测试的例子中,如果你问频率函数:“我的代码通过了所有测试,它现在没有bug了吗?”频率函数会给出“yes”的回答。但如果你问贝叶斯函数:“通常我的代码有bug,现在我的代码通过了所有测试,它是不是没有bug了?”贝叶斯函数会给出非常不同的回答,它会给出“yes”和“no”的概率,例如“‘yes’的概率是80%,‘no’的概率是20%。”

这和频率函数返回的结果是非常不同的。注意到贝叶斯函数还有一个额外的信息——“通常的我的代码有bug”,这个参数就是先验信念。把这个参数加进去,贝叶斯函数会将我们的先验概率纳入考虑范围。通常这个参数是可省的,但我们将会发现缺省它会产生什么样的结果。

加入证据 当我们添加更多的证据,初始的信念会不断地被“洗刷”。这是符合期望的,例如如果你的先验是非常荒谬的信念类似“太阳今天会爆炸”,那么你每一天都会被打脸,这时候你希望某种统计推断的方法会纠正初始的信念,或者至少让初始的信念变得不那么荒谬。贝叶斯推断就是你想要的。

让N表示我们拥有的证据的数量。如果N趋于无穷大,那么贝叶斯的结果通常和频率派的结果一致。因此,对于足够大的N,统计推断多多少少都还是比较客观的。另一方面,对于较小的N,统计推断相对而言不稳定,而频率派的结果有更大的方差和置信区间。贝叶斯在这方面要胜出了。通过引入先验概率和返回概率结果(而不是某个固定值),我们保留了不确定性,这种不确定性正是小数据集的不稳定性的反映。

有一种观点认为,对于大的N来说,两种统计技术是无差别的,因为结果类似,并且频率派的计算要更为简单,因而倾向于频率派的方法。在采纳这种观点之前,也许应该先参考Andrew Gelman的论述:

“样本从来都不是足够大的。如果N太小不足以进行足够精确的估计,你需要获得更多的数据。但当N“足够大”,你可以开始通过划分数据研究更多的问题(例如在民意调查中,当你已经对全国的民意有了较好的估计,你可以开始分性别、地域、年龄进行更多的统计)。N从来无法做到足够大,因为当它一旦大了,你总是可以开始研究下一个问题从而需要更多的数据。”

1.1.3 频率派的模型是错误的吗?

不。频率方法仍然非常有用,在很多领域可能都是最好的办法。例如最小方差线性回归、LASSO回归、EM算法,这些都是非常有效和快速的方法。贝叶斯方法能够在这些方法失效的场景发挥作用,或者是作为更有弹性的模型而补充。

1.1.4 关于大数据

出乎意料的是,通常解决大数据预测型问题的方法都是些相对简单的算法。因此,我们会认为大数据预测的难点不在于算法,而在于大规模数据的存储和计算。(让我们再次回顾Gelman的关于样本大小的名言,并且提问:“我真的有大数据吗?”)

中等规模或者更小规模的数据会使得分析变得更为困难。用类似Gelman的话说,如果大数据问题能够被大数据方法简单直接地解决,那么我们应该更关注不那么大的数据集上的问题。

时间: 2024-11-10 11:31:38

《贝叶斯方法:概率编程与贝叶斯推断》——1.1 引言的相关文章

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.3 数据清洗和变量格式化

2.3 数据清洗和变量格式化 本节我们考虑如何将特征矩阵列表menResMat转换为合适的格式以便于数据分析.目前,这些数据值都是字符型,这对于诸如找到参赛者年龄的中位数这样的数据分析是无益的.但是,我们可以利用as.numeric()函数很容易地将年龄转换为数值型.我们需要将整个矩阵都转换为数值型矩阵吗?事实并非如此,比如将参赛者的名字转换为数值型就毫无意义.为此,我们需要创建一个可以允许拥有不同类型变量的数据框.现在我们有6个变量:参赛者姓名.居住地.年龄以及3种类型的时间.正如刚才所说,我

2013年数据分析、数据挖掘、数据科学使用语言排行榜

 最受欢迎的语言仍然是R( KDnuggets 读者中有61%用户在用),python(39%),SQL(37%).SAS仍然稳定在20%之间.增长最快是:Pig/Hive/Hadoop为基础的语言.R.SQL,同时perl, C/C++, 与Unix 在下降.同时我们发现,R与python用户存在一定的重叠. 之前的KDnuggets的调查主要是关注:统计与分析软件,但有时候一个全面与强大的编程语言是需要的.这也是最近一次的KDnuggets调查关注的重点,我们咨询: 在2013年中,什么样的

手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南

前言 网页上的数据和信息正在呈指数级增长.如今我们都使用谷歌作为知识的首要来源--无论是寻找对某地的评论还是了解新的术语.所有这些信息都已经可以从网上轻而易举地获得. 网络中可用数据的增多为数据科学家开辟了可能性的新天地.我非常相信网页爬取是任何一个数据科学家的必备技能.在如今的世界里,我们所需的数据都在互联网上,使用它们唯一受限的是我们对数据的获取能力.有了本文的帮助,您定会克服这个困难. 网上大多数的可用数据并不容易获取.它们以非结构化的形式(HTML格式)表示,并且不能下载.因此,这便需要

一份语言选择指南带你玩数据科学,选出你心中支持的语言

更多深度文章,请关注:https://yq.aliyun.com/cloud 随着大数据时代的到来,网络每天会产生大量的数据,一些行业会对这些数据进行分析并协助企业不断地发展新业务.创建运营模式等,比如电子商务.推荐系统等.那么谁对这些大数据进行分析呢?对应的工作领域是数据科学(Data Science),该领域需要结合先进的统计知识.定量分析能力和编程能力.涉及到编程,大家都会面临一个问题,有太多的编程语言可供选择,那么哪些编程语言适合数据科学领域呢?虽然没有正确答案,但想成为一名成功的数据科

《数据科学实战手册(R+Python)》一第2章 汽车数据的可视化分析(R)

第2章 汽车数据的可视化分析(R) 数据科学实战手册(R+Python) 本章涵盖如下内容. 获取汽车燃料效率数据 为了你的第一个项目准备好R 将汽车燃料效率数据导入R 探索和描述燃料效率数据 进一步分析汽车燃料效率数据 研究汽车的产量以及车型 简介 本书介绍的第一个项目是分析汽车燃料经济数据.我们首先用R对该数据集进行分析.R常常被称为数据科学通用语言,因为它是目前最流行的统计和数据分析语言.在本书前半部分的各个章节中,你将会看到R在数据处理.建模.可视化方面的过人之处,并开发一些有用的脚本,

为何Python攀上数据科学巅峰?调查显示Python超越R

根据KDnuggets 2017年最新调查,Python生态系统已经超过了R,成为了数据分析.数据科学与机器学习的第一大语言.本文对KDnuggets的此项调查结果做了介绍,并补充了一篇文章讲解为何Python能成为数据科学领域最受欢迎的语言. Python vs R:2017 年调查结果 近日,KDnuggets 发起了一项调查,问题是: 你在 2016 年到现在是否使用过 R 语言.Python(以及它们的封装包),或是其他用于数据分析.数据科学与机器学习的工具? 预料之内的是,Python

R语言为Hadoop集群数据统计分析带来革命性变化

R作为开源的数据统计分析语言正潜移默化的在企业中扩大自己的影响力.特有的扩展插件可提供免费扩展,并且允许R语言引擎运行在Hadoop集群之上. R语言是主要用于统计分析.绘图的语言和操作环境.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发.(也因此称为R)现在由"R开发核心团队"负责开发.R是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用 S语言编写的代码都可以不作修改的在R环境下运行.R的语法是来自Scheme. R的源

《R的极客理想——高级开发篇 A》一一1.3 概率基础和R语言

1.3 概率基础和R语言 问题如何用R语言学习概率? 引言R语言是统计语言,概率又是统计的基础,所以可以想到,R语言必然要从底层API上提供完整.方便.易用的概率计算的函数.下面就让R语言帮我们学好概率的基础课.1.3.1 随机变量介绍随机变量(random variable)表示随机现象各种结果的实值函数,定义在样本空间S上.由于它的自变量是随机试验的结果,而随机试验结果的出现具有随机性,因此,随机变量的取值具有一定的随机性.样本空间是随机试验的一切可能的基本结果组成的集合,记为S.样本空间的

为什么R语言是学习数据分析的第一选择

刚开始学习数据科学的人都会面对同一个问题: 不知道该先学习哪种编程语言. 不仅仅是编程语言,像Tableau,SPSS等软件系统也是同样的情况.有越来越多的工具和编程语言,很难知道该选择哪一种. 事实是,你的时间有限.学习一门新的编程语言相当于一项巨大的投资,因此在选择语言时需要有战略性. 很明显,一些语言会给你的投资带来很高的回报(付出的时间和金钱投资).然而其他语言可能是你每年只用几次的纯粹辅助工具. 我给你的建议就是:先学习R语言 专注于一种语言 在说明为什么你应该学习R语言之前,我想强调

《R的极客理想—工具篇》—— 2.1 R语言时间序列基础库zoo

2.1 R语言时间序列基础库zoo 问题 R语言怎么处理时间序列数据? 引言 时间序列分析是一种动态数据处理的统计方法,通过对时间序列数据的分析,我们可以感觉到世界正改变着什么!R语言作为统计分析的利器,对时间序列处理有着强大的支持.在R语言中,单独为时间序列数据定义了一种数据类型zoo,zoo是时间序列的基础,也是股票分析的基础.本节将介绍zoo库在R语言中的结构和使用. 2.1.1 zoo包介绍 zoo是一个R语言类库,zoo类库中定义了一个名为zoo的S3类型对象,用于描述规则的和不规则的