1.1 Python编程
如果翻阅英文字典查找Python的含义,大概率会得到“蟒蛇”这个中文解释。事实上,Python编程语言的命名和起源曾有一段逸闻:首先,这门编程语言的框架设计和解释器的开发,均是由一名荷兰籍计算机从业者Guido von Rossum在1989年的圣诞假期开始的;而Python这个命名实际来源于Guido本人非常喜爱的一部在20世纪60年代到70年代BBC播放的室内情景幽默剧Monty Python's Flying Circus。
稍微了解一点计算机发展史的读者,一定听说过汇编语言甚至机器语言。早期程序员的工作方式远没有像现在这样的自由和灵活。现今的程序员可以选择不去自己所在的公司,而是在加州硅谷一个阳光明媚的工作日,坐在一间舒适的咖啡馆里,打开自己的苹果笔记本,远程连接到属于自己的一台性能优越的计算服务器,开始一天的工作。相反,较早一代的程序员几乎需要整天对着一台轰然作响的庞然大物(如图1.1所示)。这些程序员不仅需要迫使自己像机器一样思考,编写出更加贴近机器指令的程序,甚至还要花费更大的精力,根据有限的计算资源做各种各样的程序优化,最大限度地榨取计算机的性能。
图1.1 美国第一台计算机背后的女程序员
Python的作者Guido曾苦恼于这样的工作状态并希望改变。他决心设计一种兼顾可读性和易用性的编程语言。因此,Python将许多高级编程语言的优点集于一身:不仅可以像脚本语言(Script Languages)一样,用非常精练易读的寥寥几行代码,来完成一个本来使用C语言并借助复杂编写才能完成的程序任务;而且,还具备面向对象编程语言(Object-oriented Programming Languages)各式各样的强大功能。不同于C语言等编译型语言(Compiled Languages),Python作为一门解释型语言(Interpreted Languages),也非常便于代码调试。同时,Python的免费使用和跨平台执行特性,也为这门编程语言带来了越来越多开源库的贡献者和使用者。
许多著名的公司,如Google、Dropbox等,甚至将Python纳入其内部最为主要的开发语言。因此,如果是初涉计算机编程的读者,学习Python语言无疑是明智之选。同时,本书借由Python编程语言来深入介绍机器学习相关的话题,也显得更为高效与易读。
个人认为,Python程序语言与机器学习实践可谓是“珠联璧合”。因为使用Python编程技巧,接触甚至掌握机器学习的经典算法,至少存在以下4项优势。
(1)方便调试的解释型语言。Python是一门解释型编程语言。与Java类似,Python源代码都要通过一个解释器(Interpreter),转换为独特的字节码。这个过程不需要保证全部代码一次性通过编译。相反,Python解释器可以逐行处理这些代码;因此方便了程序的调试,也特别适合于使用不同机器学习模型进行增量式开发。
(2)跨平台执行作业。上面提到Python的源代码都会先解释成独特的字节码,然后才会被运行。从另一个角度讲,只要一个平台安装了用于运行这些字节码的解释器,那么Python源代码便可以执行跨平台作业。这一点不同于C++这类编译型语言,但是却和Java虚拟机很相似。由于机器学习任务经常被广泛地执行在多种平台,所以使用Python这类解释型语言作为编码媒介,也不失为一种好的选择。
(3)广泛的应用编程接口。除了那些被用于编程人员自行开发所使用的第三方程序库以外,业界许多著名的公司都拥有用于科研和商业的云平台,如亚马逊的AWS(Amazon Web Services)、微软的Azure和阿里巴巴的阿里云等。这些平台同时也面向互联网用户提供具备机器学习功能的Python应用编程接口(Application Programming Interface,API)。许多平台的机器学习功能模块,不需要用户自行编写。为了实现一些更加强大的功能需求,用户只需要像搭建积木一样,通过Python语言并且遵照API的编写协议与规则,把各个模块串接起来即可。
(4)丰富完备的开源工具包。软件工程中有一个非常重要的概念,便是代码与程序的重用性。为了构建功能强大的机器学习系统,如果没有特殊的开发需求,我们都不会从零开始编程。例如,机器学习算法中经常会涉及向量计算。如果Python中没有直接提供用于向量计算的工具,我们一定需要自己花费时间编写这样的基础功能吗?答案是否定的。Python自身免费开源的特性使得大量专业甚至天才型的编程人员,参与到Python第三方开源工具包(编程库)的构建中。更为可喜的是,大多数的工具包(编程库)都允许个人免费使用,乃至商用。这其中就包括本书主要使用的多个用于机器学习的第三方编程库,如便于向量、矩阵和复杂科学计算的NumPy与SciPy,仿MATLAB样式绘图的Matplotlib,包含大量经典机器学习模型的Scikit-learn,对数据进行快捷分析和处理的Pandas,以及集成了上述所有第三方编程库的综合实践平台Anaconda。
这里需要提前向读者声明的是,Python编程语言有两个版本,分别是Python 2与Python 3。因为一些“历史遗留”问题,这两个版本不仅无法相互兼容,而且就连一些基本的编程语法都不一致。所以,建议读者在学习Python的时候,姑且把它们视作两种不同的编程语言。鉴于未来Python 2将不再更新,而Python 3还会继续发布新的版本,本书决定采用Python 3作为编程语言,所有编写的示例代码都可以流畅运行于Python 3的解释器。