机器学习开发者指南

978-7-115-52930-5
作者: [阿根廷]鲁道夫 ▪ 邦宁(Rodolfo Bonnin )
译者: AI研习社
编辑: 卜一凡

图书目录:

详情

本书是一本系统指南,它将带领读者学习如何实施各种机器学习技术及其日常应用和开发。全书分为9章,从熟悉的易于掌握的语言的基础数据和数学模型开始,向读者介绍机器学习领域中使用的各种库和框架,然后通过用有趣的示例实现了回归、聚类、分类、神经网络等,通过本书读者将学会实现这些概念来解决ML应用程序的实际场景,如图像分析、自然语言处理和时间序列数据的异常检测。

图书摘要

版权信息

书名:机器学习开发者指南

ISBN:978-7-115-52930-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [阿根廷]鲁道夫·邦宁(Rodolfo Bonnin)

译    AI研习社

责任编辑 罗子超

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright © 2017 Packt Publishing. First published in the English language under the title Machine Learning for Developers. All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


本书将带领读者学习如何实施各种机器学习技术及其日常应用的开发。本书分为9章,从易于掌握的语言基础数据和数学模型开始,向读者介绍机器学习领域中使用的各种库和框架,然后通过有趣的示例实现回归、聚类、分类、神经网络等,从而解决如图像分析、自然语言处理和时间序列数据的异常检测等实际问题。

本书适合机器学习的开发人员、数据分析人员、机器学习领域的从业人员,以及想要学习机器学习的技术爱好者阅读。使用任何脚本语言的编程人员都可以阅读本书,但如果熟悉Python语言的话,将有助于充分理解本书的内容。


过去10年中大数据在高速发展的社会中得到了越来越多的关注,同时,大数据也影响着不同领域的产业发展。机器学习在其中起着独特的作用,因为它提供了数据分析、数据挖掘、知识发现等所需的主要功能。这些功能以一种对日常使用的大多数系统来说不可见但普遍存在的方式提供可操作的自主智能性。虽然并不新奇,但机器学习的形式和方法已经得到了迅速发展,这是由电子商务、社交网络、互联网相关服务和产品以及以在线业务为中心的类似企业不断增长的需求所推动的。

Hadoop生态系统中涌现并逐渐成熟的其他技术推动了机器学习的突破,其中包括水平可扩展的计算资源和卓越的仓储功能,这使得对大型数据集的实时分析变得可行。与此同时,围绕Python编程语言的社区支持计划令复杂分析库的使用和发展变得广泛,从而得到了大量的知识和经验,同时能快速、简便地部署和投入到生产中。

目前,在机器学习中,神经网络发挥着独特的作用。七十多年前提出的第一个人工智能范式(神经网络)几次被社区抛弃,直到很多年后才被重新重视。其原因可能是缺乏足够的计算能力来进行复杂的分析,以及需要解决通过反复试验来组装、训练和测试不同拓扑结构这一繁重的任务。近年来,这种情况发生了巨大的变化,主要是由于云计算、GPU和编程库的出现,这些库允许使用简单的脚本建立网络。如今,拥有数亿自由度的网络可以在几分钟内完成组装、几个小时内训练好并在几天内投入生产(在你使用正确技术的条件下)。这也是大多数计算机视觉、语言理解和模式识别的突破性进展通常是由最近提出的不同类型的神经网络驱动的原因之一。

这一呈指数增长的知识、技术和编程库集合使得大多数关于该主题的经典文献相继过时,至少对于快速的实际应用部署而言是如此。出于这个原因,本书可以被看作是一本快速并切合机器学习要点的图书,包含了成功实现和理解机器学习应用程序所需的所有材料。在本书中,你将会发现以下几点。

(1)机器学习任务的基本原理(分类、聚类、回归和数据简化),以及对这门学科的数学和统计学基础的快速而全面的介绍。

(2)更详细地介绍作为学习模型的神经网络,以及训练算法、收敛准则和结果评估的基础知识。

(3)通过更复杂的网络介绍先进的学习模式,包括卷积网络、循环网络和对抗性网络。无论是在理论层面还是在实践层面都对每一个模型进行了全面的分析。

(4)一本开源软件的综合指南,结合以往的材料共同帮助读者迅速地将这些概念付诸实践。

强烈推荐本书给那些认为自己的专业知识已经过时的学术界从业人员、需要在商业应用中部署复杂的机器学习功能的开发人员,以及想要更加深入理解机器学习技术爱好者。作者以非常清晰和系统的方式传达了他在这一领域的丰富经验,使得这本书易于理解并付诸实践。

Claudio Delrieux

阿根廷国立南方大学电气和计算机工程系教授

阿根廷国家研究和技术委员会院士

影像科学实验室主任


随着计算机硬件的快速发展,从前难以实现的复杂机器学习算法(如神经网络)已经逐渐从研究者的实验室进入了从业者的视野。复杂机器学习算法的广泛使用更进一步地促进了其自身的发展。2017年,Google的AlphaGo更是成为了历史上首次在围棋项目上击败人类选手的人工智能程序,这在十几年前都还是难以想象的。

机器学习的快速发展,离不开数学家、统计学家和程序开发人员的不懈努力。由AlphaGo所引发出的、井喷式的人工智能开发热潮让不少新的开发人员跃跃欲试。然而,由于机器学习是扎根于数学和统计学的学科,因此一般开发人员虽然可以很快上手并使用这些算法,但对其背后所代表的数学和统计意义却很难有全面深入的了解。

本书的目的就在于填补这一空白,给精于程序设计的开发人员补上重要的数学和统计学知识,帮助开发人员了解机器学习算法背后的意义,从而帮助他们更好地根据问题的情境选择合适的算法,并更加有效地调整算法及其参数。本书不仅在第1章中介绍了理解机器学习所需要的基础统计学和数学知识,而且在之后的章节中使用这些概念对多种机器学习模型进行了深入的探讨。译者建议想要从零开始入门机器学习的开发者,着重精读第1章和第2章中介绍的数学、统计学知识以及典型的数据分析和机器学习的方法论。

第3、4章介绍了一些基础的、被广泛使用的机器学习算法,例如K-Means、K-近邻聚类算法、逻辑回归和线性回归算法等,帮助读者快速上手,使用机器学习解决现实问题。

第5~7章循序渐进地介绍了神经网络的要素,包括神经网络的多层结构、卷积神经网络(诸如Lenet 5、Alexnet等)和循环神经网络(LSTM)等。作者首先在不借助机器学习框架(如TensorFlow、Keras等)的情况下,使用基础的NumPy等库构建了简易的神经网络层结构,帮助读者了解真实的神经网络架构。然后使用Keras等库来帮助读者构建更加复杂的深层神经网络,并使用这些算法对现实问题进行研究。

书中使用了大量的示例代码,且遵循了良好的编程规范,不仅对开发者非常友好,对精于数学和统计学的读者来说,也是一本很好的机器学习编程参考教材。译者建议读者不要吝惜时间来实现书中的示例代码,并且可以尝试修改这些代码来解决自己所想解决的问题。这些代码中的编程思想一定会对读者大有裨益。

AI研习社的译者非常享受翻译本书的过程,并且在翻译的过程中,从多个角度学习了大量的机器学习知识,译者希望读者通过本书,也能获得自己感兴趣的知识,并利用这些知识更好地解决现实中的问题。

A I研习社(朱海振 赵朋飞 程炜 栾逸 黄中杰 李攀鹏 王江舟)


Rodolfo Bonnin是阿根廷国家科技大学的系统工程师和博士生。他还在德国斯图加特大学攻读并行编程和图像理解的研究生课程。

自2005年以来,他一直在研究高性能计算,并于2008年开始研究和实现卷积神经网络,编写支持CPU和GPU的神经网络前馈阶段。最近,他一直致力于利用神经网络进行欺诈模式检测的工作,并使用机器学习技术进行信号分类。

他也是《Tensorflow机器学习项目实战》的作者。


Doug Ortiz是ByteCubed公司的高级大数据架构师,他的整个职业生涯致力于构建、开发和集成企业解决方案。利用其方案的组织机构能够通过现有和新兴技术,如亚马逊云计算服务、微软Azure服务、谷歌云、微软BI Stack、Hadoop、Spark、NoSQL数据库、SharePoint 以及相关工具集和技术,重新发现和重用未充分利用的数据。

他也是Illustrics公司的创始人,读者可以通过dougortiz@illustrics.org来联系他。

他具有丰富的集成多平台和产品的经验,并且拥有大数据、数据科学认证,以及R和Python认证。他帮助组织机构对数据和现有资源的当前投资有更深的理解,并将其转化为有效信息源。同时,他还利用独特和创新的技术改进、挽救和构建项目,定期查看有关亚马逊网络服务、数据科学、机器学习、R语言和云技术的图书。

他的爱好是瑜伽和水肺潜水。

Mahmudul Hasan目前是英国安格利亚鲁斯金大学的安格利亚鲁斯金IT研究所(ARITI)的博士研究员。他曾在水仙花国际大学CSE系担任高级讲师。他毕业于英国埃赛克斯大学,专门从事不同平台的游戏和移动应用程序开发。

他有6年以上的ICT行业经验,包括小型和大型软件的商业化开发。他目前担任国际游戏开发者协会(IGDA)孟加拉国分会的负责人。

Mahmudul的研究兴趣涉及机器学习、数据科学、决策支持系统以及通过游戏和游戏化的个性化学习。他在同行评审的期刊和会议上发表了重要的文章。


机器学习是目前的热门学科,在这个由数据和自动化驱动的世界里,它的未来发展被媒体寄予厚望,据说它已经成为近几个月重大科技投资的一部分。机器学习广泛应用于图像理解、机器人技术、搜索引擎、自动驾驶等众多领域,与之相关的应用也不断出现。在本书中,我们将忽略基本的数学结果,而使用代码和图表作为主要的概念工具来研究机器学习的原理和目前流行的技术。

我们将从基本的机器学习概念、分支和各种类型问题开始讲起,部分章节通过解释相关的基础数学概念来帮助我们掌握机器学习。随着章节的推进,我们将讲解更加复杂的模型,首先是线性回归,然后是逻辑回归,接着是神经网络以及与其相关的变体(CNN、RNN),最后综合地介绍更先进的机器学习技术,比如GAN和强化学习。

本书的目标读者是那些期望掌握机器学习的相关内容、理解主要的基本概念、使用算法思想并能掌握正式数学定义的开发人员。本书使用Python实现了代码概念,Python语言接口的简洁性,以及其提供的方便且丰富的工具,将有助于我们处理这些代码,而有其他编程语言经验的程序员也能理解书中的代码。

读者将学会使用不同类型的算法来解决自己的机器学习相关问题,并了解如何使用这些算法优化模型以得到最佳的结果。如果想要了解现在的机器学习知识和一门友好的编程语言,并且真正走进机器学习的世界,那么这本书一定能对读者有所帮助。

第1章:机器学习和统计科学。本章涵盖机器学习的各种介绍性概念,讨论了机器学习的历史、分支以及基本概念,同时还介绍了开发过程涉及的大部分技术所需的基本数学概念。

第2章:学习过程。本章涵盖了机器学习处理流程中的所有步骤,并且介绍了每个阶段所需的工具和概念。

第3章:聚类。本章涵盖了几种无监督学习技术,特别是KMeans和KNN聚类算法。

第4章:线性回归和逻辑回归。本章涵盖了两种截然不同的监督学习算法,它们使用相似的名称——线性回归(用于实现时间序列预测)和逻辑回归(用于实现分类)。

第5章:神经网络。本章介绍了一种现代机器学习应用的基本构建模块,并在章节末尾逐步实现搭建一个神经网络的过程。

第6章:卷积神经网络。本章涵盖了神经网络的一个巨大变化,并最后在实际应用中实现了非常著名的CNN网络结构(VGG16)。

第7章:循环神经网络。本章介绍了RNN的相关概念,并且完整地描述了常用的RNN结构(LSTM)的各个阶段,最后还分享一个时间序列预测练习。

第8章:近期的新模型及其发展。本章涵盖了两个在机器学习领域引起大家极大兴趣的技术——生成对抗网络(GAN)和强化学习。

第9章:软件安装与配置。本章涵盖了3个操作系统(Linux、macOS和Windows)必备软件包的安装。

本书主要关注机器学习的相关概念,并使用Python语言(版本3)作为编码工具。本书通过Python 3和Jupyter Notebook来构建工作环境,可以通过编辑和运行它们来更好地理解这些概念。我们专注于如何以最佳方式,利用各种Python库来构建实际的应用程序。本着这种精神,我们尽力使所有代码保持友好性和可读性,使读者能够轻松地理解代码并在不同的场景中使用它们。

本书面向那些希望理解机器学习的相关概念及基础知识的开发人员或技术爱好者。使用任何脚本语言的编程人员都可以阅读本书,但熟悉Python语言将有助于充分理解代码。对于目前的数据科学家来说,本书能帮助他们重新回归机器学习的基础概念,并通过动手实践来理解相关概念。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

如果您发现错误,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,将赠予您异步社区的100积分(积分可用于在异步社区兑换优惠券、样书或奖品)。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


机器学习是近几年炙手可热的话题。每天都有新的应用和模型进入人们的视野。世界各地的研究人员每天所公布的实验结果都显示了机器学习领域所取得的巨大进步。

技术工作者参加各类课程、搜集各种资料,希望使用这些新技术改进他们的应用。但在很多情形下,要理解机器学习需要深厚的数学功底。这就为那些虽然具有良好的算法技能,但数学概念欠佳的程序员们设置了较高的门槛。

本书第1章概述了机器学习的主要研究领域,将对基本统计学、概率和微积分进行简要的介绍。同时提供了示例源代码,帮助读者利用这些公式和参数进行试验。

在第1章中,将会学到以下内容。

当今世界充斥着大量的数据。从基础层面来说,人们不断从文本、图像、声音以及其他信息中学习。这些数据是掌握新技能的第一步。

遍布世界的无数计算设备收集并存储大量的图像、视频和文本信息。因此,有充足的原始数据用于学习,并且这些格式的数据都能够由计算机处理。

这门学科的出发点是,所研究的技术和方法允许计算机从数据中学习,而不需要显式编程。

Tom Mitchell对机器学习给出了更正式的定义:

“如果一个计算机程序在执行任务T时的性能P随着经验E而提高,那么我们就称,对于任务T和性能度量P,这个计算机程序通过经验E学习。”

这个定义非常全面。它阐明了每个机器学习项目中所包含的元素:执行的任务、持续更新的经验,以及清晰恰当的性能度量。简单来说,就是一个程序可在一定标准的指引下,基于获取的经验来改进执行的任务。

作为一门学科,机器学习并不是孤立的——它属于一个更大的领域,人工智能(Artifiical Intelligence,AI)。但你可以猜到,机器学习并不是凭空而来的。在它之前,经过复杂度的逐级增加,机器学习已经经历了4个截然不同的阶段。

1)第一个机器学习模型涉及基于规则的决策和基于数据的简单算法,其本身包括所有可能的分支和决策规则,并作为先决条件,意味着所有可能选项都由此领域的专家硬编码到模型中。自从1950年第一个编程语言出现后,这个结构就已经在大多数的应用开发之中得以实现。这种算法处理的主要数据类型和函数都是布尔类型。它专门用于处理是或否的决策。

2)在统计推理发展的第二阶段,除了预先设定的选择,人们把数据的概率特性放在了重要的位置。这种方法更好地反映了现实问题的模糊特性。在这些问题中离群值随处可见。相比于固定问题所使用的死板方法,考虑数据的不确定趋势更为重要。这门学科增加了贝叶斯概率理论(Bayesian Probability Theory)等数学工具。它包括曲线拟合(通常为线性或者多项式),具有处理数值数据的共同性质。

3)这一阶段的机器学习会贯穿全书。相比前一阶段简单的贝叶斯元素,它涉及更复杂的任务。机器学习算法的突出特点就是它可以从数据中归纳出模型。而模型可以生成自己的特征选择器,同时不受固定目标函数的限制。因为,这些选择器是在训练过程中生成并定义的。这类模型的另一个不同点是,可以将各种数据类型作为输入,比如语音、图像、视频、文本以及其他容易用向量表示的数据。

4)AI是抽象能力范围的最后一个阶段。它包括了之前的各种算法类型,但关键的区别是,AI算法可以应用所学知识来解决在训练阶段并未考虑过的任务。这种算法所使用的数据类型甚至比机器学习支持的数据类型更为通用。根据定义,它可以将解决问题的能力从一种数据类型传递给另一种,而不需要对模型进行完全的重新训练。通过这种方法,可以开发出一种黑白图像的目标检测算法。模型可以从黑白图像中提取知识,然后应用于彩色图像中。

图1.1列出了在通往真正AI应用的道路上所经历的4个阶段。

图1.1 通往真正AI应用的道路上所经历的4个阶段

机器学习的类型

接下来在先验知识的基础上,从实现者的角度出发,试着剖析不同类型的机器学习项目。这些项目包括以下类型。

机器学习的主要领域如图1.2所示。

图1.2 机器学习的主要领域

1.监督的等级

在学习过程中,监督采用了渐进的步骤。

图1.3描述了上述方法。

图1.3 基于无监督、半监督和监督学习的训练技术

2.监督学习策略——回归与分类

这类学习包括以下两种类型的问题。

3.无监督方法解决聚类问题

因为没有先验分类的特定信息,大多数无监督问题通过查看观察对象的相似性或共享特征值的方法来进行分类。这项技术叫作聚类(Clustering)。

在这些主要问题之外,还有一种半监督问题,它是前几种问题的结合。在这个问题中,可以训练一组标记的元素,并且在训练期间使用推理将信息分配给未标记的数据。为了将数据分配给未知实体,使用了3个主要标准——平滑度(彼此接近的点属于同一类)、聚类(数据倾向于形成聚类,这是平滑度的一种特殊情况)和流形(专指高维数据映射形成的低维数据)。

本书面向开发人员,通过实际的代码,自然而然地解释所用方法的数学概念。

在选择示例代码的编程语言时,首选的方法是采用复合技术,包括一些前沿的库。但在咨询社区意见后,作者认为在解释这些概念时,使用一种简单的语言明显是比较好的。

在各种选择之中,理想的候选语言应易于理解,且在真实世界中能被机器学习项目所采用。

显而易见,Python是这个任务的有力候选者,它满足所有这些条件。特别是最近几年,无论对于新手还是专业实践者来说,它都已成为机器学习的专用语言。

在图1.4中,将Python和之前在机器学习编程语言领域大红大紫的R语言进行了比较。可以清楚地看到用户的喜爱趋势偏向Python,这意味着读者从本书中所获得的技能在现在和可预见的将来都是息息相关的。

图1.4 机器学习领域R和Python语言兴趣图谱

除此之外,本书还借助了Python生态系统中许多著名的数值、统计和图形库,比如Pandas、NumPy和Matplotlib。对于深度神经网络(Deep Neural Network)的示例,我们将使用Keras库,并以TensorFlow作为后端。

Python语言

Python是一种通用脚本语言,由荷兰程序员Guido Van Rossum于1989年创建。它语法简单,并且具有很强的可扩展性,这归功于其众多的扩展库,使它成为非常适合原型化和通用编码。由于它能与原生C语言绑定,因此也可以作为生产部署的候选。

除了作为通用脚本工具之外,该语言实际上应用于从Web开发到科学计算的各个领域。

1.NumPy库

如果必须为本书选择一个库,并且能用Python编写重要的数学应用程序,那么NumPy是一个不错的选择。该库将帮助读者通过以下组件,运用统计和线性代数例程来实现应用程序。

说明

本书将大量使用NumPy库,通过其原语来简化代码的概念解释。

2.Matplotlib库

数据绘图是数据科学的一部分。分析人员常常首先使用它来了解数据集所代表的意义。

正因为如此,人们需要一个强大的库来绘制输入数据的图形,并表示输出结果。本书将会使用Python的Matplotlib库来描述各个概念以及模型的输出结果。

什么是Matplotlib

Matplotlib是一个应用广泛的绘图库,特别是2D图形。在这个库中,本书将重点使用Pyplot模块,它是Matplotlib API的一部分,使用方法与MATLAB类似,并且直接支持NumPy。对于那些不熟悉MATLAB的人来说,几十年来它一直是科学和工程领域默认的Mathematical Notebook环境。

本书大部分的概念将使用以上方法来描述。读者可以仅用这两个库和提供的代码实现本书中的示例。

3.Pandas

Pandas用一种叫作DataFrame的特殊结构补充了前面提到的库,并且还为不同格式的数据(如切片、子集、丢失的数据、合并和重整的数据等)添加了许多统计和数据管理方法,例如I/O。

DataFrame对象是一个非常有用的特性,它提供了2D数据结构,其中的列可以是不同的数据类型。它的结构与数据库表非常相似,但编程运行时更加灵活,并且生态系统(如SciPy)更加丰富。这些数据结构还与NumPy矩阵兼容,因此可以花较小的精力进行高性能数据计算。

4.SciPy

SciPy是一个非常有用的科学计算Python库的组合,包括NumPy、Pandas和Matplotlib等。同时它也是整个生态系统的核心库,通过这些库可以执行许多附加的基本数学操作,如集成、优化、插值、信号处理、线性代数、统计和文件I/O。

5.Jupyter Notebook

Jupyter是一个基于Python的成功项目,它也是用来研究和理解数据的强大工具。

Jupyter Notebook是由代码、图形或格式化文本混合编排的文档,这使它形成了非常通用和强大的研究环境,所有这些元素都封装在一个便于使用的Web界面中。它可以与IPython交互式解释器完成互动。

一旦载入了Jupyter Notebook,整个环境和所有变量就都保存在内存中了,可以修改和重新定义,以方便研究和实验,如图1.5所示。

图1.5 Jupyter Notebook

这个工具将是本书学习的一个重要部分,大部分Python示例将以这种格式提供。在本书的第9章,你会找到完整的安装说明。

注意

安装完成后,读者可以输入cd命令进入软件的安装目录。通过键入jupyter notebook,调用Jupyter。

正如前文所述,本书主要的目标读者是希望理解机器学习算法的开发人员。但是,为了掌握它们背后的动机和理论,有必要回顾并建立所有基本推理知识体系,包括统计、概率和微积分。

下面先从一些基本的统计概念开始。

统计学可以定义为使用数据样本,提取和支持关于更大样本数据结论的学科。考虑到机器学习是研究数据属性和数据赋值的重要组成部分,本书将使用许多统计概念来定义和证明不同的方法。

描述性统计学——主要操作

接下来将从定义统计学的基本操作和措施入手,并将基本概念作为起点。

(1)平均值(Mean)

这是统计学中直观、常用的概念。给定一组数字,该集合的平均值是所有元素之和除以集合中元素的数量。

平均值的公式如下。

虽然这是一个非常简单的概念,但本书还是提供了一个Python代码示例。在这个示例中,我们将创建样本集,并用线图表示它,将整个集合的平均值标记为线,这条线应该位于样本的加权中心。它既可以作为Python语法的介绍,也可以当作Jupyter Notebook的实验。代码如下。

import matplotlib.pyplot as plt #Import the plot library

def mean(sampleset):  #Definition header for the mean function
    total=0
    for element in sampleset:
        total=total+element
    return total/len(sampleset)

myset=[2.,10.,3.,6.,4.,6.,10.] #We create the data set
mymean=mean(myset) #Call the mean funcion
plt.plot(myset)  #Plot the dataset
plt.plot([mymean] * 7)  #Plot a line of 7 points located on the mean

该程序将输出数据集元素的时间序列,然后在平均高度上绘制一条线。

如图1.6所示,平均值是描述样本集趋势的一种简洁(单值)的方式。

图1.6 用平均值描述样本集趋势

因为在第一个例子中,我们使用了一个非常均匀的样本集,所以均值能够有效地反映这些样本值。

下面再尝试用一个非常分散的样本集(鼓励读者使用这些值)来进行实验,如图1.7所示。

图1.7 分散样本集的趋势

(2)方差(Variance)

正如前面的例子所示,平均值不足以描述非均匀或非常分散的样本数据。

为了使用一个唯一的值来描述样本值的分散程度,需要介绍方差的概念。它需要将样本集的平均值作为起点,然后对样本值到平均值的距离取平均值。方差越大,样本集越分散。

方差的规范定义如下。

下面采用以前使用的库,编写示例代码来说明这个概念。为了清楚起见,这里重复mean函数的声明。代码如下。

import math #This library is needed for the power operation
def mean(sampleset):  #Definition header for the mean function
    total=0
    for element in sampleset:
        total=total+element
    return total/len(sampleset)

def variance(sampleset):  #Definition header for the mean function
    total=0
    setmean=mean(sampleset)
    for element in sampleset:
        total=total+(math.pow(element-setmean,2))
    return total/len(sampleset)

myset1=[2.,10.,3.,6.,4.,6.,10.]  #We create the data set
myset2=[1.,-100.,15.,-100.,21.]
print "Variance of first set:" + str(variance(myset1))
print "Variance of second set:" + str(variance(myset2))

前面的代码将输出以下结果。

Variance of first set:8.69387755102
Variance of second set:3070.64

正如上面的结果所示,当样本值非常分散时,第二组的方差要高得多。因为计算距离平方的均值是一个二次运算,它有助于表示出它们之间的差异。

(3)标准差(Standard Deviation)

标准差只是对方差中使用的均方值的平方性质进行正则化的一种手段。它有效地将该项线性化。这个方法可以用于其他更复杂的操作。

以下是标准差的表示形式。

概率与随机变量对于理解本书所涉概念极为重要。

概率(Probability)是一门数学学科,它的主要目标就是研究随机事件。从实际的角度讲,概率试图从可能发生的所有事件中量化事件发生的确定性(或者不确定性)。

1.事件

为了理解概率,我们首先对事件进行定义。在给定的实验中,执行确定的动作可能出现不同的结果。事件就是该实验中所有可能结果的子集。

关于事件的一个例子就是摇骰子时出现的特定数字,或者装配线上出现的某种产品缺陷。

(1)概率

按照前面的定义,概率是事件发生的可能性。概率被量化为0~1之间的实数。当事件发生的可能性增加时,概率P也按照接近于1的趋势增加。事件发生概率的数学表达式是P(E)。

(2)随机变量和分布

在分配事件概率时,可以尝试覆盖整个样本,并为样本空间中的每个可能分配一个概率值。

这个过程具有函数的所有特征。对于每一个随机变量,都会为其可能的事件结果进行赋值。这个函数称为随机函数。

这些变量有以下两种类型。

这个概率函数也称为概率分布(Probability Distribution)

2.常用概率分布

在多种可能的概率分布中,有些函数由于其特殊的性质或它们所代表问题的普遍性而被研究和分析。

本书将描述那些常见的概率分布。它们对机器学习的发展具有特殊的影响。

(1)伯努利分布(Bernoulli Distribution)

从一个简单的分布开始:像抛硬币一样,它具有二分类结果(binary outcome)。

这个分布表示单个事件。该事件中1(正面)的概率为p,0(反面)的概率为1−p

为了实现可视化,可以使用np(NumPy库)生成大量伯努利分布的事件,并绘制该分布的趋势。它有以下两种可能的结果。代码如下。

plt.figure()
distro = np.random.binomial(1, .6, 10000)/0.5
plt.hist(distro, 2 , normed=1)

下面通过图1.8中的直方图显示二项分布(Binomial Distribution),可以看出结果概率的互补性质。

图1.8 二项分布

可能结果的概率互补趋势非常明显。现在用更多的可能结果来补充模型。当结果的数目大于2时,采用多项式分布(Multinomial Distribution)。代码如下。

plt.figure()
distro = np.random.binomial(100, .6, 10000)/0.01
plt.hist(distro, 100 , normed=1)
plt.show()

结果如图1.9所示。

图1.9 100种可能结果的多项式分布

(2)均匀分布(Uniform Distribution)

这种非常常见的分布是本书出现的第一个连续分布。顾名思义,对于域的任何区间,它都有一个恒定的概率值。

ab是函数的极值,为了使函数积分为1,这个概率值为1/(ba)。

下面用一个非常规则的直方图生成样本均匀分布的图。代码如下。

plt.figure()
uniform_low=0.25
uniform_high=0.8
plt.hist(uniform, 50, normed=1)
plt.show()

结果如图1.10所示。

图1.10 均匀分布

(3)正态分布(Normal Distribution)

这是一种常见的连续随机函数,也称作高斯函数(Gaussian Function)。虽然表达式有些复杂,但它只需要用均值和方差来定义。

这是函数的标准形式。

查看下面的代码。

import matplotlib.pyplot as plt #Import the plot library
import numpy as np
mu=0.
sigma=2.
distro = np.random.normal(mu, sigma, 10000)
plt.hist(distro, 100, normed=True)
plt.show()

图1.11所示为生成的分布直方图。

图1.11 正态分布

(4)Logistic分布(Logistic Distribution)

它类似于正态分布,但在形态上与正态分布存在较大差异,其具有细长的尾部。它的重要性在于积累分布函数(Cumulative Distribution Function,CDF),下面的章节中将会使用到它,读者会觉得它看起来很熟悉。

下面这段代码表示了它的基本分布。

import matplotlib.pyplot as plt #Import the plot library
import numpy as np
mu=0.5
sigma=0.5
distro2 = np.random.logistic(mu, sigma, 10000)
plt.hist(distro2, 50, normed=True)
distro = np.random.normal(mu, sigma, 10000)
plt.hist(distro, 50, normed=True)
plt.show()

结果如图1.12所示。

图1.12 Logistic分布(绿)和正态分布(蓝)[1]

如前所述,计算Logistic分布的积累分布函数时,读者将看到一个非常熟悉的图形,即Sigmoid曲线。后面在回顾神经网络激活函数时,还将再次看到它。代码如下。

plt.figure()
logistic_cumulative = np.random.logistic(mu, sigma, 10000)/0.02
plt.hist(logistic_cumulative, 50, normed=1, cumulative=True)
plt.show()

结果如图1.13所示。

图1.13 逆Logistic分布

这一节中,将看到概率中常见的统计度量。首先是均值和方差,其定义与前面在统计学中看到的定义没有区别。

1.偏度(Skewness)

它表示了一个概率分布的横向偏差,即偏离中心的程度或对称性(非对称性)。一般来说,如果偏度为负,则表示向右偏离;如果为正,则表示向左偏离。

图1.14描绘了偏度的统计分布。

图1.14 分布形状对偏度的影响

2.峰度(Kurtosis)

峰度显示了分布的中心聚集程度。它定义了中心区域的锐度,也可以反过来理解,就是函数尾部的分布方式。

峰度的表达式如下。

由图1.15可以直观地理解这些新的度量。

图1.15 分布形状对峰度的影响

为了覆盖机器学习的基础知识,尤其是像梯度下降(Gradient Descent)这样的学习算法,本书将介绍微分学所涉及的概念。

介绍覆盖梯度下降理论所必需的微积分术语需要很多章节,因此我们假设读者已经理解连续函数的概念,如线性二次对数指数,以及极限的概念。

为了清楚起见,我们将从一元函数的概念开始,然后简单地涉及多元函数。

1.变化分析——导数

在前一节中介绍了函数的概念。除了在整个域中定义的常值函数之外,所有函数的值都是动态的。这意味着在x确定的情况下,f(x1)与f(x2)的值是不同的。

微分学的目的是衡量变化。对于这个特定的任务,17世纪的许多数学家(莱布尼兹和牛顿是杰出的倡导者)努力寻找一个简单的模型来衡量和预测符号定义的函数如何随时间变化。

这项研究将引出一个奇妙的概念—— 一个具有象征性的结果,在一定条件下,表示在某个点上函数变化的程度,以及变化的方向。这就是导数的概念。

在斜线上滑动

如果想测量函数随时间的变化,首先要取一个函数值,在其后的点上测量函数。第一个值减去第二个值,就得到函数随时间变化的程度。代码如下。

import matplotlib.pyplot as plt
import numpy as np
 %matplotlib inline
def quadratic(var):
    return 2* pow(var,2)
x=np.arange(0,.5,.1)
plt.plot(x,quadratic(x))
plt.plot([1,4], [quadratic(1), quadratic(4)], linewidth=2.0)
plt.plot([1,4], [quadratic(1), quadratic(1)], linewidth=3.0,
label="Change in x")
plt.plot([4,4], [quadratic(1), quadratic(4)], linewidth=3.0,
label="Change in y")
plt.legend()
plt.plot (x, 10*x -8 )
plt.plot()

前面的代码示例首先定义了一个二次方程(2×x2),然后定义arange函数的域(0~0.5,步长0.1)。

定义一个区间,测量yx的变化,并画出测量的直线,如图1.16所示。

图1.16 求导操作起始设置的初始描述

x=1和x=4处测量函数,并定义这个区间的变化率。

根据公式,示例程序的运行结果是(36−0)/3=12

这个方法可以用来近似测量,但它太依赖于测量的点,并且必须在每个时间间隔都进行测量。

为了更好地理解函数的动态变化,需要能够定义和测量函数域中每个点的瞬时变化率。因为是测量瞬时变化,所以需要减少域x值之间的距离,使各点之间的距离尽量缩短。我们使用初始值x和后续值x + Δx来表示这个方法。

下面的代码中,通过逐步减小Δx来逼近差分值。代码如下。

initial_delta = .1
x1 = 1
for power in range (1,6):
    delta = pow (initial_delta, power)
    derivative_aprox= (quadratic(x1+delta) - quadratic (x1) )/
    ((x1+delta) - x1 )
    print "del    ta: " + str(delta) + ", estimated derivative: " +
    str(derivative_aprox)

在上面的代码中,首先定义了初始增量Δ,从而获得初始近似值。然后在差分函数中,对0.1进行乘方运算,幂逐步增大,Δ的值逐步减小,得到如下结果。

delta: 0.1, estimated derivative: 4.2
delta: 0.01, estimated derivative: 4.02
delta: 0.001, estimated derivative: 4.002
delta: 0.0001, estimated derivative: 4.0002
delta: 1e-05, estimated derivative: 4.00002

随着Δ值的逐步减小,变化率将稳定在4左右。但这个过程什么时候停止呢?事实上,这个过程可以是无限的,至少在数值意义上是这样。

这就引出了极限的概念。在定义极限的过程中,使 Δ 无限小,得到的结果称之为f(x)的导数或f ' (x),公式如下。

但是数学家们并没有停止烦琐的计算。他们进行了大量的数值运算(大多是在17世纪手工完成的),并希望进一步简化这些操作。

现在构造一个函数,它可以通过替换x的值来得到相应的导数。对于不同的函数族,从抛物线(y= x2+b)开始,出现了更复杂的函数(见图1.17),这一巨大的进步发生在17世纪。

图1.17 复杂函数

2.链式法则

在函数导数符号确定后,一个非常重要的结果就是链式法则。莱布尼茨在1676年的一篇论文中首次提到这个公式。它可以通过非常简单优雅的方式求解复合函数的导数,从而简化复杂函数的求解。

为了定义链式法则,假设有一个函数fF=f (g(x)),那么导数可以定义如下。

链式法则允许对输入值为另一个函数的方程求导。这与搜索函数之间关联的变化率是一样的。链式法则是神经网络训练阶段的主要理论概念之一。因为在这些分层结构中,第一层神经元的输出将是下一层的输入。在大多数情况下,复合函数包含了一层以上的嵌套。

偏导数(Partial Derivative)

到目前为止,本书一直使用单变量函数。但是从现在开始,将主要介绍多变量函数。因为数据集将不止包含一个列,并且它们中的每一列将代表不同的变量。

在许多情况下,需要知道函数在一个维度中的变化情况,这将涉及数据集的一列如何对函数的变化产生影响。

偏导数的计算包括将已知的推导规则应用到多变量函数,并把未被求导的变量作为常数导出。

看一看下面的幂函数求导法则。

f(x, y) = 2x3y

当这个函数对x求导时,y作为常量。可以将它重写为3 ∙ 2 y x2,并将导数应用到变量x,得到以下结果。

d/dx(f(x, y)) = 6y * x2

使用这些方法,可以处理更复杂的多变量函数。这些函数将是特征集的一部分,通常由两个以上的变量组成。

本章介绍了许多不同的概念,包括对一些基本数学概念的回顾,它们是机器学习的基础。

当我们正式进入不同建模方法机制的学习时,这些概念将非常有用。应尽可能提高对它们的理解,以便更好地掌握算法的工作原理。下一章将对机器学习项目的整个工作流程进行概述,这将帮助读者理解从数据收集到结果评估所需要的各个元素。

[1] 根据图表原文中Logistic(red)应为Logistic(green)。——译者注


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
动手学机器学习
动手学机器学习
机器学习与数据挖掘
机器学习与数据挖掘
机器学习公式详解 第2版
机器学习公式详解 第2版
自然语言处理迁移学习实战
自然语言处理迁移学习实战
AI医学图像处理(基于Python语言的Dragonfly)
AI医学图像处理(基于Python语言的Dragonfly)

相关文章

相关课程