Python贝叶斯分析(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-29 19:52:43

点击下载

作者:(阿根廷) Osvaldo Martin(奥斯瓦尔多·马丁)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python贝叶斯分析

Python贝叶斯分析试读:

前言

贝叶斯统计距今已经有超过250年的历史,其间该方法既饱受赞誉又备受轻视。直到近几十年,得益于理论进步和计算能力的提升,贝叶斯统计才越来越多地受到来自统计学以及其他学科乃至学术圈以外工业界的重视。现代的贝叶斯统计主要是计算统计学,人们对模型的灵活性、透明性以及统计分析结果的可解释性的追求最终造就了该趋势。

本书将从实用的角度来学习贝叶斯统计,不会过多地考虑统计学范例及其与贝叶斯统计之间的关系。本书的目的是借助Python做贝叶斯数据分析,尽管与之相关的哲学讨论也很有趣,不过受限于篇幅,这部分内容并不在本书的讨论范围之内,有兴趣的读者可以通过其他方式深入了解。

这里我们采用建模的方式学习统计学,学习如何从概率模型的角度思考问题,结合模型和数据利用贝叶斯理论推导出逻辑结论。这种建模方式使用的是一种数值计算的方法,其中,模型部分会由基于PyMC3的代码构建。PyMC3是用于贝叶斯统计的Python库,它为用户封装了大量的数学细节和计算过程。贝叶斯方法在理论上源于概率论,这也是为什么许多讲贝叶斯方法的书中都充斥着需要一定数学基础的公式。学习统计学方面的数学知识显然有利于构建更好的模型,同时还能让你对问题、模型和结果有更好的直觉。不过类似PyMC3的库能够帮助你在有限的数学知识水平下学习并掌握贝叶斯统计。在阅读本书的过程中,你将亲自见证这一过程。本书结构

第1章,概率思维——贝叶斯推断指南,介绍了贝叶斯理论及其在数据分析中的意义,并进一步阐述了贝叶斯思维方式的定义以及为什么和如何使用概率来处理不确定性。本章还包含本书其余章节中的一些基本概念。

第2章,概率编程——PyMC3编程指南,从计算的角度重新回顾了前一章提到的概念。这一章中我们将引入PyMC3,并学习如何用它来构建概率模型、对后验进行采样、判断采样是否正确以及分析和解释贝叶斯结果。

第3章,多参和分层模型,介绍了贝叶斯模型中最基础的内容,并在此基础上加入了一些更复杂的内容。我们将学习如何利用多个参数构建并分析模型,以及如何利用分层模型的优势往模型中添加结构。

第4章,利用线性回归模型理解并预测数据,介绍了线性回归模型的广泛应用以及如何将其应用于更复杂的模型。在本章中,我们将学习如何利用线性模型解决回归问题,以及如何处理异常值和多变量的问题。

第5章,利用逻辑回归对结果进行分类,在前一章的基础上对线性模型做了进一步推广,将其应用于解决多输入/多输出分类问题。

第6章,模型比较,讨论了统计和机器学习中一些常见的模型比较难点。我们将学习一些信息测准和贝叶斯因子方面的理论知识,以及如何将其应用于模型比较。

第7章,混合模型,讨论了如何将简单的模型混合在一起构建出更复杂的模型,这种方法将引导我们认识新的模型,并从混合模型的角度重新回顾前面几章中学到的模型。此外,本章还讨论了如何进行数据聚类和如何处理计数类型数据等问题。

第8章,高斯过程,简要讨论了一些非参数统计方面的高级概念作为本书的结束,包括什么是核函数、如何使用线性核回归以及如何将高斯过程用于回归问题。准备工作

本书代码部分使用的是Python 3.5以上版本,因此,建议你使用Python 3的最新版,尽管本书的大部分代码都能在更早的版本上运行(包括Python 2.7,不过可能需要稍微修改)。

安装Python和Python库最简单的方法是使用Anaconda(一个用于科学计算的软件),你可以通过网站https://www.continuum.io/downloads了解和下载Anaconda。安装好Anaconda之后,可以使用conda install库的名称来安装Python库。

本书会用到以下Python库:● Ipython 5.0;● NumPy 1.11.1;● SciPy 0.18.1;● Pandas 0.18.1;● Matplotlib 1.5.3;● Seaborn 0.7.1;● PyMC3 3.0。读者对象

本书的阅读对象为不熟悉贝叶斯统计方法,同时又希望学习如何进行贝叶斯数据分析的本科生、研究生或数据科学家。本书不要求读者有统计学或贝叶斯分析方面的背景,书中尽可能地减少了数学公式的使用,只在我们认为有利于读者理解相关概念的地方用到。此外,所有的概念都通过代码、图表以及文字进行了详细描述。本书假设读者知道如何使用Python进行编程,最好熟悉NumPy、Matplotlib或者Pandas。惯例

在阅读本书过程中,你会看到一些不同的排版方式用于区分不同的信息,以下是这些排版的例子及其解释。

文字中的代码单词、数据表的名字、文件夹名、文件名、文件扩展名、路径、链接、用户输入都按以下方式排版:“为了准确计算HPD,我们将使用plot_post函数”。

代码片段的排版方式如下:n_params = [1, 2, 4]p_params = [0.25, 0.5, 0.75]x = np.arange(0, max(n_params)+1)f, ax = plt.subplots(len(n_params), len(p_params), sharex=True, sharey=True)for i in range(3): for j in range(3): n = n_params[i] p = p_params[j] y = stats.binom(n=n, p=p).pmf(x) ax[i,j].vlines(x, 0, y, colors='b', lw=5) ax[i,j].set_ylim(0, 1) ax[i,j].plot(0, 0, label="n = {:3.2f}\np = {:3.2f}".format(n, p), alpha=0) ax[i,j].legend(fontsize=12)ax[2,1].set_xlabel('$\\theta$', fontsize=14)ax[1,0].set_ylabel('$p(y|\\theta)$', fontsize=14)ax[0,0].set_xticks(x)

所有命令行的输入或输出都按以下方式排版:

conda install NamePackage读者反馈

欢迎读者对本书的反馈,让我们知道你关于这本书的想法——喜欢什么,不喜欢什么。读者反馈对于我们很重要,它可以帮助我们开发读者真正需要的话题。想给我们发送反馈,只需要发送电子邮件至feedback@packtpub.com,并在邮件主题中告知书名。如果你是某个话题的专家,并且有兴趣编写书籍或者给予贡献,请查看我们的作者指导: www.packtpub.com/authors 。客户支持

你现在已经是Packt书籍的荣誉所有者。你还拥有以下权利。下载示例代码

你可以从http://www.packtpub.com的个人账户下载本书的示例代码文件。如果是从别的地方购买的本书,可以访问http://www.packtpub.com/support,注册后,代码文件会直接通过电子邮件发送给你。你也可以通过下列步骤下载代码文件。(1)使用你的邮箱和密码在我们的网站登录并注册。(2)在顶部的SUPPORT标签上悬停光标。(3)单击Code Downloads & Errata按钮。(4)在Search文本框中输入书名。(5)选取代码文件所在的书籍。(6)选择购书途径的下拉菜单。(7)单击Code Download按钮。

你也可以在本书网站的页面单击Code Files按钮下载代码文件。可以通过在Search文本框中输入书名找到本书的网页。你需要登录自己的Packt账户。

文件下载完成后,确保使用下列软件的最新版解压或抽取文件:● WinRAR / 7-Zip for Windows;● Zipeg / iZip / UnRarX for Mac;● 7-Zip / PeaZip for Linux。

本书涉及的代码也可以在GitHub上下载https://github.com/ PacktPublishing/Bayesian-Analysis-with-Python。此外,在https://github. com/PacktPublishing/中还可以查看一系列其他书籍和视频的代码。下载本书的彩图

我们还提供了本书中所有彩色图表的PDF文件,从而帮助你理解印刷造成的差异。你可以从https://www.packtpub. com/sites/default/files/downloads/BayesianAnalysiswithPython_ColorImages.pdf下载。勘误

尽管我们已经非常细心地努力保证内容的正确性,但是错误还是不可避免。如果你在本书中发现错误,不管是文本错误或是代码错误,请告诉我们。你的善举会省去其他用户的烦恼,并帮助我们改进本书的后续版本。如果你发现了任何错误,请访问http://www.packtpub.com/submit-errata报告给我们。你只需选取书名,单击Errata Submission Form链接,输入勘误的具体信息。一旦勘误确定之后,我们会接受你的提交。勘误会上传到我们的网站,或者添加到书籍勘误部分已有的勘误列表下。要查看以前提交的勘误,访问https://www.packtpub.com/books/content/support,在搜索框中输入书名,所需信息便会出现在Errata部分下。此外,你也可以在以下地址查看和提交勘误信息:https://github.com/aloctavodia/BAP。版权

互联网上版权资料的盗版问题一直是所有媒介关心的问题。在Packt,我们一直严肃对待版权和许可的保护问题。如果你在互联网上遇到任何形式的我社出版物的非法副本,请立即把具体地址或者网站名称提供给我们,请联系copyright@packtpub.com,附上可疑的盗版材料的链接。我们非常感谢你在保护作者方面所做的努力,我们会注重提升自我能力,给你带来更有价值的内容。疑问

如果你对本书有任何疑问,可以联系我们:questions@packtpub.com,我们会尽全力解决你的问题。第1章概率思维——贝叶斯推断指南

归根到底,概率论不过是把常识化作计算而已。——皮埃尔—西蒙•拉普拉斯

本章我们将学习贝叶斯统计中的核心概念以及一些用于贝叶斯分析的基本工具。大部分内容都是一些理论介绍,其中会涉及一些Python代码,绝大多数概念会在本书其余章节中反复提到。尽管本章内容有点偏理论,可能会让习惯代码的你感到有点不安,不过这会让你在后面应用贝叶斯统计方法解决问题时容易一些。

本章包含以下主题:● 统计模型;● 概率及不确定性;● 贝叶斯理论及统计推断;● 单参数推断以及经典的抛硬币问题;● 如何选择先验;● 如何报告贝叶斯分析结果;● 安装所有相关的Python库。1.1 以建模为中心的统计学

统计学主要是收集、组织、分析并解释数据,因此,统计学的基础知识对数据分析来说至关重要。分析数据时一个非常有用的技巧是知道如何运用某种编程语言(如Python)编写代码。真实世界里充斥着复杂而杂乱的数据,因此对数据做一些预处理操作必不可少。即便你的数据已经是整理好的了,掌握一定的编程技巧仍然会给你带来很大帮助,因为如今的贝叶斯统计绝大多数都是计算统计学。

大多数统计学导论课程(对非统计学专业的人而言)一般就像展示一本菜谱书,每一种统计方法就是一个菜谱:首先,到统计学的后厨取出一个罐头打开,放点数据上去尝尝,然后不停搅拌直到得出一个稳定的p值,该值最好低于0.05(如果你不知道什么是p值,别担心,本书不会涉及这些概念)。这类课程的目的是教会你如何选择一个合适的罐头。本书采用的是另外一种方式:首先我们也需要点原料,不过这次是自己亲自做的而不是买来的罐头,然后学习如何把新鲜的食材混合在一起以适应不同的烹饪场景。在正式烹饪之前,我们先学点统计学的术语和概念。1.1.1 探索式数据分析

数据是统计学最基本的组成部分。数据的来源多,比如实验、计算机模拟、调查以及观测等。假如我们是数据生成或收集人员,首先要考虑的是要解决什么样的问题以及打算采用什么方法,然后再去着手准备数据。事实上,统计学有一个叫做实验设计的分支专门研究如何获取数据。在这个数据泛滥的年代,我们有时候会忘了获取数据并非总是很便宜。例如,尽管大型强子碰撞加速装置一天能产生上百TB的数据,但其建造却要花费数年的人力和智力。本书假设我们已经获取了数据并且数据是整理好的(这在现实中通常很少见),以便关注到本书的主题上来。如果你想学习如何用Python做数据清洗和分析并进一步学习机器学习,你可以阅读Jake VanderPlas写的《Python Data Science Handbook》一书。

假设我们已经有了数据集,通常的做法是先对其探索并可视化,这样我们就能对手头的数据有个直观的认识。可以通过如下两步完成所谓的探索式数据分析过程:● 描述性统计;● 数据可视化。

其中,描述性统计是指如何用一些指标或统计值来定量地总结或刻画数据,例如你已经知道了如何用均值、众数、标准差、四分位差等指标来描述数据。数 据可视化是指用生动形象的方式表述数据,你大概对直方图、散点图等表现形式比较熟悉。乍看起来,探索式数据分析似乎是在复杂分析之前的一些准备工作,或者是作为一些复杂分析方法的替代品,不过探索式数据分析在理解、解释、检查、总结及交流贝叶斯分析结果等过程中依然有用。1.1.2 统计推断

有时候,画画图、对数据做些简单的计算(比如求均值)就够了。另外一些时候,我们希望从数据中挖掘出一些更一般性的结论。我们可能希望了解数据是怎么生成的,也可能是想对未来还未观测到的数据做出预测,又或者是希望从多个对观测值的解释中找出最合理的一个,这些正是统计推断所做的事情。模型分为许多种,统计推断依赖的是概率模型,许多科学研究(以及我们对真实世界的认识)也都是基于模型的, 大脑不过是对现实进行建模的一台机器,可以观看相关的TED演讲了解大脑是如何对现实进行建模的,网址为http://www.tedxriodelaplata.org/videos/m%C3%A1quina-construye-realidad。

什么是模型?模型是对给定系统或过程的一种简化描述。这些描述只关注系统中某些重要的部分,因此,大多数模型的目的并不是解释整个系统。此外,假如我们有两个模型能用来解释同一份数据并且效果差不多,其中一个简单点,另一个复杂一些,通常我们倾向于更简单的模型,这称作奥卡姆剃刀,我们会在第6章模型比较部分讨论贝叶斯分析与其之间的联系。

不管你打算构建哪种模型,模型构建都遵循一些相似的基本准则,我们把贝叶斯模型的构建过程总结为如下3步。(1)给定一些数据以及这些数据是如何生成的假设,然后构建模型。通常,这里的模型都是一些很粗略的近似,不过大多时候也够用了。(2)利用贝叶斯理论将数据和模型结合起来,根据数据和假设推导出逻辑结论,我们称之为经数据拟合后的模型。(3)根据多种标准,包括真实数据和对研究问题的先验知识,判断模型拟合得是否合理。

通常,我们会发现实际的建模过程并非严格按照该顺序进行的,有时候我们有可能跳到其中任何一步,原因可能是编写的程序出错了,也可能是找到了某种改进模型的方式,又或者是我们需要增加更多的数据。

贝叶斯模型是基于概率构建的,因此也称作概率模型。为什么基于概率呢?因为概率这个数学工具能够很好地描述数据中的不确定性,接下来我们将对其进行深入了解。1.2 概率与不确定性

尽管概率论是数学中一个相当成熟和完善的分支,但关于概率的诠释仍然有不止一种。对于贝叶斯派而言,概率是对某一命题不确定性的衡量。假设我们对硬币一无所知,同时没有与抛硬币相关的任何数据,那么可以认为正面朝上的概率介于0到1之间,也就是说,在缺少信息的情况下,所有情况都是有可能发生的,此时不确定性也最大。假设现在我们知道硬币是公平的,那么我们可以认为正面朝上的概率是0.5或者是0.5附近的某个值(假如硬币不是绝对公平的话),如果此时收集数据,我们可以根据观测值进一步更新前面的先验假设,从而降低对该硬币偏差的不确定性。按照这种定义,提出以下问题都是自然而且合理的:火星上有多大可能存在生命?电子的质量是−319.1×10kg的概率是多大?1816年7月9号是晴天的概率是多少?值得注意的是,类似火星上是否有生命这种问题的答案是二值化的,但我们关心的是,基于现有数据以及我们对火星物理条件和生物条件的了解,火星上存在生命的概率有多大。该命题取决于我们当前所掌握的信息而非客观的自然属性。我们使用概率是因为我们对事件不确定,而不代表事件本身是不确定的。由于这种概率的定义取决于我们的认知水平,有时也被称为概率的主观定义,这也就解释了为什么贝叶斯派总被称作主观统计。然而,这种定义并不是说所有命题都是同等有意义的,仅是承认我们对世界的理解是基于现有的数据和模型,是不完备的。不基于模型或理论去理解世界是不可能的。即使我们能脱离社会预设,最终也会受到生物上的限制:受进化过程影响,我们的大脑已经与世界上的模型建立了联系。我们注定要以人类的方式去思考,永远不可能像蝙蝠或其他动物那样思考。而且,宇宙是不确定的,总的来说我们能做的就是对其进行概率性描述。需要注意的是,不管世界的本原是确定的还是随机的,我们都将概率作为衡量不确定性的工具。

逻辑是指如何有效地推论,在亚里士多德学派或者经典的逻辑学中,一个命题只能是对或者错,而在贝叶斯学派定义的概率中,确定性只是概率上的一种特殊情况:一个正确命题的概率值为1,而一个错误命题的概率值为0。只有在我们拥有充分的数据表明火星上存在生物生长和繁殖时,我们才认为“火星上存在生命”这一命题为真的概率值为1。不过,需要注意的是,认定一个命题的概率值为0通常是比较困难的,这是因为火星上可能存在某些地方还没被探测到,或者是我们的实验有问题,又或者是某些其他原因导致我们错误地认为火星上没有生命而实际上有。与此相关的是克伦威尔准则(Cromwell’s Rule),其含义是指在对逻辑上正确或错误的命题赋予概率值时,应当避免使用0或者1。有意思的是,考克斯(Cox)在数学上证明了如果想在逻辑推理中加入不确定性,我们就必须使用概率论的知识,由此来说,贝叶斯定理可以视为概率论逻辑上的结果。因此,从另一个角度来看,贝叶斯统计是对逻辑学处理不确定性问题的一种扩充,当然这里毫无对主观推理的轻蔑。现在我们已经熟悉了贝叶斯学派对概率的理解,接下来就了解下概率相关的数学特性吧。如果你想深入学习概率论,可以参考阅读Joseph K Blitzstein和Jessica Hwang写的《概率导论》(Introduction to Probability)。

概率值介于[0,1]之间(包括0和1),其计算遵循一些法则,其中之一是乘法法则:

上式中,A和B同时发生的概率值等于B发生的概率值乘以在B发生的条件下A也发生的概率值,其中,表示A和B的联合概率,表示条件概率,二者的现实意义是不同的,例如,路面是湿的概率跟下雨时候路面是湿的概率是不同的。条件概率可能比原来的概率高,也可能低。如果B并不能提供任何关于A的信息,那么,,也就是说,A和B是相互独立的。相反,如果事件B能够给出关于事件A的一些信息,那么根据事件B提供的信息不同,事件A可能发生的概率会变得更高或是更低。

条件概率是统计学中的一个核心概念,接下来我们将看到,理解条件概率对于理解贝叶斯理论至关重要。这里我们换个角度来看条件概率,假如我们把前面的公式调整下顺序,就可以得到下面的公式:

需要注意的是,我们不对0概率事件计算条件概率,因此,分母的取值范围是(0,1),从而可以看出条件概率大于或等于联合概率。为什么要除以p(B)呢?因为在已经知道事件B发生的条件下,我们考虑的可能性空间就缩小到了事件B发生的范围内,然后将该范围内A发生的可能性除以B发生的可能性便得到了条件概率。需要强调的是,所有的概率本质上都是条件概率,世间并没有绝对的概率。不管我们是否留意,在谈到概率时总是存在这样或那样的模型、假设或条件。比如,当我们讨论明天下雨的概率时,在地球上、火星上甚至宇宙中其他地方明天下雨的概率是不同的。同样,硬币正面朝上的概率取决于我们对硬币有偏性的假设。在理解概率的含义之后,接下来我们讨论另一个话题:概率分布。1.2.1 概率分布

概率分布是数学中的一个概念,用来描述不同事件发生的可能性,通常这些事件限定在一个集合内,代表了所有可能发生的事件。在统计学里可以这么理解:数据是从某种参数未知的概率分布中生成的。由于并不知道具体的参数,我们只能借用贝叶斯定理从仅有的数据中反推参数。概率分布是构建贝叶斯模型的基础,不同分布组合在一起之后可以得到一些很有用的复杂模型。

本书会介绍一些概率分布,在第一次介绍某个概率分布时,我们会先花点时间理解它。最常见的一种概率分布是高斯分布,又叫正态分布,其数学公式描述如下:

上式中,μ和σ是高斯分布的两个参数。第1个参数μ是该分布的均值(同时也是中位数和众数),其取值范围是任意实数,即;第2个参数σ是标准差,用来衡量分布的离散程度,其取值只能为正。由于μ和σ的取值范围无穷大,因此高斯分布的实例也有无穷多。虽然数学公式这一表达形式简洁明了,也有人称之有美感,不过得承认公式还是有些不够直观,我们可以尝试用Python代码将公式的含义重新表示出来。首先看看高斯分布都长什么样:import matplotlib.pyplot as pltimport numpy as npfrom scipy import statsimport seaborn as snsmu_params = [-1, 0, 1]sd_params = [0.5, 1, 1.5]x = np.linspace(-7, 7, 100)f, ax = plt.subplots(len(mu_params), len(sd_params), sharex=True, sharey=True)for i in range(3): for j in range(3): mu = mu_params[i] sd = sd_params[j] y = stats.norm(mu, sd).pdf(x) ax[i,j].plot(x, y) ax[i,j].plot(0, 0, label="$\\mu$ = {:3.2f}\n$\\sigma$ = {:3.2f}".format (mu, sd), alpha=0) ax[i,j].legend(fontsize=12)ax[2,1].set_xlabel('$x$', fontsize=16)ax[1,0].set_ylabel('$pdf(x)$', fontsize=16)plt.tight_layout()

上面代码的输出结果如下:

由概率分布生成的变量(例如x)称作随机变量,当然这并不是说该变量可以取任意值,相反,我们观测到该变量的数值受到概率分布的约束,而其随机性源于我们只知道变量的分布却无法准确预测该变量的值。通常,如果一个随机变量服从在参数μ和σ下的高斯分布,我们可以这样表示该变量:

其中,符号~读作服从于某种分布。

随机变量分为两种:连续变量和离散变量。连续随机变量可以从某个区间内取任意值(我们可以用Python中的浮点型数据来表示),而离散随机变量只能取某些特定的值(我们可以用Python中的整型数据来表示)。

许多模型都假设,如果对服从于同一个分布的多个随机变量进行连续采样,那么各个变量的采样值之间相互独立,我们称这些随机变量是独立同分布的。用数学语言描述就是,如果两个随机变量x和y对于所有可能的取值都满足,那么称这两个变量相互独立。

时间序列是不满足独立同分布的一个典型例子。在时间序列中,需要对时间维度的变量多加留心。下面的例子是从http://cdiac.esd.ornl.gov中获取的数据。这份数据记录了从1959年到1997年大气中二氧化碳的含量。我们用以下代码将它写出来:data = np.genfromtxt('mauna_loa_CO2.csv', delimiter=',')plt.plot(data[:,0], data[:,1])plt.xlabel('$year$', fontsize=16)plt.ylabel('$CO_2 (ppmv)$', fontsize=16)

图中每个点表示每个月空气中二氧化碳含量的测量值,可以看到测量值是与时间相关的。我们可以观察到两个趋势:一个是季节性的波动趋势(这与植物周期性生长和衰败有关);另一个是二氧化碳含量整体性的上升趋势。1.2.2 贝叶斯定理与统计推断

到目前为止,我们已经学习了一些统计学中的基本概念和词汇,接下来让我们首先看看神奇的贝叶斯定理:

看起来稀松平常,似乎跟小学课本里的公式差不多,不过这就是关于贝叶斯统计你所需要掌握的全部。首先看看贝叶斯定理是怎么来的,这对我们理解它会很有帮助。事实上,我们已经掌握了如何推导它所需要的全部概率论知识。● 根据前面提到的概率论中的乘法准则,我们有以下式子:● 上式还可以写成如下形式:● 由于以上式子的左边相等,于是可以得到:● 对上式调整下顺序,便得到了贝叶斯定理:

现在,让我们看看这个式子的含义及其重要性。首先,上式表明和并不一定相等,这一点非常重要,日常分析中即使系统学习过统计学和概率论的人也很容易忽略这点。我们举个简单例子来说明为什么二者不一定相等:有两条腿的动物就是人的概率和人有两条腿的概率显然是不同的。几乎所有人都有两条腿(除了某些人因为先天性原因或者意外导致没有两条腿),但是有两条腿的动物中很多都不是人类,比如鸟类。

在前面的式子中,如果我们将H理解为假设,D理解为数据,那么贝叶斯定理告诉我们的就是,在给定数据的条件下如何计算假设成立的概率。不过,如何把假设融入贝叶斯定理中去呢?答案是概率分布。换句话说,H是一种狭义上的假设,我们所做的实际上是寻找模型的参数(更准确地说是参数的分布)。因此,与其称H为假设,不如称之为模型,这样能避免歧义。

贝叶斯定理非常重要,后面会反复用到,这里我们先熟悉下其各个部分的名称:● p(H ):先验;● p(D | H ):似然;● p(H | D):后验;● p(D):证据。

先验分布反映的是在观测到数据之前我们对参数的了解,如果我们对参数一无所知(就跟《权力的游戏》中的雪诺一样),那么可以用一个不包含太多信息的均匀分布来表示。由于引入了先验,有些人会认为贝叶斯统计是偏主观的,然而,这些先验不过是构建模型时的一些假设罢了,其主观性跟似然差不多。

似然是指如何在实验分析中引入观测数据,反映的是在给定参数下得到某组观测数据的可信度。

后验分布是贝叶斯分析的结果,反映的是在给定数据和模型的条件下我们对问题的全部认知。需要注意,后验指的是我们模型中参数的概率分布而不是某个值,该分布正比于先验乘以似然。有这么个笑话:贝叶斯学派就像是这样一类人,心里隐约期待着一匹马,偶然间瞥见了一头驴,结果坚信他看到的是一头骡子。当然了,如果要刻意纠正这个笑话的话,在先验和似然都比较含糊的情况下,我们会得到一个(模糊的)“骡子”后验。不过,这个笑话也讲出了这样一个道理,后验其实是对先验和似然的某种折中。从概念上讲,后验可以看做是在观测到数据之后对先验的更新。事实上,一次分析中的后验,在收集到新的数据之后,也可以看做是下一次分析中的先验。这使得贝叶斯分析特别适合于序列化的数据分析,比如通过实时处理来自气象站和卫星的数据从而提前预警灾害,更详细的内容可以阅读在线机器学习方面的算法。

最后一个概念是证据,也称作边缘似然。正式地讲,证据是在模型的参数取遍所有可能值的条件下得到指定观测值的概率的平均。不过,本书的大部分内容并不关心这个概念,我们可以简单地把它当作归一化系数。我们只关心参数的相对值而非绝对值。把证据这一项忽略掉之后,贝叶斯定理可以表示成如下正比例形式:

理解其中的每个概念可能需要时间和更多的例子,本书也将围绕这些内容展开。1.3 单参数推断

前面,我们学习了几个重要概念,其中有两个是贝叶斯统计的核心概念,这里我们用一句话再重新强调下:概率是用来衡量参数不确定性的,贝叶斯定理就是用来在观测到新的数据时正确更新这些概率以期降低我们的不确定性。

现在我们已经知道什么是贝叶斯统计了,接下来就从一个简单的例子入手,通过推断单个未知参数来学习如何进行贝叶斯统计。1.3.1 抛硬币问题

抛硬币是统计学中的一个经典问题,其描述如下:我们随机抛一枚硬币,重复一定次数,记录正面朝上和反面朝上的次数,根据这些数据,我们需要回答诸如这枚硬币是否公平,以及更进一步这枚硬币有多不公平等问题。抛硬币是一个学习贝叶斯统计非常好的例子,一方面是因为几乎人人都熟悉抛硬币这一过程,另一方面是因为这个模型很简单,我们可以很容易计算并解决这个问题。此外,许多真实问题都包含两个互斥的结果,例如0或者1、正或者负、奇数或者偶数、垃圾邮件或者正常邮件、安全或者不安全、健康或者不健康等。因此,即便我们讨论的是硬币,该模型也同样适用于前面这些问题。

为了估计硬币的偏差,或者更广泛地说,想要用贝叶斯学派理论解决问题,我们需要数据和一个概率模型。对于抛硬币这个问题,假设我们已试验了一定次数并且记录了正面朝上的次数,也就是说数据部分已经准备好了,剩下的就是模型部分了。考虑到这是第一个模型,我们会列出所有必要的数学公式,并且一步一步推导。下一章中,我们会重新回顾这个问题,并借用PyMC3从数值上解决它(也就是说那部分不需要手动推导,而是利用PyMC3和计算机来完成)。通用模型

首先,我们要抽象出偏差的概念。我们称,如果一枚硬币总是正面朝上,那么它的偏差就是1,反之,如果总是反面朝上,那么它的偏差就是0,如果正面朝上和反面朝上的次数各占一半,那么它的偏差就是0.5。这里用参数θ来表示偏差,用y表示N次抛硬币实验中正面朝上的次数。根据贝叶斯定理,我们有如下公式:

这里需要指定我们将要使用的先验和似然分别是什么。让我们首先从似然开始。选择似然

假设多次抛硬币的结果相互之间没有影响,也就是说每次抛硬币都是相互独立的,同时还假设结果只有两种可能:正面朝上或者反面朝上。但愿你能认同我们对这个问题做出的合理假设。基于这些假设,一个不错的似然候选是二项分布:

这是一个离散分布,表示N次抛硬币实验中y次正面朝上的概率(或者更通俗地描述是,N次实验中,y次成功的概率)。下面的代码生成了9个二项分布,每个子图中的标签显示了对应的参数:n_params = [1, 2, 4]p_params = [0.25, 0.5, 0.75]x = np.arange(0, max(n_params)+1)f, ax = plt.subplots(len(n_params), len(p_params), sharex=True, sharey=True)for i in range(3): for j in range(3): n = n_params[i] p = p_params[j] y = stats.binom(n=n, p=p).pmf(x) ax[i,j].vlines(x, 0, y, colors='b', lw=5) ax[i,j].set_ylim(0, 1) ax[i,j].plot(0, 0, label="n = {:3.2f}\np = {:3.2f}".format(n, p), alpha=0) ax[i,j].legend(fontsize=12)ax[2,1].set_xlabel('$\\theta$', fontsize=14)ax[1,0].set_ylabel('$p(y|\\theta)$', fontsize=14)ax[0,0].set_xticks(x)

二项分布是似然的一个合理选择,直观上讲,θ可以看作抛一次硬币时正面朝上的可能性,并且该过程发生了y次。类似地,我们可以把“1−θ”看作抛一次硬币时反面朝上的概率,并且该过程发生了“N−y”次。

假如我们知道了θ,那么就可以从二项分布得出硬币正面朝上的分布。如果我们不知道θ,也别灰心,在贝叶斯统计中,当我们不知道某个参数的时候,就对其赋予一个先验。接下来继续选择先验。选择先验

这里我们选用贝叶斯统计中最常见的beta分布,作为先验,其数学形式如下:

仔细观察上面的式子可以看出,除了Γ部分之外,beta分布和二项分布看起来很像。Γ是希腊字母中大写的伽马,用来表示伽马函数。现在我们只需要知道,用分数表示的第一项是一个正则化常量,用来保证该分布的积分为1,此外,和两个参数用来控制具体的分布形态。beta分布是我们到目前为止见到的第3个分布,利用下面的代码,我们可以深入了解其形态:params = [0.5, 1, 2, 3]x = np.linspace(0, 1, 100)f, ax = plt.subplots(len(params), len(params), sharex=True, sharey=True)for i in range(4): for j in range(4): a = params[i] b = params[j] y = stats.beta(a, b).pdf(x) ax[i,j].plot(x, y) ax[i,j].plot(0, 0, label="$\\alpha$ = {:3.2f}\n$\\beta$ = {:3.2f}".format(a, b), alpha=0) ax[i,j].legend(fontsize=12)ax[3,0].set_xlabel('$\\theta$', fontsize=14)ax[0,0].set_ylabel('$p(\\theta)$', fontsize=14)plt.savefig('B04958_01_04.png', dpi=300, figsize=(5.5, 5.5))

为什么要在模型中使用beta分布呢?在抛硬币以及一些其他问题中使用beta分布的原因之一是:beta分布的范围限制在0到1之间,这跟我们的参数一样;另一个原因是其通用性,从前面的图可以看出,该分布可以有多种形状,包括均匀分布、类高斯分布、U型分布等。第3个原因是:beta分布是二项分布(前面我们使用了该分布描述似然)的共轭先验。似然的共轭先验是指,将该先验分布与似然组合在一起之后,得到的后验分布与先验分布的表达式形式仍然是一样的。简单说,就是每次用beta分布作为先验、二项分布作为似然时,我们会得到一个beta分布的后验。除beta分布之外还有许多其他共轭先验,例如高斯分布,其共轭先验就是自己。关于共轭先验更详细的内容可

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载