机器学习及应用(在线实验+在线自测)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-05 09:23:58

点击下载

作者:李克清 时允田

出版社:人民邮电出版社有限公司

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

机器学习及应用(在线实验+在线自测)

机器学习及应用(在线实验+在线自测)试读:

前言

第1章 导论

1.1 引言

1.2 基本术语

1.3 概念学习与假设空间

1.4 归纳偏好

1.5 经验误差与过拟合

1.6 模型评估与选择

1.7 性能度量

1.8 发展历程

1.9 应用现状

习题1

第2章 Python初步

2.1 Python概述

2.2 NumPy库介绍

2.2.1 ndarray对象2.2.2 ufunc函数2.2.3 常用函数库

2.3 Matplotlib库介绍

2.3.1 快速绘制二维图表2.3.2 Artist对象2.3.3 配置属性2.3.4 绘制三维图表

2.4 SciPy库函数

2.4.1 线性代数模块2.4.2 优化和拟合模块2.4.3 统计模块2.4.4 稀疏矩阵模块

2.5 scikit-learn库函数

2.5.1 sklearn.datasets2.5.2 模型选择与评价2.5.3 scikit-learn的机器学习

习题2

第3章 决策树

3.1 引言

3.1.1 决策树的基本思想3.1.2 决策树的构造3.1.3 决策树的算法框架3.1.4 信息增益

3.2 ID3决策树

3.2.1 ID3算法3.2.2 ID3的实现

3.3 C4.5决策树

3.3.1 C4.5算法3.3.2 C4.5的实现

3.4 sklearn与回归树

3.4.1 回归算法原理3.4.2 最小剩余方差法3.4.3 剪枝策略3.4.4 sklearn实现

习题3

第4章 神经网络

4.1 引言

4.1.1 人工神经网络的发展历程4.1.2 人工神经网络的特点4.1.3 人工神经网络的分类

4.2 神经元模型

4.3 感知机与多层神经网络

4.3.1 感知机4.3.2 梯度下降法4.3.3 随机梯度下降法4.3.4 多层神经网络

4.4 误差反向传播算法

4.4.1 BP神经网络学习算法4.4.2 BP神经网络实验

4.5 玻耳兹曼机

4.5.1 BM的拓扑结构4.5.2 BM的学习过程

4.6 综合案例

习题4

第5章 支持向量机

5.1 引言

5.2 线性分类

5.2.1 函数间隔与几何间隔5.2.2 对偶问题

5.3 线性支持向量机

5.4 非线性支持向量机

5.4.1 核技巧5.4.2 sklearn SVC

5.5 序列最小优化算法

5.6 综合案例

习题5

第6章 贝叶斯分类器

6.1 引言

6.2 朴素贝叶斯分类

6.2.1 朴素贝叶斯算法6.2.2 朴素贝叶斯分类算法6.2.3 朴素贝叶斯分类算法的Python实现6.2.4 sklearn的朴素贝叶斯方法

6.3 极大似然估计

6.3.1 EM算法6.3.2 EM算法步骤6.3.3 三硬币的EM求解6.3.4 sklearn的EM方法

6.4 贝叶斯网络

6.4.1 贝叶斯网络的构造和学习6.4.2 贝叶斯网络应用举例

习题6

第7章 集成学习

7.1 引言

7.2 Voting

7.3 Bagging

7.4 Boosting

7.4.1 AdaBoost法7.4.2 Gradient Boosting

7.5 综合案例

习题7

第8章 聚类

8.1 引言

8.1.1 聚类的概念8.1.2 典型应用8.1.3 常见算法分类8.1.4 聚类算法中存在的问题

8.2 距离计算

8.2.1 闵可夫斯基距离8.2.2 欧几里得距离8.2.3 曼哈顿距离8.2.4 切比雪夫距离8.2.5 皮尔逊相关系数8.2.6 余弦相似度8.2.7 杰卡德相似系数

8.3 k-means聚类

8.3.1 算法思想8.3.2 辅助函数8.3.3 编程实现k-means算法8.3.4 scikit-learn中的k-means方法8.3.5 算法评价8.3.6 算法改进k-means++

8.4 密度聚类

8.4.1 密度聚类算法思想8.4.2 DBSCAN算法8.4.3 密度峰值聚类

8.5 层次聚类

8.5.1 层次聚类思想8.5.2 层次聚类实现

8.6 综合实例

8.6.1 聚类算法性能比较8.6.2 算法总结

习题8

第9章 降维

9.1 引言

9.1.1 降维的概念9.1.2 常见算法分类

9.2 k-近邻学习

9.2.1 算法实现9.2.2 算法实例9.2.3 算法关键

9.3 主成分分析

9.3.1 算法思想9.3.2 算法实例

9.4 低维嵌入

9.4.1 算法原理9.4.2 算法实例9.4.3 算法评价

9.5 奇异值分解

9.5.1 SVD算法原理9.5.2 SVD算法及应用示例

9.6 综合实例

9.6.1 PCA实例9.6.2 SVD实例

习题9

第10章 概率图模型

10.1 引言

10.2 马尔科夫过程

10.2.1 基本概念10.2.2 隐马尔科夫模型

10.3 Viterbi算法

10.4 综合案例

习题10

第11章 深度学习初步

11.1 引言

11.2 表示问题

11.3 学习问题

11.4 优化问题

11.5 认知问题

11.6 基本模型

11.6.1 自编码器11.6.2 受限玻耳兹曼机11.6.3 卷积神经网络

11.7 TensorFlow的简介与安装

11.7.1 Python 3环境11.7.2 安装TensorFlow11.7.3 验证

11.8 TensorFlow的基本使用

11.9 基于卷积神经网络的MNIST手写体识别实验

11.9.1 conv2d函数11.9.2 max_pool函数11.9.3 示例程序

习题11

参考文献

内容提要

本书详细地介绍了机器学习的基本原理,并采用“原理简述+问题实例+实际代码+运行结果”的模式介绍常用算法。全书共11章,主要包括决策树、神经网络、支持向量机、贝叶斯分类器、集成学习、聚类、降维等内容。

本书可以作为高校计算机及相关专业的教材,也可以作为机器学习培训班教材,并适合作为从事机器学习及应用的专业人员和广大机器学习爱好者的自学用书。

前言

器学习是计算机科学与人工智能的重要分支领域。这门学科所关注的问题是,计算机程序如何随着经验累积自动提高性能。机机器学习使用实例数据或过去的经验训练计算机,以优化性能标准。当人们不能通过直接编写计算机程序来解决给定的问题,而是需要借助于实例数据或经验时,就需要用到机器学习。

这是一本面向中文读者的机器学习教科书,为了使尽可能多的读者通过本书对机器学习有所了解,本书没有从理论的角度来揭示机器学习算法背后的数学原理。编者试图尽可能少地使用数学知识,主要通过“原理简述+问题实例+实际代码+运行结果”的模式来介绍每一个算法。然而,少量的概率、统计、代数、优化、逻辑知识似乎不可避免。学习计算机的人都知道,计算机是一门实践学科,没有真正实际运行,很难真正理解算法的精髓。本书的最大好处就是边学边用,非常适合于迈进机器学习领域的人员学习。实际上,即使对于那些对机器学习有所了解的人,通过代码实现也能进一步加深对机器学习算法的理解。

本书在内容上尽可能涵盖机器学习的基础知识,但作为机器学习入门的读物,并且受到授课时间的限制,很多重要的、前沿的材料未能覆盖,覆盖的部分也仅是管中窥豹。书中每章都给出了相应的习题,有的习题可帮助读者巩固本章学习,有的则是为了引导读者扩展相关知识。

全书共11章,高小惠编写了第2、8、9章,沈韬编写了第11章的后半部分,王勤宏编写了第3、6章,吴建平参与编写了第5章的部分内容,杨梦铎编写了第1章和第11章的前半部分,李克清编写了剩余的其他部分并统稿,时允田、林雪纲、薛乔毓进行了内容校验并提供U-SaaS在线实验平台资源支持。本书在写作过程中得到了编者单位的同事、学生和朋友的支持与帮助,在此对他们的无私奉献表示衷心的感谢。同时,也要感谢北京西普阳光教育科技股份有限公司的“教育部2016年西普教育产学合作协同育人项目”的资助,为本书的正式出版和发行提供了全力保障和后勤服务。

机器学习的发展极其迅速,目前已成为一个广袤的学科。编者才疏学浅,精力有限,书中疏漏和不足之处在所难免,恳请读者不吝告知,将不胜感激。编者2018年7月第1章 导论本章知识点

• 机器学习的概念

• 机器学习基本术语

• 概念学习与假设空间

• 模型评估与选择1.1 引言

什么是机器学习?从广义上来说,机器学习(Machine Learning)是计算机程序随着经验积累自动提高性能或系统自我改进的过程。以一个更形式化的定义来说,对于某类任务T和性能标准P,如果一个计算机程序在T上以P衡量性能,随着经验E而自我完善,就称这个计算机程序从经验E中学习。例如,对于手写识别学习的问题,任务T是识别和分类图像中的手写文字,性能标准P是分类的正确率,训练经验E是已知分类的手写文字数据库。这就是说,为了很好地定义一个计算机学习问题,学习问题的标准描述包括了3个基本的特征,即任务的种类、衡量任务提高的标准及经验的来源。简而言之,学习就是通过经验提高性能的某类程序。

机器学习正是致力于研究如何通过计算的手段及利用经验来改善系统自身性能的一门学科。为了在计算机上解决问题,通常需要一定的算法。这些对于特定任务设计的算法需要一定的输入,依据特定的指令序列对输入进行变换,得到输出。例如,我们可以设计一种排序算法,输入一个数字集合,输出这个数字集合的一个有序列表。然而,对于现实中的很多任务,我们并没有确定的算法,例如为每天收取的邮件进行分类,区分其是垃圾邮件还是正常邮件。尽管我们知道输入是邮件文档,输出为是否是垃圾邮件,然而并不知道应该按照怎样的规则将这种输入变换成输出。

事实正是如此,机器学习所面临的绝大多数问题都是这种没有确定算法的学习问题。对于这一类学习任务,我们希望计算机自动地为学习任务提取相应的算法。换言之,在排序的例子中,我们不需要学习如何将数字集合进行排序,因为已经有了排序的算法。然而在垃圾邮件的例子中,我们确实没有既定的算法,这需要计算机从过去的经验中进行学习,自动地提取出能够分类邮件的学习算法。

在计算机系统中,经验通常以数据的形式存在。为了能够自动地从经验中提取出学习算法,需要获得过去大量的邮件实例来作为数据。接下来要做的事情就是从实例数据中学习出垃圾邮件的模型,以此作为判断的依据。因此,机器学习所研究的主要内容,是如何在计算机上从数据中产生模型的算法,即学习算法。有了学习算法,我们可将经验以数据的形式提供给计算机,计算机就能基于这些数据产生相应的模型。继而在面对新的情况时,学习到的模型能够提供相应的判断,比如计算机能够正确分类一封新邮件是否是垃圾邮件。从这个意义上来说,机器学习是研究学习算法的学问,机器学习的过程是从大量数据中自动地寻找有用模型的过程。1.2 基本术语

要进行机器学习,首先需要有数据。考虑手写体数字识别的问题,假设每个数字对应一个28像素×28像素的灰度图像,依照矩阵逐列首尾相接拼成向量的方式,每一幅数字图像可以表示为一个由784个实数组成的向量x。假定收集了一组手写体数字的图像,均以向量的形式表示,这组图像向量的集合称为一个数据集(Data Set),其中的每个向量是关于一幅手写体数字图像的描述,称为一个实例(Instance)或样本(Sample)。784维向量中的每一维反映了图像在某个特定方面的表现性质,称为属性(Attribute)或特征(Feature);属性的取值,也就是向量中每个元素对应的实数值,称为属性值(Attribute Value)。这些属性所张成的空间称为属性空间(Attribute Space),也叫样本空间(Sample Space)或输入空间(Input Space)。由此,所有特征张成一个用于描述手写体数字的784维空间,在这个属性空间中,每一幅图像对应了该空间中的一个点。由于空间中的每个点可以用一个坐标向量来表示,因此也把一个样本称为一个特征向量(Feature Vector)。

一般的,令D={x,x,…,x}表示包含m个样本的数据集,每个样本12m由d个属性描述,则每个样本是d维属性空间X中的一个向量,x∈X,其中x是x在第j个属性上的取值,d称为样iiji本x的维数(Dimensionality)。i

手写体数字识别问题的目标是建立一个机器,能够以代表一幅手写体数字图像的向量x作为输入,以0~9中的某一个数字作为输出。这不是一个简单的问题。通过人工编写规则解决这样的问题经常会给出较差的结果,原因是手写体数字形态变化多端。而使用机器学习的方法可以得到好得多的结果。

机器学习试图从数据中寻找特定的模型,这种从数据中学得模型的过程称为学习(Learning)或训练(Training)。在学习算法中,一个由N个数字组成的大的集合{x,x,…,x}被称作训练集(Training 12NSet),用来调节模型的参数。这些在训练过程中使用的数据也称为训练数据(Training Data),其中的每个样本称为一个训练样本(Training Sample)。训练集就是所有训练样本组成的集合。训练集中数字的类别称为目标向量(Target Vector),用来代表训练数据的标记信息或标签(Label)。拥有了标记信息的样本称为样例(Example)。一般的,用(x,y)表示第i个样例,其中,y∈Y,y是样iiii本x的标记,Y是所有标记的集合,亦称标记空间(Label Space)或i输出空间(Output Space)。依据训练数据是否拥有标记信息,机器学习任务可大致划分为监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)两大类。

机器学习算法可以表示为一个函数y=f(x),假设以手写体图像x作为输入,向量y作为输出,其中,向量y的形式与目标向量的形式相同。在训练数据的基础上,函数f(x)的精确形式在训练阶段或学习阶段被确定。一旦模型被训练出来,它就能确定新的手写体数字集合中的图像标签。这些新的手写体数字图像组成的集合称为测试集(Test Set)。使用学习得到的模型进行预测的过程称为测试(Testing),被预测的样本称为测试样本(Testing Sample)。学习得到的模型适用于新样本的能力称为泛化(Generalization)能力。

如果希望预测的结果是离散值,如这里的0~9这10个数字,此类学习任务称为分类(Classification);如果希望预测的结果是连续值,此类学习任务称为回归(Regression)。在分类任务中,将只涉及两个类别的学习任务称为二分类(Binary Classification)任务。通常称其中一个类为正类(Positive Class),相应的样例称为正例(Positive Example);称另一个类为负类或反类(Negative Class),相应的样例称为负例或反例(Negative Example)。当涉及多个类别时,学习任务则称为多分类(Multi-Class Classification)任务。如果在学习过程中使用的训练样本不具备标记信息,我们依然希望可以将训练集中的数据分成若干组,这样的学习任务称为聚类(Clustering)。聚类任务中的每个组称为一个簇(Cluster),这些自动形成的簇对应一些潜在概念的划分,有助于我们了解数据内在的规律。从训练数据是否拥有标记信息的角度我们可以知道,分类和回归是监督学习的代表,而聚类则是非监督学习的代表。1.3 概念学习与假设空间

归纳(Induction)与演绎(Deduction)是科学推理的两大基本手段。归纳是从特殊到一般的泛化过程,即从具体的事实归结出一般性规律;演绎则是从一般到特殊的特化(Specialization)过程,即从基础原理推演出具体情况。从特殊的训练样例中归纳出一般函数是机器学习的中心问题,该归纳过程称为归纳学习(Inductive Learning)。

归纳学习有广义与狭义之分,前者通常指的是从样例中学习的归纳过程,而后者指的是从训练数据中学得概念(Concept),因此狭义的归纳学习也称为概念学习(Concept Learning)。对概念学习有所了解,有助于理解机器学习的一些基础思想。

概念学习考虑的问题是,给定一样例集合及每个样例是否属于某一概念的标记,怎样自动推断出该概念的一般定义。概念定义在一个实例(Instance)集合之上,这个集合表示为X。在学习目标概念时,必须提供一套训练样例(Training Examples),每个样例为X中的一个实例x及它的目标概念值c(x)。通常用序偶来描述训练样例,表示包含了实例x和目标概念值c(x)。符号D用来表示训练样例的集合。

一旦给定目标概念c的训练样例集,学习器面临的问题就是假设或估计c。可以把学习过程看作一个在所有可能假设(All Possible Hypotheses)的集合上进行搜索的过程,搜索的目标是找到与训练集匹配(Match)或拟合(Fit)的假设。这些所有可能的假设(Hypothesis)组成的空间称为假设空间(Hypothesis Space)。假设空间中的假设集合才是确定目标概念所考虑的范围,通常使用符号来表示。机器学习的目标就是寻找一个假设h,使对于X中的所有x有h(x)=c(x)。换言之,机器学习的任务是在整个实例集合X上确定与目标概念c相同的假设h。

事实上,目标概念c仅仅是训练样例上的信息,没有包含测试样例。因此,归纳学习算法最多只能保证输出的假设能与训练样例相拟合。如果没有更多的信息,我们只能假定,对于未见实例,最好的假设就是与训练数据最佳拟合的假设。由此引出归纳学习的一个基本假设,即归纳学习假设:任一假设如果在足够大的训练样例集中很好地逼近目标函数,它也能在未见实例中很好地逼近目标函数。

概念学习可以看为一个搜索过程,范围是假设的表示所隐含定义的整个空间。搜索的目标是寻找能最好地拟合训练样例的假设。自然的,对学习算法的研究需要考查假设空间搜索的不同策略。特别引起我们兴趣的算法应能有效地搜索非常大的或无限大的假设空间,以找到最佳拟合训练数据的假设。有很多策略可以对这个假设空间进行搜索,如自顶向下、从一般到特殊,或是自底向上、从特殊到一般。搜索过程中可以不断删除与正例不一致的假设和(或)与反例一致的假设,最终获得与训练集一致的假设,即对所有训练样本能够进行正确判断的假设,这就是我们学得的结果。1.4 归纳偏好

必须注意到,当假设的表示形式选定后,也就隐含地为学习算法确定了所有假设的空间。这些假设是学习程序所能表示的,也是它能够学习的。通常情况下,当给定正确的训练样例且保证初始假设空间包含目标概念时,学习算法可以收敛到目标概念。如果要保证假设空间包含目标概念,一个明显的方法是扩大假设空间,使每个可能的假设都包含在内。在现实问题中,通常会面临很大的假设空间,但学习过程是基于有限样本训练集进行的,因此,可能有多个假设与训练集一致,即存在着一个与训练集一致的假设集合(Hypothesis Set),称为版本空间(Version Space)或变形空间,因为它包含了目标概念所有合理的变形。然而,对于一个具体的学习算法而言,它必须产生一个模型。这时,学习算法本身的偏好(Bias)就会起到关键的作用。机器学习算法在学习过程中对某种类型假设的偏好,称为归纳偏好(Inductive Bias)。

任何一个有效的机器学习算法必有其归纳偏好,否则它将被假设空间中看似在训练集上等效的假设所迷惑,而无法产生确定的学习结果。这说明了归纳学习的一个基本属性:学习器如果不对目标概念的形式做预先的假定,从根本上就无法对未见实例进行分类。可以说,归纳偏好是学习器从训练样例中泛化并在推断新实例的分类过程中所采用的策略。归纳偏好可看作学习算法在对所有假设进行选择时的“价值观”。一种算法的有偏性越强,那么它的归纳能力就越强,可以分类更多的未见实例。

引导学习算法确立“正确”偏好的一个一般性原则是奥卡姆剃刀(Occam's Razor)原则,即优先选择拟合数据的最简单的假设。这就是说,当有多个假设与观察一致时,则选择最简单的那个。这里的“一致”是指假设能够正确分类训练样例集合D中的每一个样例,即对于,都有h(x)=c(x)。奥卡姆剃刀的一种解释是短假设基于简单的参数组合,因此其数量少于长假设的数量,所以找到一个短的但同时与训练数据拟合的假设的可能性较小。当然,奥卡姆剃刀并非是唯一可行的原则。

事实上,归纳偏好对应了学习算法本身所做出的关于“什么样的模型更好”的假设。在具体的现实问题中,这个假设是否成立,即算法的归纳偏好是否与本问题自身匹配,大多数时候直接决定了算法能否取得好的性能。此外,必须认识到,脱离具体的问题,空泛地谈论“什么学习算法更好”毫无意义。要谈论算法的相对优劣,必须要针对具体的学习问题。在某些问题上表现好的学习算法,在另一些问题上却可能不尽如人意。学习算法自身的归纳偏好与问题是否相配,往往会起到决定性的作用。1.5 经验误差与过拟合

通常,把分类错误的样本数占样本总数的比例称为错误率(Error Rate),即如果在m个样本中有a个样本分类错误,则错误率为E=a/m;相应的,1-E称为精度,即精度=1-错误率。更一般的,把学习器的实际预测输出与样本的真实输出之间的差异称为误差(Error),学习器在训练集上的误差称为训练误差(Training Error)或经验误差(Empirical Error),在新样本上的误差称为测试误差(Testing Error)或泛化误差(Generalization Error)。显然,希望得到泛化误差小的学习器。然而,事先并不知道新样本是什么样的,实际能做的是努力使经验误差最小化。为了能让学习器在新样本上表现得出色,应该从训练样本中尽可能学习到适用于所有潜在样本的普遍规律,这样才能在遇到新样本时做出正确的判断。

然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。这也就是说,对于一个假设,当存在其他假设对训练样例的拟合比它差,但在训练集以外的实例上表现得更好时,就说这个假设过度拟合训练样例。这种现象在机器学习中称为过拟合(Overfitting)。与过拟合相对的是欠拟合(Underfitting),这是指学习器对训练样本的一般性质尚未学好。

有很多种因素可能导致过拟合情况的发生。一种可能原因是训练样例含有随机错误或噪声,当假设试图拟合含有噪声的训练样例后,学习器的泛化能力自然会受到影响。事实上,当训练数据没有噪声时,过拟合也有可能发生。一种最常见的情况是由于学习器的学习能力过于强大,以至于把训练样例所包含的不太一般的特性都学到了。还有一种情况是训练样例太少,很可能出现巧合的规律性,使得一些属性恰巧可以很好地分割样例,但却与实际的目标函数无关系。一旦这种巧合的规律性存在,就有过拟合的风险。过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施。然而,我们必须认识到,过拟合是无法彻底避免的,只能够尽量地缓解过拟合或者减小过拟合带来的风险。1.6 模型评估与选择

在现实任务中,往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型。那么,该选用哪一个学习算法,使用哪一种参数配置呢?这就是机器学习中的模型选择(Model Selection)问题。

从归纳偏好的角度来说,模型选择要解决的问题实际上是如何选择正确的归纳偏好。对于这种问题的解答,应当记住,机器学习的目标不是复制训练数据,而是预测新情况。也就是说,希望对于训练集之外的输入能够产生正确的输出,而这个正确的输出并没有在训练集中给出。换言之,希望训练的模型能够很好地泛化。通常,可使用评估方法来对学习器的泛化误差进行评估,进而进行模型选择。

如果访问训练集以外的数据,就能够度量假设的泛化能力,即它的归纳偏好的质量。通过将已有的训练集划分为两部分来模拟这一过程:使用一部分来做训练,即拟合一个假设;而剩下的部分称作验证集(Validation Set),用来检验假设的泛化能力。也就是说,给定可能的假设类的集合,对于每一个集合,我们在训练集上拟合最佳的。假定训练集和验证集都足够大,则在验证集上最准确的假设就是最好的假设,即具有最佳归纳偏好的假设。这一过程称为交叉验证(Cross-Validation)。

交叉验证法是一种常见的评估方法,通常把交叉验证法称为k-折交叉验证或k-倍交叉验证(k-fold Cross-Validation)。具体的做法是,先将数据集D划分为k个大小相似的互斥子集,即D=D∪D∪…12∪D,D∩Dj=ϕ(i≠j)。每个子集D(i=1,2,…,k)都尽可能保持数据分布的kiji一致性,避免因数据划分过程中引入额外的偏差而对最终结果产生影响。如果从采样(Sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为分层采样(Stratified Sampling),即每个子集D都从D中分层采样得到。然后,每次用k-1个子集的并集作i为训练集,余下的那个子集作为验证集。这样就可以获得k个组训练/验证集,从而可进行k次训练和验证,最终返回的是这k个验证结果的均值。

值得一提的是,验证集是在模型评估与选择中用于评估测试的数据集,而学得模型在实际使用中遇到的数据集称为测试集,它包含在训练阶段或验证阶段未使用过的数据中。如果需要报告学得模型的期望误差,就不应该使用验证误差,而应该使用测试误差。在研究对比不同算法的泛化性能时,用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集合验证集,基于验证集上的性能来进行模型选择。另外,需注意的是,也不能一直使用相同的训练集和验证集划分,因为一旦使用一次,验证集实际上就已经成为训练集的一部分了。

一定要记住,使用的训练数据是一个随机样本。也就是说,对于相同的应用,如果多次收集数据,则将得到稍微不同的数据集,拟合的h也稍微不同,并且具有稍微不同的验证误差。或者,如果把固定的数据集划分成训练集、验证集和测试集,则依赖于如何划分,会有不同的误差。这些微小的不同可以估计多大的差别可以看作是显著的而非偶然的。换言之,在假设类和之间进行选择时,我们将在大量训练集和验证集上多次使用它们,并检查h和h的平均误差之ij差是否大于多个h之间的平均差。i1.7 性能度量

对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(Performance Measure)。对于预测任务,给定样例集D={(x,y),11(x,y),…,(x,y)},其中,y是实例x的真实标记。要评估学习器f的22mmmm性能,就要把学习器预测结果f(x)与真实标记y进行比较。

在分类任务中,错误率和精度是最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。对于样例集D,分类错误率定义为式(1.1)。

精度则定义为式(1.2)。

其中,I(•)是指示函数,若•为真则取值为1,否则取值为0。更一般的,对于数据分布D和概率密度函数p(•),错误率可描述为式(1.3)。

精度可描述为式(1.4)。

在回归任务中,最常用的性能度量是均方误差(Mean Squared Error),其定义为式(1.5)。

更一般的,对于数据分布D和概率密度p(•),均方误差可描述为式(1.6)。

错误率和精度虽然常用,但是并不能满足所有的任务需求。例如在信息检索中,经常会关心“检索出的信息中有多少比例是用户感兴趣的”“用户感兴趣的信息中有多少被检索出来了”。更适用于此类需求的性能度量是查准率(P)与查全率(R)。

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(True Positive,TP)、假正例(False Positive,FP)、真负例(True Negative,TN)、假负例(False Negative,FN)4种情形。对于一个正实例,如果预测也是正的,则它是一个真正例;如果对正实例的预测是负的,则它是一个假负例。对于一个负实例,如果预测也是负的,则它是一个真负例;如果将负实例预测为正的,则它是一个假正例。在二分类问题中有两种类型的错误,即假正例和假负例。让我们设想一种身份认证应用,其中用户通过声音登录其账户。假正例是错误地允许冒名顶替者(模仿真实用户的声音)登录,而假负例则会拒绝合法用户。

令TP、FP、TN、FN分别表示真正例、假正例、真负例、假负例对应的样例数,则显然有TP+FP+TN+FN=样例总数。分类结果的混淆矩阵(Confusion Matrix)如表1-1所示。表1-1 分类结果的混淆矩阵

查准率P与查全率R分别定义为式(1.7)和式(1.8)。

查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。在一些应用中,对查准率和查全率的重视程度有所不同。例如在商品推荐系统中,为了尽可能少地打扰用户,更希望推荐的内容的确是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,更希望尽可能少地漏掉逃犯,此时查全率更重要。

在聚类任务中,样本集D={x,x,…,x}包含m个无标记样本。评估12m学习器f的性能标准是尽量使得聚类结果的簇内相似度(Intra-Cluster Similarity)高,并且簇间相似度(Inter-Cluster Similarity)低。聚类性能度量亦称聚类有效性指标(Validity Index),大致可以分为两类:一类是将聚类结果与某个参考模型(Reference Model)进行比较,称为外部指标(External Index);另一类是直接考察聚类结果而不利用任何参考模型,称为内部指标(Internal Index)。1.8 发展历程

机器学习的发展离不开人工智能(Artificial Intelligence,AI)研究的推动。随着人工智能领域发展到一定的阶段,机器学习应运而生。

20世纪50年代到70年代初,是人工智能领域的“推理期”。这个时代的普遍思想是,只要赋予机器一定的逻辑推理能力,机器就能够具有智能(Intelligent)。代表性的工作包括纽厄尔(A. Newell)和西蒙(H. Simon)的逻辑理论家程序及通用问题求解程序等。这些程序在对一些著名数学定理的证明上取得了令人振奋的成果。例如,1952年,逻辑理论家程序证明了数学家罗素(Bertrand Russell)和怀特海(Alfred North Whitehead)的名著《数学原理》中的38条定理;1963年证明了这本著作中的全部52条定理。

然而,随着研究的逐渐发展,人们认识到仅仅利用推理能力来实现人工智能是远远不够的。人工智能的实现还需要设法让机器拥有知识。

20世纪70年代中期开始,是人工智能的“知识期”。大量的专家系统是这个时期的代表性产物,为很多应用领域做出了巨大贡献。知识工程之父费根鲍姆(E. A. Feigenbaum)在1994年获得了图灵奖(A. M. Turing Award)。

但是,随着知识工程瓶颈的到来,专家系统很难将人类总结出来的知识教授给计算机。于是,一个被学者广泛接受的想法随之产生:让机器自己学习知识。

实际上,早在1950年,图灵(A. M. Turing)就已经提出了机器学习的可能性。20世纪50年代,研究者陆续开展了有关机器学习的研究工作。代表性工作主要有罗森勃拉特(F. Rosenblatt)的感知机及威德罗(B. Widrow)的自适应线性神经元(Adaline)。20世纪60年代至70年代,以决策理论为基础的统计学习技术及强化学习技术得到了初步发展,基于逻辑或图结构表示的符号学习技术也开始出现。前者的代表性工作主要有塞缪尔(A. L. Samuel)的跳棋程序及尼尔森(N. J. Nilsson)的学习机器等;后者的代表性工作主要有温斯顿(P. Winston)的结构学习系统、麦可尔斯基(R. S. Michalski)等人的基于逻辑的归纳学习系统、亨特(E. B. Hunt)等人的概念学习系统等。

20世纪80年代,机器学习已经成为一个独立的学科领域,并且作为解决知识工程瓶颈问题的关键开始显现出巨大的张力。

1980年的夏天,第一届机器学习研讨会在美国卡内基梅隆大学举办;同年,《策略分析与信息系统》(Strategic analysis and information systems)连续出版三期机器学习专辑;1983年,Tioga出版社出版了米哈尔斯基(R. S. Michalski)、加博内尔(J. G. Carbonell)和米切尔(T. M. Mitchell)主编的《机器学习:一种人工智能途径》(Machine learning: an artificial intelligence approach)一书,书中汇集的学者文章对当时的机器学习研究工作进行了总结,引起了很大反响;1986年,《机器学习》(Machine Learning)创刊;1989年,Artificial Intelligence出版了机器学习专辑,当时的一些比较活跃的研究工作后来被引用在J. G. Carbonell主编的MIT出版社1990年出版的《机器学习:风范与方法》一书中。

20世纪90年代中期之前,受到专家系统发展的影响,逻辑知识表示与归纳逻辑程序设计成了这一时期的主流。马格莱顿(S. H. Muggleton)主编的书对这一时期的归纳逻辑程序设计方面的研究工作做了总结。然而,归纳程序设计因为过强的表示能力而面临很多假设空间问题,因此很快关于这方面的研究就陷入了低谷。与此同时,鲁梅尔哈特(D. E. Rumelhart)、欣顿(G. E. Hinton)和威廉姆斯(R. J. Williams)发明了著名的BP算法,基于神经网络的连接主义学习由于BP(Back Propagation)算法的成功而迅速兴起。相比于归纳逻辑程序设计,连接主义学习所面临的假设空间要小得多,很多实际问题都得到了解决。当然,连接主义学习的局限性也很快被认识到:大量的经验参数需要通过试错的方式来调试,学习效果很多时候依赖于一个好的参数设置。

20世纪90年代中期,统计学习开始占据机器学习的主流,统计学习理论为学习器提供了强有力的理论基础。特别的,有效的支持向量机算法在20世纪90年代被波沙(B. E. Boser)、居翁(I. Guyon)和瓦普尼克(V. N. Vapnik)提出,而其优越的性能也在阿基姆(T. Joachims)等人对文本分类的研究中显现了出来,使得支持向量机算法红极一时。支持向量机的广泛使用,使得核方法(Kernel Method)逐渐成为机器学习中被普遍使用的一种基本技巧。统计学习在20世纪90年代中期开始成为机器学习的主流技术。

然而,利用统计学习描绘学习问题有时候又过于理想化。统计特性或简化问题时经常需要做出一定的假设,但是这些假设往往在真实世界中是难以成立的。另外,虽然理论上说把原始空间利用核技巧转化到一个新的特征空间可以解决十分复杂的问题,但困难的是如何选择合适的核映射,这经常有着浓重的经验主义色彩。

21世纪初,连接主义学习以深度学习(Deep Learning)算法的形式卷土重来,卓越的性能迅速引发了学术界和工业界的热潮。究其原因,一是硬件水平的发展使得设备的计算能力得到强有力的提升,二是大数据(Big Data)时代的到来为深度学习模型提供了大储量的数据样本。当然,严格的理论基础的缺乏是深度学习一个无法回避的软肋。此外,连接主义学习很难有效地表示出复杂数据之间的关系,这一方面使得领域知识的使用变得困难,另一方面也让学习结果具有黑箱的性质。不过,换个角度来说,深度学习严格的理论基础的缺乏显著降低了机器学习应用的门槛,为机器学习走向工程实践带来了极大的便利,恰巧人类迈进了数据量爆发的时代,这在一定程度上缓解了复杂模型下过拟合的问题。1.9 应用现状

机器学习与模式识别、统计学习、数据挖掘、计算机视觉、语音识别、自然语言处理等领域有着很紧密的联系。机器学习与模式识别的主要区别在于,前者是从工业界发展起来的概念,后者则主要源自计算机学科。在著名的《模式识别与机器学习》(Pattern Recognition And Machine Learning)一书中,C. M. Bishop在开头是这样说的“模式识别源自工业界,而机器学习来自于计算机学科。不过,它们的活动可以被视为同一个领域的两个方面,同时在过去的10年间,它们都有了长足的发展”。机器学习在模式识别方面有很多应用。其中之一是光学字符识别(Optical Character Recognition,OCR),即从字符图像识别字符编码。这是多类问题的一个例子,类与我们想要识别的字符一样多。对于人脸识别(Face Recognition),输入的是人脸图像,而类是需要识别的人,并且学习程序应当学习人脸图像与身份之间的关联性。在医学诊断(Medical Diagnosis)中,输入的是关于患者的信息,而类是疾病。生物测定学(Biometrics)使用人的生理和行为特征来识别或认证人的身份,它需要集成来自不同形态的输入。

机器学习方法在大型数据库中的应用称为数据挖掘。在数据挖掘中,需要处理大量的数据以构建有使用价值的简单模型,例如具有高准确率的预测模型。数据挖掘的应用领域非常广泛:除零售业以外,在金融业,银行分析历史数据,构建用于信用分析、诈骗检测、股票市场等方面的应用模型;在制造业,学习模型可以用于优化、控制及故障检测等;在医学领域,学习程序可以用于医疗诊断等;在电信领域,通话模式的分析可用于网络优化和提高服务质量;在科学研究领域,比如物理学、天文学及生物学的大量数据,只有使用计算机才可能得到足够快的分析。万维网是巨大的,并且在不断增长,因此在万维网上检索相关信息不可能依靠人工完成。

统计学习是与机器学习高度重叠的学科。因为机器学习中的大多数方法来自统计学,甚至可以认为,统计学的发展促进机器学习的繁荣昌盛。例如著名的支持向量机算法,就源自统计学科。但是在某种程度上两者是有分别的:统计学习者重点关注的是统计模型的发展与优化,偏数学;而机器学习者关注的是能否解决问题,偏实践。因此机器学习研究者会重点研究学习算法在计算机上执行的效率与准确性的提升。机器学习在构建数学模型时利用了统计学理论,因为其核心任务就是由样本进行推理的。

计算机视觉涉及图像处理与机器学习。图像处理技术可将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。与计算机视觉相关的应用非常多,如百度识图、手写字符识别、车牌识别等应用。这个领域的应用也成了研究的热门方向。机器学习的新领域——深度学习的发展,大大促进了计算机图像识别的效果,因此未来计算机视觉界的发展前景不可估量。

语音识别就是音频处理技术与机器学习的结合。语音识别技术一般不会单独使用,一般会结合自然语言处理的相关技术。目前的相关应用有苹果的语音助手Siri等。在语音识别中,输入的是语音,类是可以读出的词汇。这里要学习的是从语音信号到某种语言的词汇的关联性。由于年龄、性别或口音方面的差异,不同的人对于相同词汇的读音不同,这使得语音识别相当困难。语音识别的另一个特点是,其输入信号是时态的,词汇作为音素的序列实时读出,而且有些词汇的读音会比其他词汇长一些。

通俗地说,自然语言处理就是在文本处理的基础上加入了机器学习方法,让机器理解人类的语言。在自然语言处理技术中,大量使用了编译原理相关的技术,如词法分析、语法分析等,除此之外,在理解层面则使用了语义理解、机器学习等技术。作为唯一由人类自身创造的符号,自然语言处理一直是机器学习界不断研究的方向。如何利用机器学习技术进行自然语言的深度理解,一直是工业和学术界关注的焦点。

无疑,在2010年以前,机器学习的应用在某些特定领域发挥了巨大的作用,如车牌识别、网络攻击防范、手写字符识别等。但是,从2010年以后,随着大数据概念的兴起,机器学习的大量应用都与大数据高度耦合,几乎可以认为大数据是机器学习应用的最佳场景。大数据的核心是利用数据的价值,机器学习是利用数据价值的关键技术。对于大数据而言,机器学习是不可或缺的。相反,对于机器学习而言,数据越多越可能提升模型的精确性,同时,复杂的机器学习算法的计算时间也迫切需要分布式计算与内存计算这样的关键技术。因此,机器学习的兴盛也离不开大数据的帮助。大数据与机器学习是互相促进、相依相存的关系。在大数据的时代,有好多优势促使机器学习能够应用得更广泛。例如随着物联网和移动设备的发展,我们拥有的数据越来越多,种类也包括图片、文本、视频等非结构化数据,这使得机器学习模型可以获得越来越多的数据。同时大数据技术中的分布式计算Map-Reduce使得机器学习的速度越来越快,可以更方便地使用。种种优势使得机器学习可以得到最佳的发挥。习题1

1. 给出3种机器学习方法适合的计算机应用,3种不适合的计算机应用。挑选本书未提及的应用并对每个应用以一句话来评价。

2. 挑选一些本书未提到的学习任务,非正式地加以描述,并尽可能精确地描述出它的任务、性能衡量标准和训练经验,最后给出要学习的目标函数和它的表示。讨论在设计这个任务时对任务描述所做的简化与对性能衡量标准设定时所做的折中。

3. 若数据包含噪声,则假设空间中有可能不存在与所有训练样本都一致的假设,在此情形下,试设计一种归纳偏好以用于假设选择。

4. 如果人脸图像是100像素×100像素的,按行写出,则它是一个10000维向量。如果我们把图像向右移动一个像素,则得到一个10000维空间中的另一个向量。如何构造一个对于这种扰动具有健壮性的人脸识别器?

5. 试述机器学习能在互联网搜索的哪些环节起什么作用。

6. 如何评价一个机器学习器的性能?试举例说明。扫一扫在线测第2章 Python初步本章知识点

• NumPy库

• Matplotlib库

• SciPy库

• scikit-learn库2.1 Python概述

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初诞生以来,Python语言在处理系统管理任务和Web编程等方面得到了广泛的应用。目前,Python已经成为最受欢迎的程序设计语言之一。

由于Python语言的简洁、易读及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程。例如,麻省理工学院的计算机科学及编程导论课程就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。Python的专用科学计算扩展库就更多了,经典的科学计算扩展库包括NumPy、Matplotlib、SciPy和scikit-learn等,它们分别为Python提供了快速数组处理、数值运算、绘图功能及机器学习算法。因此,Python语言及其众多的扩展库所构成的开发环境十分适合工程技术人员、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2.2 NumPy库介绍

NumPy是Python的一种开源的数值计算扩展库,提供了大型矩阵的存储和运算功能。它一般与SciPy、Matplotlib一起使用。本书假定以如下方式导入NumPy函数库:  import numpy as np2.2.1 ndarray对象

NumPy的主要对象是多维度数组ndarray,它是由相同数据类型的元素组成的表,通常是数值元素。NumPy数组的下标从0开始。

在NumPy中,每一个线性的数组称为轴(axes),秩用于描述轴的数量。比如,一个3D空间坐标[3,1,2]是一个秩为1的数组,因为它的轴数量为1,而轴的长度是3。再比如,[[ 1., 0., 0.], [ 0., 1., 2.]]是一个秩为2的二维数组,其第一个维度(轴)的长度是2,第二个维度(轴)的长度是3。

1. 创建数组、数列及矩阵(1)numpy.array方法。该方法能以list或tuple变量为参数产生数组。注意,numpy.array方法在代码中使用别名np.array。

示例:  print (np.array([1,2,3,4]))  print (np.array([[1,2],[3,4]]))

运行结果如下:  [1 2 3 4]  [[1 2]  [3 4]](2)numpy.arange方法。通过指定开始值、终值和步长等参数创建等差数列,结果不包含终值。注意,numpy.arange方法在代码中使用别名np.arange。

示例:  print (np.arange(15))  print (np.arange(10,20,2))  print (np.arange(15).reshape(3,5))

运行结果如下:  [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]  [10 12 14 16 18]  [[ 0 1 2 3 4]   [ 5 6 7 8 9]   [10 11 12 13 14]](3)numpy.linspace方法。通过指定开始值、终值和元素个数等参数创建等差数列,结果包含终值。注意,numpy.linspace方法在代码中使用别名np.linspace。

示例:  print (np.linspace(1,3,9))

运行结果如下:  [ 1. 1.25 1.5 1.75 2. 2.25 2.5 2.75 3. ](4)使用numpy.zeros、numpy.ones、numpy.eye等方法构造特定矩阵。注意,numpy.zeros、numpy.ones、numpy.eye方法在代码中分别使用别名np.zeros、np.ones、np.eye。

示例:  print (np.zeros((3,4))) #创建一个全0的矩阵  print (np.ones((3,4))) #创建一个全1的矩阵  print (np.eye(3)) #创建一个对角线上元素为1的方阵

运行结果如下:  [[ 0. 0. 0. 0.]   [ 0. 0. 0. 0.]   [ 0. 0. 0. 0.]]  [[ 1. 1. 1. 1.]   [ 1. 1. 1. 1.]   [ 1. 1. 1. 1.]]  [[ 1. 0. 0.]   [ 0. 1. 0.]   [ 0. 0. 1.]]

2. 常见属性

ndarray对象的常见属性如表2-1所示。表2-1 ndarray对象的常见属性

示例:  a = np.zeros((2,2,2))  print (a.ndim) #输出数组a的维数  print (a.shape) #输出数组a的每一维的大小  print (a.size) #输出数组a的元素个数  print (a.dtype) #输出数组a的元素的数据类型

运行结果如下:  3  (2, 2, 2)  8  float642.2.2 ufunc函数

NumPy中的ufunc函数可对数组的每个元素操作,产生一个数组作为输出。一元ufunc函数举例如表2-2所示。表2-2 一元ufunc函数举例

除了一元ufunc函数外,NumPy中还包括了下面的二元ufunc函数。

① add:元素对应相加。

② subtract:第一个数组中的元素减去第二个数组中的相应位置上的元素。

③ multiply:数组元素相乘。

④ divide、floor_divide:除法,或向下整除(丢弃余数)。

⑤ power:第一个数组中的元素为A,第二个数组中的元素为B,返回A的B次方。

⑥ maximum、fmax:返回两个数组中由较大值组成的数组。

⑦ mod:求模,即求余数。

⑧ greater、greater_equal、less、less_equal、equal、not_euqal:元素级比较运算,最终产生布尔型数组,相当于>、>=、<、<=、==、!=。

⑨ logical_and、logical_or、logical_xor:元素级真值运算,相当于&、|、^。2.2.3 常用函数库

1. 基本数组统计函数

常见的数组统计函数如表2-3所示。表2-3 NumPy库的数组统计函数

2. 利用numpy.random模块产生随机数

numpy.random模块提供了大量的随机数生成函数,示例和简单介绍如下。

① rand(3,2):产生0~1的均匀分布的样本,数组形状是(3,2)。

② randn(3,2):产生正态分布的随机数,数组形状是(3,2)。

③ normal(100,10,(3,2)):产生正态分布的随机数,期望是100,标准差是10,数组形状是(3,2)。

④ uniform(10,30,(3,2)):产生均匀分布的随机值,起始值是10,终值是30,数组形状是(3,2)。

⑤ poisson():产生λ系数为2.0的泊松分布随机数。

⑥ permutation(5):返回一个[0,5]的5个整数的随机排列。

⑦ permutation(a):返回数组a的随机排列。

⑧ randint(20,50,5):从[20,50]范围内随机产生5个整数。

3. 操作多维数组

NumPy库提供了多种操作多维数组的函数,如hstack、vstack、split、concatenate等。(1)沿轴0对数组进行堆叠np.concatenate(tup, axis=0),等价于vstack,示例如下:  a = np.array([1, 2, 3])  b = np.array([2, 3, 4])  c = np.vstack((a,b))  print ("1st example of vstack:\n", c)  d = np.array([[1], [2], [3]])  e = np.array([[2], [3], [4]])  f = np.vstack((d,e))

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载