复杂性思考:复杂性科学和计算模型(原书第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-03 10:45:48

点击下载

作者:(美)艾伦·B.唐尼(Allen B. Downey)

出版社:机械工业出版社

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

复杂性思考:复杂性科学和计算模型(原书第2版)

复杂性思考:复杂性科学和计算模型(原书第2版)试读:

前言

复杂性科学(Complexity Science)是一个交叉了数学、计算机科学和自然科学的跨学科领域,它主要关注有许多交互组件的复杂系统。

离散化模型是复杂性科学所使用的重要工具之一,它包括网络、图论、元胞自动机和基于智能体的模拟。这些工具在自然和社会科学中非常有用,有时在艺术和人类科学中也非常有用。

有关复杂性科学的概述,请参阅https://thinkcomplex.com/complex。

为什么需要学习复杂性科学呢?主要有以下几个原因:

·复杂性科学是非常有用的,特别是对于自然和社会系统行为的解释。自牛顿以来,以数学为基础的物理学一直关注具有少量组件和简单交互作用的系统。这些方法对于一些应用(如天体力学)是有效的,而对于其他应用(如经济学),则不那么有用。复杂性科学提供了一个多样化和适应性强的建模工具包。

·复杂性科学的许多核心结果令人惊讶。本书反复强调的一个主题是,简单的模型可以产生复杂的行为,因此,我们有时可以用简单的模型来解释现实世界中的复杂行为。

·正如在第1章中所解释的,复杂性科学处于我们所认为的科学实践中慢速转变的中心。

·学习复杂性科学提供了一个学习发展不同的物理和社会系统、应用编程技能并思考科学中的哲学基本问题的机会。

通过阅读本书并进行练习,你将有机会探索你可能不会遇到的主题和思想,基于Python实践编程,并学习更多关于数据结构和算法的知识。本书的特点

技术细节

大多数关于复杂性科学的书都是为大众读者写的,而忽略了技术细节,这让能够运用这些技术的人感到沮丧。本书介绍了代码、数学并解释了模型是如何工作的。

延伸阅读

整本书包括进一步的阅读指南、论文原文(大部分都是电子版)和维基百科上的相关文章及其他来源的文章。

Jupyter笔记本

针对每一章,提供了一个Jupyter笔记本用于记录本章中用到的代码、其他的示例和动画,这些可以帮助你观察模型的作用。

练习题和解答

几乎在每一章的最后都带有解答的练习题,建议你进行练习。

书中的大部分链接都是URL链接。此机制有隐藏链接目标的缺点,但使URL更短并且不那么突兀。更重要的是,我可以在不更新书籍的情况下更新链接。如果你发现链接断开,请告诉我,我将更改链接。本书的读者对象

书中的实例和代码都使用Python编写。你需要了解Python编程并熟悉面向对象的特征,特别是类的使用和定义。

如果你对Python并不熟悉,可以先阅读《Think Python》,这本书比较适合从来没有接触过编程的读者。如果你有其他语言的编程经验,在学习Python时,可选的参考书有很多,网络上也有很多Python资源。

在本书中,使用了NumPy、SciPy和NetworkX,它们都是Python的程序扩展库。最好你熟悉这三个库,后文中我会再做一些介绍。

在此假设读者了解一些数学知识,在本书的某些章节中我使用了对数,在一个实例中使用了向量。从第1版以来的变化

从第2版开始,增加了两章,一章关于进化,另一章关于合作进化。

在第1版中,每章都介绍了一个主题的背景,并提供给读者可以运行的实验。对于第2版,我做了这些实验。每章都以实际例子的形式介绍了实施过程和结果,然后为读者提供了额外的实验。

在第2版中,我使用了一些标准库(如NumPy和NetworkX)当中的库函数来代替我自己的代码,这使结果更加简明有效,并给读者提供了学习Python扩展库的机会。

当然Jupyter笔记本也是新增的。每章都有两个笔记本,一个是本章中的代码、注释和练习题,另一个是习题答案。

最后,所有的支持软件都已更新为Python 3(但大部分不经修改即可在Python 2中运行)。使用代码

本书当中使用的所有代码都可以从GitHub上的Git库中获得:https://thinkcomplex.com/repo。如果你对Git不熟悉,那么它就是一个版本控制系统,允许跟踪组成项目的文件。Git控制下的文件集合称为“仓库”。GitHub是一个操作界面便捷的托管服务平台,为Git仓库提供存储环境。

GitHub主页为存储库提供了几种使用代码的方法:

·可以通过按右上方的Fork按钮来创建仓库的副本。如果没有GitHub账号,则需要创建一个账号。在创建仓库的副本后,你将在GitHub上拥有自己的仓库,可以使用它来跟踪你在使用本书时编写的代码。然后,可以克隆repo,也就是将文件复制到你的计算机上。

·你也可以不用克隆我的仓库,即直接复制我的repo到你的电脑上。这样是不需要GitHub账号的,但是不能将你修改后的文件重新上传到GitHub的仓库中。

·如果你不想用Git,可以通过绿色的“Clone or download”按钮下载你所需要文件的压缩包。

我写本书时使用了Continuum Analytics的Anaconda,这是一个免费的Python发行版,其中包含运行代码所需的所有软件包(还有更多)。我发现Anaconda易于安装。默认情况下,它需要执行用户级安装,而不是系统级安装,因此你不需要管理权限。它对Python 2和Python 3都支持。Anaconda的下载地址为:https://continuum.io/downloads。

仓库包括Python脚本和Jupyter笔记本。如果你之前没有使用过Jupyter笔记本,可以通过链接https://jupyter.org了解。

有三种使用Jupyter笔记本的方法:

在电脑上运行Jupyter

如果已经安装了Anaconda,可以在电脑终端或命令窗口输入以下命令安装Jupyter:$ conda install jupyter

在启动Jupyter之前,使用cd进入包含代码的目录:$ cd ThinkComplexity2/code

启动Jupyter服务器:$ jupyter notebook

启动Jupyter服务器,它会启动默认Web浏览器或在打开的浏览器窗口中创建新选项卡。然后你就可以打开并运行Jupyter笔记本了。

在Binder上运行Jupyter

Binder是一种在虚拟机中运行Jupyter的服务。如果你点击链接https://thinkcomplex.com/binder,将打开Jupyter主页,其中包含本书的笔记以及支持的数据和脚本。

你可以运行脚本并进行修改以运行你自己的代码,但是虚拟机上的只是暂时的。如果虚拟机停止运行,那在虚拟机里对脚本所做的任何修改都会消失。

在GitHub上查看笔记

GitHub提供了笔记本的视图,可以用来阅读笔记本并查看我生成的结果,但无法修改或运行代码。排版约定

斜体(Italic)

表示文中重要小标题、URL和电子邮件地址。

粗体(Bold)

用于定义新术语。

等宽字体(Constant width)

用于程序列表以及段落内部,表示文件名、文件扩展名和程序元素,如变量和函数名称、数据类型、语句和关键字。

等宽粗体(Constant width bold)

显示应由用户按字面输入的命令或其他文本。Safari在线电子书

Safari(前身为Safari Books Online)是一个面向企业、政府、教育工作者和个人的会员制培训和参考平台。

会员可以访问来自超过250家出版商的书籍、培训视频、学习路径、互动教程和精心策划的播放列表,包括O'Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley&Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones&Bartlett和Course Technology等。更多信息,请访问http://oreilly.com/safari。如何联系我们

对于本书如果有任何意见或疑问,请按照以下地址联系本书出版商。

美国:

O'Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

对本书的评论和技术性问题,请发送电子邮件到:

bookquestions@oreilly.com

要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问:

http://www.oreilly.com

我们在Facebook的地址为:http://facebook.com/oreilly。

请关注我们的Twitter动态:http://twitter.com/oreillymedia。

我们的YouTube视频地址:http://www.youtube.com/oreillymedia。第1章 复杂性科学

复杂性科学是一门相对较新的科学。在20世纪80年代,这一领域开始为人所知,并被赋予这样一个名字。但它的新颖并不是因为它将科学的工具应用于一个新的学科,而是因为它使用不同的工具,便于不同种类的工作,最终改变了我们所说的“科学”。

为了阐述这种差异,我们将以一个经典科学的例子开始:假设有人问你为什么行星轨道是椭圆的。你可能会引用牛顿万有引力定律,并编写一个微分方程来描述行星的运行。然后,你可以解微分方程并证明所得行星轨道是椭圆的。证明完毕!

大多数人认为这种解释令人满意。它包括一个逻辑严谨的数学推导,并通过运用万有引力这一普遍原理来解释具体观测的椭圆轨道。

让我用另一种解释来对比一下。假设你来到像底特律这样一个种族隔离的城市,你想知道为什么会这样。如果你做一些研究,你可能会发现Thomas Schelling的一篇论文“Dynamic Model Segregation”,它提出了一个简单的种族隔离模型:

以下是我对Thomas Schelling提出的种族隔离模型的描述,来自本书第9章:

Schelling城市模型是一组单元格,每个单元格代表一座房子。房子由两类“智能体”所占据,分别标识为红色和蓝色,其数量大致相等,大约10%的房子是空的。

在任何时间点,一个智能体可能高兴或不高兴,这取决于邻近的智能体状态。在模型的一个版本中,如果至少有两个像自己一样的邻居,智能体就会感到高兴,如果只有一个或没有这样的邻居,就会感到沮丧。

模拟的过程通过随机选择一个智能体来运行,并检查它是否高兴。如果是高兴的,没有任何反应;如果不是,智能体随机选择一个未占用的单元格并移动。

如果你从一个完全未隔离的城市开始模拟,并在很短的时间内运行模型,类似的智能体就会聚集形成簇。随着时间的推移,簇会不断增长和合并,直到出现少量的大型社区,并且大多数智能体都生活在同质的社区中。

很明显,Schelling模型是高度抽象的,也就是说它是不现实的。我们很容易假设,你可能会说人比行星更复杂,但那是错的。至少仔细想想,行星其实与人一样复杂,特别是有人居住的行星。

这两个系统都很复杂,这两个模型都是简化而来的。例如,在行星运动模型中,我们考虑了行星和太阳之间的引力,而忽略了行星之间的相互作用。在Schelling的模型中,我们包括了基于局部信息的个人决策,忽略了其他方面的人类行为。

但万事皆有性质上的差异,对于行星运动来说,我们可以认为忽略的引力要小于考虑的引力,从而来支持这个模型。我们可以将模型扩展到包含其他交互作用,进而说明这种影响是很小的。对于Schelling的模型来说,很难证明这种简化是正确的。

另一个不同之处是Schelling的模型未使用到任何物理定律,它只使用简单的计算而非数学推导。诸如Schelling之类的模型与经典科学并不一样,很多人觉得它们不那么引人注目,至少一开始是这样。但是,我会尝试说明,这些模型做了有用的工作,包括预测、解释和设计。本书的目标之一就是解释如何做到这一点。1.1 范式转变

复杂性科学不仅仅是一套不同的模型集合,它也是在逐步改变判断模型的标准,以及被认为可接受的模型类型。

例如,经典模型往往是基于定律的,以方程的形式表述,并通过数学推导求解。属于复杂性范畴的模型通常基于规则,以计算指令的形式描述,通过模拟而非分析求解。

并非所有人都对这些模型感到满意。例如,在Sync一书中,Steven Strogatz描述了关于萤火虫自发同步模型。他提出了一个模拟实验来证明这一现象,但接下来写道:

我针对其他随机初始条件和其他数量的振荡器,重复模拟了很多次,每次都会同步。现在的挑战是证明这一点。只要有一个可靠的证明,才能演示同步是必然的,这种方式计算机是无法做到的,最好的证明阐明为什么这是必然的。

Strogatz是一名数学家,所以他对证明的热情是可以理解的,但是他的证明并没有解决这个现象中对我来说最有趣的部分。为了证明“同步是必然的”,Strogatz做了几个简化的假设,特别指出每只萤火虫都能彼此看到。

依我看来,要是能解释清楚“在萤火虫看不到彼此的前提下,整个山谷的萤火虫是如何同步的”会更有趣一些。这种全局行为是如何从局部交互中产生的正是第9章的主题。对这些现象的解释通常使用基于智能体的模型,这些模型能探索(这种方式在数学分析中很难或不可能)允许或禁止同步的条件。

我是一名计算机科学家,因此我热衷于研究计算模型。我并不是说Strogatz是错误的,而是人们对该问什么问题以及用什么工具来解答这些问题持有不同的观点。这些观点是基于价值判断的,因此,我们没任何理由要求达成一致。

然而,科学家们对哪些模型可被视为是好的科学,哪些是边缘科学、伪科学或根本不是科学,存在着粗略的共识。

本书的一个中心论点是,这种共识所依据的标准是随着时间的推移而变化的,而复杂性科学的出现反映了这些标准的逐渐变化。1.2 科学模型的轴线

我之前曾经说过,经典模型是基于物理定律的,它以方程的形式表述,并通过数学分析求解;与之相反,复杂系统模型通常基于简单的规则并以计算指令的形式实现的。

我们可以把这种趋势看作沿着两个坐标轴随时间的变化:

基于方程式→基于模拟

分析→计算

复杂性科学与传统的区别体现在好几个方面。我把它们呈现在这里是为了便于了解后面的内容,但只有看到了本书后面的示例才能更好地理解这些差别。

连续→离散

经典模型往往基于连续数学,如微积分;复杂系统的模型通常基于离散数学,包括图和元胞自动机。

线性→非线性

经典模型通常是线性的,或者用非线性系统的线性近似;复杂性科学则更多地使用非线性模型。

确定性→随机性

经典模型通常是确定性的,这反映了第5章所讨论的哲学决定论的基础;复杂的模型通常包含随机性。

抽象→具体

在经典模型中,行星是质点质量,飞机是无摩擦的,而牛是球形的(参见https://thinkcomplex.com/cow)。诸如此类的简化对于分析通常是必要的,但计算模型可能更接近现实。

一个、二个→许多

经典模型通常限定在较少数量的交互元素上。例如,在天体力学中,二体问题可以解析求解,三体理论就不行。复杂性科学通常处理的是更大的复合体。

同构→异构

在经典模型中,分量和相互作用趋于相同;复杂模型通常会包含异构性。

这些都是泛泛之论,我们不应该过于严肃地看待它们。我并不是要贬低古典科学。更复杂的模型不一定更好,事实上,它通常会更差。

我也并不是说这些变化是突然的或完全的。相反,在被认为是可以接受的、受人尊敬的工作的前沿领域,有一种逐渐的迁移。一些过去受到怀疑的工具现在很普遍,一些在过去得到广泛接受的模型现在被仔细考量。

例如,当Appel和Haken在1976年证明四色定理时,他们使用一台计算机枚举出1936个特例,在某种意义上,这些例子是他们证明的引理。当时,许多数学家认为这个定理没有得到真正的证明。现在计算机辅助证明很常见并且被普遍接受。

与之相反,大量的经济学分析是基于人类行为模型的,称为“经济人”。几十年来,基于该模型的研究一直受到高度重视,尤其是涉及数学技巧的研究。近年来,人们对该模型持怀疑态度,包括不完整信息和有限理性在内的模型成为研究热点。1.3 不同的模型用于不同的目的

复杂模型通常适用于不同的目的和解释:

预测→解释

Schelling的种族隔离模型可能有助于解释一个复杂的社会现象,但其对于预测来说却没有帮助。另一方面,一个简单的天体力学模型可以预测未来数年的日食,并能够精确到秒。

现实主义→工具主义

古典模型借助于现实主义的解释。例如,大多数人都接受电子是真实存在的这一论断。工具主义则认为,即使模型所假设的实体不存在,模型也是有用的。George Box写过一篇可以看作工具主义的座右铭的论文“All models are wrong,but some are useful”(所有模型都是错的,但有些模型是有用的)。

简化论→整体论

简化论认为,系统的行为可以通过理解其组件来解释。例如,化学元素周期表就是典型的简化论,因为它用原子中的电子这一简单模型解释了化学元素的行为。整体论则认为,在系统层面出现的某些现象在组件层面上其实是不存在的,无法在组件级别进行解释。

第4章将介绍解释模型,第6章将讨论工具主义,第8章将介绍整体论。1.4 复杂的工程

我一直在科学背景下讨论复杂系统,但复杂性也是社会系统工程与组织变革的原因与结果:

中心化(集中式)→去中心化(分散式)

从概念上来说,集中式系统的概念简单且易于分析,但分散式系统具有更强的健壮性。例如,在万维网中,客户端向中央服务器发送请求;如果服务器宕机,则服务就不可用了。在对等网络中,每个节点既是客户端也是服务器。要让服务宕机,需要每个节点都宕机才行。

一对多→多对多

在许多通信系统中,广播服务正在被允许用户彼此通信、创建、共享和修改内容的服务所增强,有时甚至被取代。

自顶向下→自底向上

在社会、政治和经济制度中,通常情况下由中央组织的活动已经下放给了基层。甚至是军队,其作为等级结构的典型例子,也在向下放指挥和控制的方向迈进。

分析→计算

在经典工程中,可行的设计空间受限于我们的分析能力。比如,设计埃菲尔铁塔是可行的,因为Gustave Eiffel开发出了新颖的分析技术,特别是用来处理风力荷载的技术。现在,计算机辅助设计和分析工具使得构建出几乎任何可以想象到的东西都成为可能。Frank Gehry的毕尔巴鄂古根海姆博物馆是我最喜欢的例子。

隔离→交互

在经典工程中,大型系统的复杂度是通过隔离组件和减少交互来管理的。这依然是一个很重要的工程原则。然而,廉价计算的可用性提升了组件间具有复杂交互的系统设计的可行性。

设计→搜索

有时认为工程是在一系列可能的设计空间中搜索解决方案。搜索过程越来越自动化了。比如,遗传算法会探索大的设计空间并发现人类工程学家想象不到的解决方案。最终的遗传算法进化论所产生的设计则违背了人类工程学的原则。1.5 复杂性思维

我们现在有点偏离主题,但我在科学模型标准中所假设的变化与在20世纪中逻辑和认知论的发展有关。

亚里士多德逻辑学→多值逻辑

在传统逻辑中,任何命题非真即假。这个系统适用于类似数学的证明,但对于现实世界的很多实际应用(以一种戏剧化的方式)却不适用。备选方案包括多值逻辑、模糊逻辑和其他用于处理不确定性、模糊性和不确定性的系统。Bart Kosko在Fuzzy Thinking一书中对其中一些系统进行了讨论。

频率论概率→贝叶斯主义

贝叶斯概率已有几个世纪的历史了,但直到最近才被广泛使用,这得益于廉价计算的可用性和人们主观上对概率的接受度。Sharon Bertsch McGrayne在The Theory That Would Not Die中谈到了这段历史。

客观→主观

启蒙运动和哲学现代主义的基础是对客观真理的信仰,即真理是独立存在的,与其信奉者无关。20世纪,包括量子力学、哥德尔的不完备理论、库恩的科学史研究等领域的发展引起了人们对“硬科学”和数学中似乎不可避免的主观性的关注。Rebecca Goldstein以不完备的方式展示了哥德尔证明的历史背景。

物理定律→理论→模型

有些人会区分定律、理论和模型。把某物称为定律意味着它在客观上是真实的、不可改变的。“理论”表明它是可以修改的;“模型”承认这是一个基于简化和近似的主观选择。

我认为它们都是一样的。一些被称为定律的概念实际上是定义,而另一些实际上是断言,即某个模型特别好地预测或解释了系统的行为。

确定性→非确定性

确定性论认为所有事件都不可避免地由之前的事件所引起的。非确定性的形式包括随机性、概率因果关系和基本不确定性。

这些趋势不普遍也不完备,但是舆论的中心正在沿着这些轴转移。作为证明,看看人们对Thomas Kuhn所著的The Structure of Scientific Revolutions的反应吧。这本书刚出版时曾遭到抨击,现在则几乎没有什么争议。

这些趋势既是复杂性科学的起因,也是结果。例如,现在越来越多的人更容易接受高度抽象的模型,因为对每个系统都应该有一个唯一的、正确的模型的期望降低了。与之相反,复杂系统的发展对确定性和与之相关的物理定律提出了挑战。

本章概述了书中将要出现的主题,但在你看到示例之前,并不是所有的主题都易于理解。当你读完这本书的时候,你可能会发现再读一遍本章会很有帮助。第2章 图

接下来的三章是关于系统的,它们由组件和组件之间的连接组成。例如,在社交网络中,组件部分是人,连接代表友谊、业务关系等。在食物链网中,组件是物种,连接代表捕食者和猎物之间的关系。

在本章中,我将介绍NetworkX,这是一个用于构建这类系统模型的Python包。我们从Erdös-Rényi模型开始,这是一个具有有趣的数学性质的模型。在下一章中,我们将继续讨论对于解释现实系统更有用的模型。2.1 图是什么

对大多数人来说,图是数据集的可视化表示,如条形图或股价随时间变化的曲线图。但这不是本章谈及的内容。

在本章提及的图是一种抽象,用于表示一个包含离散的、相互连接的元素的系统。元素通过节点(也称为顶点)表示,相互之间的连接由边表示。

比如,你可以用每个城市的节点和城市之间的每条道路的边来表示路线图。还可以这样来表示社交网络:一个节点代表一个人,如果他们是朋友,那么他们之间就有一条边,否则就没有。

在有些图中,边具有长度、成本或权重等属性。比如,在路线图中,边的长度可能表示城市之间的距离或旅行时间。在社交网络中,可能有不同种类的边来代表不同类型的关系:朋友、商业伙伴等。

边可以是有向的,也可以是无向的,这取决于它们所表示的关系是不对称的还是对称的。在路线图中,你可能用有向边表示单行道,用无向边表示双向道。在一些社交网络中,比如Facebook,友谊是对称的:如果A是B的朋友,那么B就是A的朋友。但是在Twitter中,关注关系并不是对称的,如果A关注B,这并不意味着B关注A。因此,你可能使用无向边来表示Facebook网络,而使用有向边来表示Twitter。

图具有有趣的数学性质,有一个数学分支叫作图论,专门来研究它们。

图同样很有用,因为现实世界中的很多问题可以通过图算法来解决。比如,Dijkstra的最短路径算法可用来有效地找到从一个节点到图中其他所有节点的最短路径。路径是一条节点序列,每个相邻的节点对之间有一条边。

图通常用正方形或圆形表示节点,用直线表示边。例如,图2-1中的有向图可能表示三个在Twitter上互相关注的人。箭头表示关系的方向。在这个例子中,Alice和Bob互相关注,并且都关注了Chuck,Chuck没有关注Alice和Bob当中的任何一个。

图2-1:表示社交网络的有向图

图2-2中的无向图显示了美国东北部的四个城市,边上的标签显示开车时间,以小时为单位。在本例中,节点的位置大致对应于城市的地理位置,但通常图的布局是任意的(意思是不一定非要对应到地理位置上,能清晰地表达关系即可)。

图2-2:表示城市间行车时间的无向图2.2 NetworkX

为了表示图,我们将使用一个名为NetworkX的包,它是Python中最常用的Network库。你可以在https://thinkcomplex.com/netx上阅读更多关于它的信息,后文将解释它。

我们可以通过导入NetworkX(通常导入为nx)并实例化nx.DiGraph来创建一个有向图:import networkx as nxG = nx.DiGraph()

此时,G是一个没有节点和边的DiGraph(有向图)对象。我们可以使用add_node方法添加节点:G.add_node('Alice')G.add_node('Bob')G.add_node('Chuck')

现在我们可以使用nodes方法得到一个节点列表:>>> list(G.nodes())NodeView(('Alice', 'Bob', 'Chuck'))

nodes方法返回一个节点视图,可以在for循环中使用,在本例中用于创建列表。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载