前 言
“塔尔山上有黄金。”1
在过去的几十年中,很多发展趋势一一显现。计算机的硬件速度越来越快,价格越来越便宜,尺寸越来越小。网络带宽(携带信息的能力)越来越大,价格越来越便宜。同时软件规模越来越庞大,而“开源”运动又将它们变成完全免费或者接近免费。短时间内,“物联网”将数十亿各种各样的设备连接起来,并快速产生了大规模的数据。
几年之前,如果有人让我们写一本主题为“大数据”和“云计算”的大学阶段编程入门教材,并且在封面上绘制一只彩色的大象(象征“巨大”),我们可能会如此反应:“嗯?”如果他们继续让我们在书名中囊括AI(人工智能),我们可能会说:“真的吗?这对于编程初学者会不会过于超前了?”
如果有人让我们在书名中加上“数据科学”,我们可能会问:“计算机科学不是已经包含了数据吗?为什么我们需要为此单独分一个科目?”好吧,如今谈及程序设计,最酷的说法就是“什么都是数据”—数据科学、数据分析、大数据、关系数据库(SQL)以及NoSQL和NewSQL数据库。
如今我们真的写了这样一本书!欢迎阅读!
在本书中,你将会着手学习当今最引人入胜、最前沿的计算技术—你将会看到,它将计算机科学和数据科学轻松地结合在一起,是一门适用于这些学科和相关学科的入门课程。此外,你将使用Python进行编程—世界上发展速度最快、最流行的编程语言之一。在前言中,我们将展示这本书的“灵魂”。
专业程序员常常很快喜欢上Python。他们欣赏Python的表现力、易读性、简洁性和交互性。他们喜欢开源软件世界,这个世界正在为广泛的应用领域不断生成可复用的软件。
无论你是教师、初学者或者有经验的专业人士,这本书都将对你有所帮助。Python对于初学者而言是优秀的第一门编程语言,并且适用于开发工业级的应用。对于新人而言,本书前面的章节奠定了坚实的编程基础。
我们希望你在这本书中学到知识,并且发现快乐与挑战。徜徉其中,享受乐趣。
将Python用于计算机科学和数据科学教学
许多顶尖的美国大学使用Python作为介绍计算机科学的语言,“CS学科排名前10的有8个(80%)、排名前39的有27个(69%)使用Python”2。Python如今在教学和科学计算中尤其受到欢迎3,最近已超过R语言并成为最受欢迎的数据科学编程语言4,5,6。
模块化体系结构
我们预计计算机科学的本科生课程将会包含数据科学部分—这本书为此而设计,并且在Python编程方面满足数据科学入门课程的需求。
本书的模块化体系结构帮助我们满足计算机科学、数据科学和其他相关受众的多样化需求。教师能方便地进行调整,为不同专业的学生开设系列课程。
第1~11章介绍传统的计算机科学编程主题。第1~10章每章都包含可选的、简洁的“数据科学入门”一节,介绍人工智能、基础统计、趋中和离中度量、模拟、静态/动态可视化、CSV文件的使用、数据探索和数据整理的pandas库、时间序列和简单的线性回归。这会帮助你学习第12~17章中的数据科学、AI、大数据和云计算相关的案例研究,你能在真实世界数据集中完整地使用这些案例研究。
学完第1~5章中的Python相关知识以及第6~7章中的一些关键部分,你已经能够在第12~17章中解决数据科学、AI和大数据案例研究中的关键用例,这对于所有的编程通识课都是实用的:
计算机科学方面的课程可以着重于第1~11章并略讲第1~10章的“数据科学入门”部分。教师还可以介绍第12~17章中的部分或者全部案例研究。
数据科学方面的课程可以略讲第1~11章,着重于大部分或者全部的第1~10章中的“数据科学入门”部分以及第12~17章中的案例研究。
前言中的“章节依赖关系”部分将展示本书的独特架构并帮助教师规划个性化的教学大纲。
第12~17章的内容很酷、很强大、很现代。其中包含能动手实现的案例研究,例如有监督学习、无监督学习、深度学习、强化学习(在习题中)、自然语言处理、Twitter数据挖掘、IBM Watson可视化计算、大数据以及其他内容。在这个过程中,你将会掌握数据科学的大量术语和概念,包括术语的定义以及在不同规模的程序中使用的概念。
本书读者对象
模块化的结构使得本书适用于以下读者:
所有标准的Python计算机科学及相关专业。首先,我们的书是一本现代的、可靠的Python CS1入门教材。ACM/IEEE的计算课程建议列出了5个类别:计算机工程、计算机科学、信息系统、信息技术和软件工程7。这本书对这些类别都适用。
数据科学专业的本科生课程。我们的书对许多数据科学课程都是有用的。对于入门级课程而言,它遵循课程建议,整合了所有课程的关键领域。在计算机科学或者数据科学课程计划中,本书都可以作为第一本专业教材,也可用作高年级课程的Python参考书。
非计算机和数据科学专业学生的辅修课程。
数据科学的研究生课程。这本书可以作为入门级课程的主要教材,也可以作为高年级课程的Python参考书。
两年制学院。这些学校会为准备进入四年制学院的数据科学专业的学生开设相关课程—这本书就是一个合适的选择。
高中。就像出于强烈的兴趣爱好而开设计算机课程一样,很多高中已经开设了Python编程和数据科学课程8。最近在LinkedIn上发表的一篇文章写道:“高中就应该教授数据科学,课程应该直面我们的学生将要选择的职业类型,直接关注工作和技术的发展方向。”9我们相信数据科学很快就会成为一门受欢迎的大学先修课程并且最终会有数据科学的AP考试。
专业行业培训课程。
本书主要特色
保持简洁,保持短小,保持新颖
保持简洁(KIS)。在书的各个方面以及教师和学生资源中,我们都力求简单明了。例如,在写自然语言处理的时候,我们使用了简洁直观的TextBlob库而不是更为复杂的NLTK。一般情况下,当有多个库都能完成相近的任务时,我们选择最简单的一个。
保持短小(KIS)。本书的538个案例研究中大多数都很短小—伴随交互式IPython的即时反馈,通常只有几行代码。我们大约只在40个大型脚本和完整案例研究中使用了较长的代码示例。
保持新颖(KIT)。我们查阅了大量最新的Python编程和数据科学教材以及专业书籍,浏览、阅读或者观看了大约15 000篇最新的文献、研究论文、白皮书、视频、博客文章、论坛文章和文档。这让我们能够“把握”Python、计算机科学、数据科学、AI、大数据和云计算社区的脉搏,从而创建出1566个崭新的案例研究、习题和项目(EEP)。
IPython的实时反馈、搜索、发现和实验教学方法
学习这本书的理想方法是阅读它并同时运行代码示例。在整本书中,我们使用了IPython解释器,它采用一种友好的、实时反馈的模式,能够在Python及其扩展库上快速进行搜索、发现和实验。
大多数代码都在小型的可交互的IPython会话中展示。你所写的每一个代码片段,IPython能够立即读取然后计算并给出结果。这种即时反馈使你保持注意力,并助力学习过程、支撑原型设计和加速软件开发过程。
我们的书总是强调现场代码的教学方法,通过样例输入和结果显示,专注于程序的完整和可运行。IPython的“魔力”在于将代码片段转换为实时代码,每当你输入一行时,这些代码就会“活起来”。这有助于学习并鼓励动手实验。
IPython是学习常见错误的报错信息的好方法。我们有时故意犯错来告知你将发生什么,因此,当我们说某件事是错误的时候,试试看会发生什么。
本书配有557道自检习题(适合于“翻转课堂”,稍后介绍)和471个章末习题和项目,它们中的大多数遵循了同样的实时反馈理念。
Python编程基础
首先,本书是一本Python入门教材。我们提供了丰富的Python编程知识和常规的编程基础内容。
我们讨论了Python的编程模型—过程式编程、函数式编程和面向对象编程。
我们强调解决问题和算法设计。
我们为准备进入产业界的学生准备了最好的习题。
函数式编程贯穿全书。第4章中的一个图表展示了Python中关键的函数式编程能力及其对应的章节。
538个案例研究以及471个习题和项目
学生通过动手实践的方法,在广泛选择的真实世界案例研究、习题和项目(EEP)中开展学习,这些内容来自计算机科学、数据科学和其他很多领域。
538个案例研究的内容均围绕计算机科学、数据科学、人工智能和大数据,从单个代码片段到完整案例研究均有涉及。
471个习题和项目自然地拓展了章节中的示例。每章都以一系列涵盖了各种主题的习题作为结尾,这有助于教师根据受众的需求调整课程内容并且在每个学期布置不同的作业。
EEP向你提供了引人入胜的、富有挑战性的、有趣的Python基础知识,包括可以上手实验的AI、计算机科学和数据科学项目。
学生将面对令人兴奋且有趣的有关AI、大数据和云技术应用问题的挑战,比如自然语言处理、Twitter数据挖掘、机器学习、深度学习、Hadoop、MapReduce、Spark、IBM Watson、关键的数据科学库(NumPy、pandas、SciPy、NLTK、TextBlob、spaCy、BeautifulSoup、Textatistic、Tweepy、Scikit-learn、Keras)、关键的可视化库(Matplotlib、Seaborn、Folium)以及其他。
我们的EEP鼓励你思考未来。下述案例研究虽然只出现在前言中,但本书包含了多个发人深省的类似项目:利用深度学习、物联网以及电视摄像机(由体育赛事数据训练出来的),我们可以自动进行数据分析、回顾比赛细节以及即时回放,因此球迷不再需要忍受直播体育赛事的误判和延迟。既然如此,我们可能会产生这样的想法:可以使用这些技术来取消裁判。为什么不呢?我们已经越来越多地把自己的生命托付给基于深度学习的技术,比如机器人外科医生和自动驾驶汽车。
项目习题鼓励你更加深入地了解所学的知识并研究本书没有涉及的技术。真正的项目通常规模更大,需要更多的网络搜索和实现代价。
在教师手册中,我们提供了许多习题的答案,包括第1~11章中核心的Python代码。答案仅对教师可见,详见后文中关于Pearson教师资源的介绍。我们没有提供项目和研究习题的答案。
我们鼓励你仔细观看示例和开源代码案例研究(详见GitHub网页),包括课程级别项目、学期级别项目、专业方向级别项目、毕业设计项目和毕业论文。
557道自检习题及其答案
平均每个小节后有三道自检习题。
自检习题的类型包括填空、判断和讨论,能帮你测试是否理解了所学的内容。
IPython交互式自检习题可帮助你不断尝试并强化所学的编程技术。
为快速掌握所学知识,自检习题后面都跟有答案。
避免烦琐的数学语言,多用自然语言进行解释
数据科学的主题与数学高度相关。这本书将用作计算机科学和数据科学第一门课的教科书,学生可能没有深厚的数学知识背景,所以我们避免了烦琐的数学语言,把数学内容留在高层次的课程中。
在案例研究、习题和项目中,我们关注数学的概念而不是细节。我们使用statistics、NumPy、SciPy、pandas等Python库和其他的很多库来解决问题,从而隐藏了数学复杂性。所以,学生能够直接使用数学技术(如线性回归),而不需要知道背后的数学知识。在机器学习和深度学习的案例研究中,我们专注于创建在“幕后”做数学运算的对象—这是基于对象编程的关键之一。这个做法等同于安全地驾驶一辆汽车前往目的地时不需要知道制造引擎、变速箱、动力转向和防滑刹车系统背后的数学、工程和科学知识。
可视化
67张可视化结果图帮助你理解概念,包含二维或三维的、静态的、动态的、动画的和交互式的图表、图形、图片、动画等。
我们关注由Matplotlib、Seaborn、pandas和Folium(用于交互式地图)产生的高层可视化结果。
我们使用可视化作为教学工具。例如,我们使用动态滚压模型和柱状图使大数定律“鲜活”起来。随着滚动数量的增加,你将看到每个面在滚动总数中所占的百分比逐渐接近16.667%(1/6),代表百分比的柱条也趋于一致。
你需要了解自己的数据。一种简单的办法是直接看原始数据。即使是少量的数据,你也可能很快迷失在细节当中。对于大数据而言,可视化对于数据探索和传递可复制的研究结果尤为重要,数据规模可能是百万级的、上亿的甚至更为庞大。通常而言,一图胜千言10—在大数据中,一个可视化结果能够比得上数据库中数亿甚至更多的个体。
有时候,你需要“飞到离数据40 000英尺高”才能在“大范围”看到它。描述性统计当然有帮助,但是也可能产生误导。你将在习题中研究Anscombe四重奏,这个案例研究通过可视化直观地表明:差异显著的数据集可能产生几乎相同的描述性统计。
我们展示了可视化结果和动画代码以便你能够自己实现。我们也通过Jupyter Notebook的形式给出动画的源代码文件,便于你自定义代码和动画参数,进而重新执行动画,然后查看其带来的影响。
许多习题都要求你创建自己的可视化结果。
数据经验
“数据科学本科课程建议”中提出:“数据经验需要在所有课程中扮演核心角色。”11
在本书的案例研究、习题和项目中,你将使用许多真实世界数据集和数据源。网上有各种免费的开源数据集供你实验。有些我们参考的网站列出很多数据集,我们鼓励你探索这些数据集。
我们收集了上百份教学大纲,追踪了教师的数据集偏好,并研究了最流行的监督机器学习、无监督机器学习和深度学习的数据集。你将会使用到的许多库都附带用于实验的标准数据集。
你将学习如何进行数据获取和分析准备,学习使用多种技术进行数据分析、模型调整并有效交流结果,特别是通过可视化。
像开发者一样思考
你将以开发者为视角,使用像GitHub和StackOverflow一样的流行网站并且进行大量互联网搜索。“数据科学入门”部分和第12~17章中的案例研究提供了丰富的数据经验。
GitHub为寻找开源代码提供了一个优秀的场所,你可以把代码合并到自己的项目中(并将你的代码贡献到开源社区中)。它是软件开发者版本控制工具库中的重要组成部分,这些工具帮助开发团队管理他们的开源(和私有)项目。
我们鼓励你学习GitHub等网站上发布的代码。
在为计算机科学和数据科学的职业生涯做准备的过程中,你将大量使用免费且开源的Python和数据科学库,来自政府、工业界和学术界的真实世界数据集,以及免费、免费试用或免费增值的软件和云服务。
动手实践云计算
很多大数据分析发生在云端。在云端动态地度量你的应用程序需要的硬件和软件规模是比较容易的。你将会使用各种各样的云服务(某些是直接的,某些是间接的),包括Twitter、Google翻译、IBM Watson、Microsoft Azure、OpenMapQuest、geopy、Dweet.io 和 PubNub。你将在习题和项目中了解更多。
我们鼓励你使用各种云服务供应商提供的免费、免费试用或免费增值的服务。我们更喜欢那些不需要信用卡的,因为谁都不想冒意外地积攒巨额账单的风险。如果你决定使用需要信用卡的服务,确保你使用的免费层不会自动跳转到支付层。
数据库、大数据和大数据基础设施
根据IBM(2016年11月)的数据,全球90%的数据是在过去的两年内产生的12。有证据表明,数据产生的速度正在加快。
根据2016年3月Analytics Week的一篇文章,五年内将有超过500亿台设备连接到互联网,到2020年前,我们将每秒为地球上的每一个人产生1.7兆字节的新数据13!
本书包含了对关系数据库和带有SQLite的SQL的探讨,感兴趣的读者可以选择阅读。
数据库是存储和操作你要处理的大量数据的关键性大数据基础设施。关系数据库处理结构化数据,它们不适用于大数据应用程序中的非结构化和半结构化数据。因此,随着大数据的发展,为了有效处理这些数据,NoSQL和NewSQL数据库应运而生。本书包含对NoSQL和NewSQL的概述,以及利用MongoDB JSON文件数据库的动手实践的案例研究。
第17章包含关于大数据硬件与软件基础设施的细致讨论。
人工智能案例研究
为什么这本书没有关于人工智能的章节呢?毕竟,“AI”是印在封面上的。在第12~16章的案例研究中,我们介绍的人工智能主题(计算机科学与数据科学的一个关键交集)包含自然语言处理、利用数据挖掘对Twitter进行情感分析、利用IBM Watson进行认知计算、监督机器学习、无监督机器学习、深度学习和强化学习(在习题中)。第17章介绍了大数据硬件和软件基础设施,这些基础设施支撑了计算机科学家和数据科学家研究的前沿AI解决方案。
计算机科学
第1~10章的Python基础知识会让你像计算机科学家一样思考。第11章提供了一个更高的视角,其中讨论的都是经典的计算机科学话题。第11章强调性能问题。
内置集合:列表、元组、集合、字典
今天,大多数应用开发人员不再构建定制的数据结构。这是CS2课程的主题—严格来说,我们的范围是CS1和相应的数据科学课程。书中用两章的篇幅详细介绍了Python的内置数据结构—列表、元组、字典和集合,大多数数据结构任务都可以通过这些数据结构来完成。
使用NumPy数组、pandas Series和DataFrame进行面向数组的编程
在这本书中我们专注于开源库中的三个关键数据结构—NumPy数组、pandas Series和pandas DataFrame。这些库被广泛用于数据科学、计算机科学、人工智能和大数据。NumPy的性能比内置Python列表高出两个数量级。
第7章中详细介绍了NumPy数组。pandas等许多库都是在NumPy的基础上构建的。第7~9章的“数据科学入门”部分介绍了pandas Series和DataFrame,这两个库以及NumPy数组将在剩余的章节中频繁使用。
文件处理和序列化
第9章介绍文本文件处理,然后演示了如何使用流行的JSON(JavaScript对象表示法)格式把对象序列化。JSON是一个普遍使用的数据交换格式,在后面的数据科学章节中你会经常见到它—通常为简单起见把JSON的细节隐藏在库中。
基于对象编程
在我们为本书进行调研期间研究的所有Python代码中,很少遇到自定义类,而这在Python开发者使用的强大的库中是很常见的。
我们强调大量使用Python开源社区打包到工业标准类库中的类。你将专注于:了解有哪些库,选择你的应用程序需要的库,从现有类(通常是一行或两行代码)创建对象以及让它们“跳起来、舞起来、唱起来”。这叫作基于对象编程—它使你能够简洁地构建令人印象深刻的应用程序,这是体现Python吸引力的重要组成部分。
通过这种方法,你可以使用机器学习、深度学习、强化学习(在习题中)和其他AI技术来解决各种各样有趣的问题,包括语音识别和计算机视觉等认知计算方面的挑战。过去,如果仅仅学过入门级编程课程,是不可能完成这些任务的。
面向对象编程
对计算机科学专业的学生来说,开发自定义类是一个至关重要的面向对象编程技能,相关的继承、多态和鸭子类型也同样重要。我们将在第10章中讨论这些内容。
面向对象编程的讨论是模块化的,所以教师可以分开介绍基础或中级部分。
…………