提交 35e0e826 编写于 作者: W wizardforcel

2020-12-06 18:05:49

上级 e81e580d
......@@ -9,11 +9,11 @@
* 什么是人工智能,为什么我们需要学习它?
* 人工智能有哪些应用?
* 人工智能分支的分类
* 机器学习的五个部落
* 机器学习的五个流派
* 什么是图灵测试?
* 什么是理性代理?
* 什么是一般问题解决器?
* 如何建立智能代理
* 如何建立智能
* 如何安装 Python 3 和相关软件包
# 什么是 AI?
......@@ -104,19 +104,18 @@
* **启发式**:启发式是用于解决给定问题的技术,该技术在短期内解决该问题是实用且有用的,但不能保证是最优的。 这更像是对应该采用何种方法解决问题的有根据的猜测。 在 AI 中,我们经常遇到无法检查所有可能性以选择最佳选项的情况。 因此,我们需要使用启发式方法来实现目标。 它们在机器人,搜索引擎等领域的 AI 中得到了广泛使用。
* **遗传编程**:遗传编程是一种通过使程序配对并选择最适合的条件来获取程序来解决任务的方法。 程序被编码为一组基因,使用一种算法来获得可以很好地执行给定 任务的程序。
# 机器学习的五个部落
# 机器学习的五个流派
机器学习可以通过各种方式进一步分类。 我们最喜欢的分类之一是 Pedro Domingos 在他的书*主算法*中提供的分类。 在他的书中,他根据萌芽了思想的科学领域对机器学习进行了分类。 例如,遗传算法起源于生物学概念。 以下是完整的分类,Domingos 为部落使用的名称,每个部落使用的主要算法以及值得注意的支持者:
机器学习可以通过各种方式进一步分类。 我们最喜欢的分类之一是 Pedro Domingos 在他的书*主算法*中提供的分类。 在他的书中,他根据萌芽了思想的科学领域对机器学习进行了分类。 例如,遗传算法起源于生物学概念。 以下是完整的分类,Domingos 为流派使用的名称,每个流派使用的主要算法以及值得注意的支持者:
<colgroup><col> <col> <col> <col></colgroup>
| **部落** | **来源** | **主导算法** | **支持者** |
| 象征主义者 | 逻辑与哲学 | 反演 | 汤姆·米切尔史蒂夫·麦格尔顿罗斯·昆兰 |
| 联络员 | 神经科学 | 反向传播 | Yan LeCun 杰弗里·欣顿尤舒亚·本吉奥(Yoshua Bengio) |
| **流派** | **来源** | **主导算法** | **支持者** |
| 符号主义者 | 逻辑与哲学 | 反演 | 汤姆·米切尔史蒂夫·麦格尔顿罗斯·昆兰 |
| 连接论者 | 神经科学 | 反向传播 | Yan LeCun 杰弗里·欣顿尤舒亚·本吉奥(Yoshua Bengio) |
| 进化论者 | 生物学 | 基因编程 | 约翰·科扎约翰·霍兰德霍德·利普森 |
| 贝叶斯 | 统计 | 概率推断 | 大卫·赫克曼犹太珍珠迈克尔·乔丹 |
| 模拟器 | 心理学 | 内核机器 | 彼得·哈特弗拉基米尔·瓦普尼克道格拉斯·霍夫施塔特 |
**象征主义者**:象征主义者使用归纳或反演的概念作为主要工具。 当使用归纳法时,逆推演不是从前提和结论开始,而是从一系列前提和结论开始,然后反向进行以填补缺失的部分。
**符号主义者**:符号主义者使用归纳或反演的概念作为主要工具。 当使用归纳法时,逆推演不是从前提和结论开始,而是从一系列前提和结论开始,然后反向进行以填补缺失的部分。
推论的一个例子:
......@@ -126,19 +125,19 @@
苏格拉底是人类+ ?? =苏格拉底是凡人(人类是凡人?)
**连通论者**:连通论者使用大脑,或者至少是我们对大脑的粗略了解,作为主要工具-主要是神经网络。 神经网络是一种算法,可以在大脑之后粗略地建模,旨在识别模式。 他们可以识别向量中包含的数字模式。 为了使用它们,需要将所有输入(例如图像,声音,文本或时间序列)转换为这些数字矢量。 很难打开杂志或新闻网站,而不阅读“深度学习”示例。 深度学习是神经网络的一种特殊类型。
**连接论者**:连接论者使用大脑,或者至少是我们对大脑的粗略了解,作为主要工具-主要是神经网络。 神经网络是一种算法,可以在大脑之后粗略地建模,旨在识别模式。 他们可以识别向量中包含的数字模式。 为了使用它们,需要将所有输入(例如图像,声音,文本或时间序列)转换为这些数字矢量。 很难打开杂志或新闻网站,而不阅读“深度学习”示例。 深度学习是神经网络的一种特殊类型。
**进化论者**:进化论者专注于使用进化,自然选择,基因组和 DNA 突变的概念,并将其应用于数据处理。 进化算法将不断变异,进化并适应未知条件和过程。
**贝叶斯**:贝叶斯将集中在使用概率推断来处理不确定性上。 视觉学习和垃圾邮件过滤是贝叶斯方法解决的一些问题。 通常,贝叶斯模型将采用假设并应用一种“先验”推理,假设某些结果更有可能出现。 然后,他们在看到更多数据时会更新假设。
**模拟器**:模拟器着重于发现示例之间相似之处的技术。 最著名的模拟器模型是 *k 最近邻*算法。
**模拟器**:模拟器着重于发现示例之间相似之处的技术。 最著名的模拟器模型是 *K 最近邻*算法。
# 使用图灵测试定义情报
传说中的计算机科学家和数学家 *Alan Turing* 提出了 Turing 测试以提供智能的定义。 这是测试计算机是否可以学习模仿人类行为的测试。 他将聪明的行为定义为在对话中达到人类智能的能力。 这种表现应该足以诱使询问者认为答案来自人。
传说中的计算机科学家和数学家*阿兰·图灵*提出了图灵测试以提供智能的定义。 这是测试计算机是否可以学习模仿人类行为的测试。 他将聪明的行为定义为在对话中达到人类智能的能力。 这种表现应该足以诱使询问者认为答案来自人。
为了查看机器是否可以做到这一点,他提出了一个测试设置:他提议人类应该通过文本界面来询问机器。 另一个限制是,人不能知道谁在询问的另一端,这意味着它可以是机器,也可以是人。 为了启用此设置,人员将通过文本界面与两个实体进行交互。 这两个实体称为受访者。 其中一个将是人类,另一个将是 m 机器。
为了查看机器是否可以做到这一点,他提出了一个测试设置:他提议人类应该通过文本界面来询问机器。 另一个限制是,人不能知道谁在询问的另一端,这意味着它可以是机器,也可以是人。 为了启用此设置,人员将通过文本界面与两个实体进行交互。 这两个实体称为受访者。 其中一个将是人类,另一个将是机器。
如果询问机无法告诉答案是来自机器还是人,则应答机通过测试。 下图显示了图灵测试的设置:
......@@ -153,9 +152,9 @@
* **推理**:对于机器来说,了解如何解释所存储信息的很重要。 人们倾向于自动执行此操作,以便实时得出结论。
* **机器学习**:这是所必需的,以便机器可以实时适应新条件。 机器需要分析和检测模式,以便得出推断。
您一定想知道为什么人类要与文本界面进行通信。 根据 Turing 的说法,人的物理模拟对于智能是不必要的。 这就是图灵测试避免人与机器之间直接进行物理交互的原因。
您一定想知道为什么人类要与文本界面进行通信。 根据图灵的说法,人的物理模拟对于智能是不必要的。 这就是图灵测试避免人与机器之间直接进行物理交互的原因。
还有另一种叫做总图灵测试的东西,它涉及视觉和运动。 要通过此测试,机器需要使用计算机视觉并使用 ng 机器人在周围移动来查看物体。
还有另一种叫做总图灵测试的东西,它涉及视觉和运动。 要通过此测试,机器需要使用计算机视觉并使用机器人在周围移动来查看物体。
# 使机器像人一样思考
......@@ -171,7 +170,7 @@
在计算机科学内部,有一个名为**认知模型**的研究领域,该领域致力于模拟人类的思维过程。 它试图了解人类如何解决问题。 它需要进入解决问题过程的思维过程,并将其转变为软件模型。 然后可以使用此模型来模拟人类行为。
认知建模用于各种 AI 应用程序,例如深度学习,专家系统,自然语言处理,roboti cs 等。
认知建模用于各种 AI 应用程序,例如深度学习,专家系统,自然语言处理,机器人等。
# 建立理性代理
......@@ -195,7 +194,7 @@
# 通用问题解决器
**通用问题解决器****GPS**)是由 Herbert Simon,J.CShaw 和 Allen Newell 提出的 AI 程序。 它是 AI 世界中第一个有用的计算机程序。 目的是使其能够作为通用的问题解决机器。 当然,以前有很多软件程序,但是这些程序执行特定的任务。 GPS 是第一个旨在解决任何一般问题的程序。 GPS 应该针对每个问题使用相同的基本算法来解决所有问题。
**通用问题解决器****GPS**)是由 Herbert Simon,J.C. Shaw 和 Allen Newell 提出的 AI 程序。 它是 AI 世界中第一个有用的计算机程序。 目的是使其能够作为通用的问题解决机器。 当然,以前有很多软件程序,但是这些程序执行特定的任务。 GPS 是第一个旨在解决任何一般问题的程序。 GPS 应该针对每个问题使用相同的基本算法来解决所有问题。
您一定已经意识到,这是艰巨的战斗! 为了对 GPS 进行编程,作者创建了一种新语言,称为**信息处理语言****IPL**)。 基本前提是使用一组格式正确的公式来表达任何问题。 这些公式将成为有多个源和汇的有向图的一部分。 在图中,源是指起始节点,宿是指终止节点。 对于 GPS,源是公理,汇是结论。
......@@ -216,19 +215,19 @@
在本节中,我们了解了什么是理性主体。 现在,让我们学习如何使这些理性主体更加智能和有用。
# 建立智能代理
# 建立智能
有很多方法可以将智能传递给代理。 最常用的技术包括机器学习,存储的知识,规则等。 在本节中,我们将重点关注机器学习。 在这种方法中,我们通过 gh 数据和训练来向代理赋予情报。
有很多方法可以将智能传递给代理。 最常用的技术包括机器学习,存储的知识,规则等。 在本节中,我们将重点关注机器学习。 在这种方法中,我们通过数据和训练来向代理赋予情报。
让我们看看智能代理如何与环境交互:
让我们看看智能如何与环境交互:
![](img/B15441_01_08.png)
图 8:智能代理与其环境的交互
图 8:智能与其环境的交互
通过机器学习,有时我们希望对机器进行编程以使用标记的数据来解决给定的问题。 通过浏览数据和相关标签,机器学习了如何提取模式和关系。
在前面的示例中,智能代理依赖于学习模型来运行推理引擎。 传感器感知到输入后,会将其发送到特征提取模块。 一旦提取了相关特征,训练有素的推理引擎将基于学习模型执行预测。 该学习模型是使用机器学习构建的。 然后,推理引擎做出决定并将其发送给执行器,执行器随后在现实世界中采取所需的操作。
在前面的示例中,智能依赖于学习模型来运行推理引擎。 传感器感知到输入后,会将其发送到特征提取模块。 一旦提取了相关特征,训练有素的推理引擎将基于学习模型执行预测。 该学习模型是使用机器学习构建的。 然后,推理引擎做出决定并将其发送给执行器,执行器随后在现实世界中采取所需的操作。
今天存在许多机器学习的应用程序。 它用于图像识别,机器人技术,语音识别,预测股市行为等。 为了理解机器学习并构建完整的解决方案,您将必须熟悉来自不同领域的许多技术,例如模式识别,人工神经网络,数据挖掘, 统计等。 上。
......@@ -250,7 +249,7 @@ AI 世界中有两种类型的模型:分析模型和学习模型。 在我们
$ python3 --version
```
如果看到打印出类似 Python 3.x.x(其中 x.x 是版本号)的内容,那很好。 如果不是,则直接安装在 中。
如果看到打印出类似`Python 3.x.x`(其中`x.x`是版本号)的内容,那很好。 如果不是,则直接安装在 中。
## 在 Ubuntu 上安装
......@@ -288,7 +287,7 @@ $ brew update
$ brew install python3
```
像之前一样运行 check 命令:
像之前一样运行检查命令:
```py
$ python3 --version
......@@ -302,13 +301,13 @@ $ python3 --version
如果要检查 Python 3 的其他`SciPy-stack`兼容发行版,可以在[这个页面](http://www.scipy.org/install.html)中找到它们。 这些发行版的好处是它们附带了所有必需的软件包。 如果使用这些版本之一,则无需单独安装软件包。
安装后,请像前面的 id 一样运行 check 命令:
安装后,请像前面一样运行检查命令:
```py
$ python3 --version
```
您应该看到已输出的 ve 个版本号。
您应该看到已输出的版本号。
# 安装软件包
......@@ -365,13 +364,13 @@ $ python3
实际的数组较大,因此图像表示该数组中的前几个值。
scikit-learn 包中还有可用的图像数据集。 每个图像的形状均为 8×8。 让我们加载它:
scikit-learn 包中还有可用的图像数据集。 每个图像的形状均为`8×8`。 让我们加载它:
```py
>>> digits = datasets.load_digits()
```
打印礼物 h 图像:
打印数字图像:
```py
>>> print(digits.images[4])
......@@ -395,7 +394,7 @@ scikit-learn 包中还有可用的图像数据集。 每个图像的形状均为
* 如何使机器像人一样思考
* 理性主体的概念及其应如何设计
* 通用问题解决器(GPS)以及如何使用 GPS 解决问题
* 如何使用机器学习开发智能代理
* 如何使用机器学习开发智能
* 不同类型的机器学习模型
我们还介绍了如何在各种操作系统上安装 Python 3,以及如何安装构建 AI 应用程序所需的必要软件包。 我们讨论了如何使用这些包来加载 scikit-learn 中可用的数据。
......
此差异已折叠。
......@@ -21,7 +21,7 @@
存在许多机器学习解决方案来实现这些管道。 当然,仅使用 Python 或 R 语言就可以建立基本的机器学习管道。 我们将通过布局使用 Python 的管道示例来开始建立我们的理解。 在本章中,我们将详细探讨一些利用当今最流行工具的体系结构。 数据管道通常利用的一些工具是:
* Hadoop
* Hadoop
* 火花
* 火花流
* 卡夫卡
......@@ -103,7 +103,7 @@
* 应该将其存储为文件还是数据库中?
* 什么类型的数据库? 传统的 RDBMS,NoSQL,图。
* 它甚至应该存储吗? 如果我们有实时输入管道,甚至可能没有必要或没有效率地存储输入。
* 输入应采用什么格式? 实木复合地板,JSON,CSV。
* 输入应采用什么格式? HWF,JSON,CSV。
很多时候,我们甚至可能无法控制输入源来决定应采用的格式,我们应按原样进行处理,然后决定如何进行转换。 此外,我们可能没有唯一的数据源。 在我们可以将它们输入模型之前,可能需要合并,合并和合并多个源。
......@@ -134,7 +134,7 @@
| 贷款额度 | 在该时间点对该贷款的承诺总额。 | 孤立地没有价值。 需要相对。 |
| 查询数量 | 个人理财查询数量。 | 借款人寻找信用。 |
| 利率 | 贷款利率。 | 如果贷款的利率很高,则还款额将更多,并且可能难以偿还。 |
| 最大余额 | 所有循环帐户上的最大当前余额。 | 如果接近 100,则可能表明借款人有财务困难。 |
| 最大余额 | 所有循环帐户上的最大当前余额。 | 如果接近 100%,则可能表明借款人有财务困难。 |
| 自上次公开记录以来的月数 | 自上次公开记录以来的月数。 | 指示先前的财务困难 |
| 逾期帐户数 | 逾期 120 天或以上的帐户数 | 当前财务困难的指示 |
| 公开记录 | 贬损的公共记录数 | 指示先前的财务困难 |
......@@ -170,8 +170,8 @@
执行这些转换的最流行的工具之一是 Apache Spark,但它仍然需要数据存储。 对于持久性,最常见的解决方案是:
* Hadoop 分布式文件系统(HDFS)
* HBase
* 阿帕奇·卡桑德拉(Apache Cassandra)
* HBase
* Apache Cassandra
* 亚马逊 S3
* Azure Blob 存储
......@@ -189,7 +189,7 @@
## 缺少值
我们的数据经常包含缺失值,或者缺失值被零或 N / A 代替。 我们该如何处理这个问题? 以下是处理缺失值的六种不同方法:
我们的数据经常包含缺失值,或者缺失值被零或 N/A 代替。 我们该如何处理这个问题? 以下是处理缺失值的六种不同方法:
* **不执行任何操作**:有时最好的操作是不执行任何操作。 根据所使用的算法,并非总是需要对缺失值进行任何操作。 XGBoost 是可以优雅处理缺失值的算法示例。
* **使用中值进行插补**:当缺少值时,分配给丢失数据的合理值是该变量的所有其余非缺失值的中值。 此替代方案易于计算,并且快速,并且适用于小型数据集。 但是,它没有提供太多的准确性,也没有考虑与其他变量的相关性。
......@@ -205,7 +205,7 @@
## 功能缩放
数据集通常包含大小不等的特征。 要素大小的这种变化通常会对预测的准确性产生不利影响(但并非总是如此;例如,Random Forest 不需要要素缩放)。 许多机器学习算法使用数据点之间的欧几里得距离进行计算。 如果不进行此调整,则数量级高的要素将对结果产生过重的影响。
数据集通常包含大小不等的特征。 要素大小的这种变化通常会对预测的准确性产生不利影响(但并非总是如此;例如,随机森林不需要要素缩放)。 许多机器学习算法使用数据点之间的欧几里得距离进行计算。 如果不进行此调整,则数量级高的要素将对结果产生过重的影响。
用于特征缩放的最常用的方法是:
......@@ -227,7 +227,7 @@
解决此问题的两种方法是基于规则的和基于示例的。 当数据中的可变性较小且不会快速更改时,基于规则的系统会更好地工作。 当我们拥有快速移动的数据时,基于规则的方法就会中断。
考虑一个垃圾邮件过滤器。 我们可以创建一个规则,将带有“ Viagra”一词的任何内容标记为垃圾邮件,但是垃圾邮件发送者可能会变得很聪明,并开始更改数据以绕过该规则(“ Vi @ gra”)。 在这种情况下,基于机器学习示例的清洁器会更好地工作。
考虑一个垃圾邮件过滤器。 我们可以创建一个规则,将带有`Viagra`一词的任何内容标记为垃圾邮件,但是垃圾邮件发送者可能会变得很聪明,并开始更改数据以绕过该规则(`Vi@gra`)。 在这种情况下,基于机器学习示例的清洁器会更好地工作。
有时,我们可能想考虑混合方法并同时使用这两种方法。 例如,一个人的身高应始终为正值。 因此,我们可以为此编写一条规则。 对于具有更多可变性的其他值,我们可以使用机器学习方法。
......@@ -237,7 +237,7 @@
* 11/01/2016
* 11/1/16
* 16 年 11 月 1 日
* 2016 年 11 月 1 日 <sup>st</sup>
* 2016 年 11 月 1 日
这些都是相同的值。 因此,我们需要标准化日期。
......@@ -321,7 +321,7 @@
* **CPU 利用率**:识别峰值以及是否可以解释峰值。
* **内存使用情况**:正在消耗多少内存。
* **磁盘使用率**:我们的应用程序消耗了多少磁盘空间。
* **网络 I / O 流量**:如果我们的应用程序跨越实例,则衡量网络流量非常重要。
* **网络 I/O 流量**:如果我们的应用程序跨越实例,则衡量网络流量非常重要。
* **延迟**:发生数据传输所花费的时间。
* **吞吐量**:成功传输的数据量。
......
......@@ -109,7 +109,7 @@ plt.show()
可以使用统计测试来确定哪些特征与输出变量具有最强的相关性。 scikit-learn 库具有一个名为`SelectKBest`的类,该类提供一组统计测试以选择数据集中的`K`“最佳”特征。
以下是一个示例,该示例对非负特征使用*卡方(chi* ²*)统计检验,以选择输入数据集中的五个最佳特征:*
以下是一个示例,该示例对非负特征使用卡方(chi²)统计检验,以选择输入数据集中的五个最佳特征:
```py
import pandas as pd
......@@ -144,10 +144,10 @@ print(scores.nlargest(5,'score')) #print the 5 best features
相关可以是正的(特征的一个值的增加会增加目标变量的值)或负的(特征的一个值的增加会降低目标变量的值)。
关联是-1 和 1 之间的连续值。
关联是 -1 和 1 之间的连续值。
* 如果两个变量之间的相关性为 1,则存在完美的直接相关性。
* 如果两个特征之间的相关性为-1,则存在理想的逆相关性。
* 如果两个特征之间的相关性为 -1,则存在理想的逆相关性。
* 如果两个要素之间的相关性为 0,则两个要素之间没有相关性。
热图可轻松识别与目标变量最相关的功能。 我们将使用`seaborn`库并使用以下代码来绘制相关要素的热图:
......@@ -196,7 +196,7 @@ g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
指定度量,并基于该度量特征过滤。 基于过滤器的方法的示例包括:
* **皮尔逊相关**:此算法用作量化两个连续变量`X``Y`之间的线性相关性的量度。 它的值可以介于-1 到+1 之间。
* **皮尔逊相关**:此算法用作量化两个连续变量`X``Y`之间的线性相关性的量度。 它的值可以介于 -1 到 +1 之间。
* **线性判别分析(LDA)**:LDA 可用于查找特征的线性组合,这些特征描述或分隔了分类变量的两个或更多个级别(或类)。
* **方差分析(ANOVA)**:ANOVA 类似于 LDA,不同之处在于它是使用一个或多个分类自变量和一个连续因变量计算的。 它提供了统计检验,以了解几组的平均值是否相等。
* **卡方**:卡方是一种统计测试,应用于类别变量组,以使用它们的频率分布确定它们之间相关或关联的可能性。
......@@ -205,7 +205,7 @@ g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
### 嵌入式方法
嵌入式方法使用具有内置特征选择方法的算法。 嵌入式方法结合了 filter 和 wrapper 方法的优点。 通常使用带有内置特征选择方法的算法来实现它们。
嵌入式方法使用具有内置特征选择方法的算法。 嵌入式方法结合了过滤器和包装器方法的优点。 通常使用带有内置特征选择方法的算法来实现它们。
两种流行的嵌入式方法实现如下:
......@@ -222,7 +222,7 @@ g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
# 功能工程
根据最近在《福布斯》杂志上进行的调查,数据科学家将其 80的时间用于数据准备:
根据最近在《福布斯》杂志上进行的调查,数据科学家将其 80% 的时间用于数据准备:
![](img/B15441_04_04.png)
......@@ -250,7 +250,7 @@ g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
2. 确定哪些功能可以改善模型性能
3. 创建新功能
4. 确定新功能是否会增加模型性能; 如果没有,放下它们
5. 返回*步骤 1* ,直到模型的性能达到预期
5. 返回“步骤 1”,直到模型的性能达到预期
正如我们在示例中看到的那样,拥有域知识并熟悉数据集对于特征工程很有用。 但是,也有一些通用的数据科学技术可应用于数据准备和功能工程步骤中,而不管其域是什么。 让我们花一些时间分析这些技术。
......@@ -275,7 +275,7 @@ g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
**删除缺少值的行**:此技术会降低模型的性能,因为它减少了模型必须训练的数据点的数量。
让我们看一个示例,该示例删除缺少 60以上数据的列:
让我们看一个示例,该示例删除缺少 60% 以上数据的列:
```py
threshold = 0.6
......@@ -402,7 +402,7 @@ print(data)
检测和消除异常值的另一种方法是使用百分位。 使用这种方法,我们仅假设要素值的一定百分比是离群值。 下降多少百分比值仍然是主观的,并且将取决于领域。
让我们看一个 Python 示例,在其中将最高和最低 1的部分删除:
让我们看一个 Python 示例,在其中将最高和最低 1% 的部分删除:
```py
#Dropping the outlier rows with Percentiles
......@@ -506,13 +506,13 @@ print(data)
![](img/B15441_04_12.png)
图 12:一个热编码输出
图 12:热编码输出
# 对数变换
对数转换(或对数转换)是常见的特征工程转换。 对数转换有助于展平高度偏斜的值。 应用日志转换后,数据分布将被标准化。
对数转换(或对数转换)是常见的特征工程转换。 对数转换有助于展平高度偏斜的值。 应用对数转换后,数据分布将被标准化。
让我们再看一个例子,再次获得一些直觉。 请记住,当您 10 岁时,看着 15 岁的男孩和女孩时,他们在想:“他们比我大得多!” 现在想想一个 50 岁的人和另一个 55 岁的人。 在这种情况下,您可能会认为年龄差异并不大。 在这两种情况下,年龄差异均为 5 岁。 但是,在第一种情况下,15 岁的年龄比 10 岁的年龄大 50%,在第二种情况下,55 岁的年龄比 50 岁的年龄大 10%
让我们再看一个例子,再次获得一些直觉。 请记住,当您 10 岁时,看着 15 岁的男孩和女孩时,他们在想:“他们比我大得多!” 现在想想一个 50 岁的人和另一个 55 岁的人。 在这种情况下,您可能会认为年龄差异并不大。 在这两种情况下,年龄差异均为 5 岁。 但是,在第一种情况下,15 岁的年龄比 10 岁的年龄大 50%,在第二种情况下,55 岁的年龄比 50 岁的年龄大 10%
如果我们对所有这些数据点应用对数变换,则将这样的幅度差异归一化。
......@@ -520,9 +520,9 @@ print(data)
使用此技术时要考虑的一个关键限制是,仅当所有数据点均为正值时才应应用对数转换。 另外,您可以在应用转换之前将 1 加到数据中。 因此,您确保转换的输出为正:
*日志(x + 1)*
`log(x + 1)`
这是在 Python 中执行日志转换的方法:
这是在 Python 中执行对数转换的方法:
```py
#Log Transform Example
......@@ -547,7 +547,7 @@ print(data)
在许多情况下,数据集中的数字特征在规模上会与其他特征有很大差异。 例如,房屋的典型平方英尺数可能是 1000 到 3000 平方英尺之间的数字,而房屋中卧室数量的 2、3 或 4 可能是更典型的数字。 如果我们不理会这些值,则如果不放下比例较高的要素,则可能会赋予较高的权重。 如何解决此问题?
缩放可以解决此问题。 应用缩放后,连续特征在范围上变得可比。 并非所有算法都需要标定值(Random Forest 浮现在脑海),但是如果未事先对数据集进行标定,则其他算法将产生无意义的结果(例如 k 近邻或 k 均值)。 现在,我们将探讨两种最常见的缩放方法。
缩放可以解决此问题。 应用缩放后,连续特征在范围上变得可比。 并非所有算法都需要标定值(随机森林浮现在脑海),但是如果未事先对数据集进行标定,则其他算法将产生无意义的结果(例如 K 近邻或 K 均值)。 现在,我们将探讨两种最常见的缩放方法。
**归一化**(或 minmax 归一化)将的所有值缩放到介于 0 到 1 之间的固定范围内。更正式的说,可以使用以下公式对特征的每个值进行归一化:
......@@ -606,14 +606,14 @@ print(data)
# 日期操作
对于某些数据科学问题,时间特征可能至关重要。 在时间序列分析中,日期显然至关重要。 如果您没有在预测中附加日期,则预测 S & P 500 将达到 3,000 将毫无意义。
对于某些数据科学问题,时间特征可能至关重要。 在时间序列分析中,日期显然至关重要。 如果您没有在预测中附加日期,则预测 S&P 500 将达到 3,000 将毫无意义。
没有进行任何处理的日期可能对大多数模型没有多大意义,并且这些值将太独特而无法提供任何预测能力。 为什么 10/21/2019 与 10/19/2019 不同? 如果我们使用某些领域知识,则可能能够极大地增加功能的信息价值。 例如,将日期转换为分类变量可能会有所帮助。 如果目标功能是您试图确定何时支付租金,则将日期转换为二进制值,其中可能的值为:
* 该月的第 5 个<sup></sup> = 1
* 当月的第 5 个<sup>后的</sup> = 0
* 该月的前 5 天`= 1`
* 当月的前 5 天之后`= 0`
如果要求您预测餐厅的人流和销售情况,那么看每个月的 21 <sup>st</sup> 可能没有任何流量模式,但是可以想象,如果 日期是星期日与星期二,或者月是 10 月与 12 月(例如圣诞节)。 如果这是一家国际连锁餐厅,那么餐厅位置和月份可能就非常重要(美国的圣诞节与印度的排灯节)。
如果要求您预测餐厅的人流和销售情况,那么看每个月的 21 可能没有任何流量模式,但是可以想象,如果 日期是星期日与星期二,或者月是 10 月与 12 月(例如圣诞节)。 如果这是一家国际连锁餐厅,那么餐厅位置和月份可能就非常重要(美国的圣诞节与印度的排灯节)。
可以操纵日期的其他可能方式包括:
......
......@@ -16,7 +16,7 @@
* 单变量和多变量线性回归
* 使用支持向量回归机估算房价
# S 优于无监督学习
# 无监督学习的优势
从流行的新闻界看到并不难,当今人工智能领域最热门的领域之一就是机器学习。 机器学习通常分为有监督的学习和无监督的学习。 还存在其他分类,但我们将在后面讨论。
......@@ -36,7 +36,7 @@
**无监督学习**是指指的是不依赖标记的训练数据来构建机器学习模型的过程。 从某种意义上说,这与监督学习相反。 由于没有可用的标签,因此您仅需要根据提供给您的数据来提取见解。 通过无监督学习,我们正在训练一个系统,其中单独的数据点可能会分成多个群集或组。 需要重点强调的一点是,我们并不确切地知道分离的标准是什么。 因此,无监督学习算法需要以可能的最佳方式将给定的数据集分为几组。
现在,我们已经描述了机器学习方法的主要分类方法之一,让我们开始研究如何分类 d ata
现在,我们已经描述了机器学习方法的主要分类方法之一,让我们开始研究如何分类数据
# 什么是分类?
......@@ -44,7 +44,7 @@
在机器学习中,分类用于标识新数据点所属的类别。 基于包含数据点和相应标签的训练数据集建立分类模型。 例如,假设我们要确定给定的图像是否包含一个人的脸。 我们将构建一个训练数据集,其中包含与两个类别相对应的类别:面部和无面部。 然后将基于可用的训练样本来训练模型。 然后可以将训练后的模型用于推理。
良好的分类系统使查找和检索数据变得容易。 分类广泛用于面部识别,垃圾邮件识别,推荐引擎等。 好的数据分类算法将自动生成正确的标准,以将给定的数据分为给定数量的 cla sses
良好的分类系统使查找和检索数据变得容易。 分类广泛用于面部识别,垃圾邮件识别,推荐引擎等。 好的数据分类算法将自动生成正确的标准,以将给定的数据分为给定数量的类别
为了进行分类以产生不错的结果,将需要足够数量的样本,以便可以概括这些标准。 如果样本数量不足,该算法将过度适合训练数据。 这意味着它将无法很好地处理未知数据,因为它对模型进行了微调,无法适应训练数据中观察到的模式。 这实际上是机器学习领域中常见的问题。 在构建各种机器学习机器时,考虑这个因素是一个好主意。
......@@ -73,7 +73,7 @@ input_data = np.array([[5.1, -2.9, 3.3],
* 二值化
* 均值去除
* 缩放比例
* 规范 l
* 规范化
## 二值化
......@@ -132,7 +132,7 @@ Mean = [ 1.11022302e-16 0.00000000e+00 2.77555756e-17]
Std deviation = [ 1\. 1\. 1.]
```
从获得的值可以看出,平均值非常接近`0`,标准 de 的标准`1`
从获得的值可以看出,平均值非常接近`0`,标准`1`
## 缩放
......@@ -142,7 +142,7 @@ Std deviation = [ 1\. 1\. 1.]
![](img/B15441_05_001.png)
其中 *max(x)*是变量的最大值, *min(x)*是最小值,并且`x`<sub style="font-style: italic;">i</sub> 分别 个人价值。
其中`max(x)`是变量的最大值,`min(x)`是最小值,并且`x[i]`分别是个体的值。
在我们的特征向量中,每个特征的值可以在许多随机值之间变化。 因此,对这些功能进行缩放以具有一个公平的竞争环境以训练机器学习算法就变得很重要。 仅仅由于测量的性质,任何功能都不能人为地变大或变小。
......@@ -177,7 +177,7 @@ Min max scaled data:
图 1:标准化前后
我们使用规范化过程来修改特征向量中的值,以便可以在一个通用尺度上对其进行测量。 在机器学习中,我们使用许多不同形式的规范化。 某些最常见的规范化形式旨在修改值,使它们的总和为 1。 ],确保每行的绝对值之和为`1`**L2 归一化**是指最小二乘,它通过确保平方和为`1`来工作。
我们使用规范化过程来修改特征向量中的值,以便可以在一个通用尺度上对其进行测量。 在机器学习中,我们使用许多不同形式的规范化。 某些最常见的规范化形式旨在修改值,使它们的总和为 1。 确保每行的绝对值之和为`1`**L2 归一化**是指最小二乘,它通过确保平方和为`1`来工作。
通常,L1 归一化技术被认为比 L2 归一化技术更健壮。 L1 归一化技术很强大,因为它可以抵抗数据中的异常值。 很多时候,数据倾向于包含离群值,而我们对此无能为力。 我们希望使用可以在计算过程中安全有效地忽略它们的技术。 如果我们要解决离群值很重要的问题,那么 L2 规范化可能会成为更好的选择。
......@@ -273,9 +273,9 @@ print("Decoded labels =", list(decoded_list))
您可以检查映射以查看编码和解码步骤是否正确。 该部分的代码在 `label_encoder.py`文件中给出。
# Logistic 回归分类器
# 逻辑回归分类器
Logistic 回归是的一种技术,用于解释输入变量和输出变量之间的关系。 回归可用于对连续值进行预测,但是对于离散预测,例如结果为*真**假**红色[**绿色**黄色*作为另一个示例。
逻辑回归是的一种技术,用于解释输入变量和输出变量之间的关系。 回归可用于对连续值进行预测,但是对于离散预测,例如结果为*真**假**红色[**绿色**黄色*作为另一个示例。
假定输入变量是独立的,输出变量称为因变量。 因变量只能采用一组固定的值。 这些值对应于分类问题的类别。
......@@ -285,7 +285,7 @@ Logistic 回归是的一种技术,用于解释输入变量和输出变量之
* 它的派生更容易计算
* 将非线性引入模型的简单方法
它与广义线性模型分析密切相关,在广义线性模型分析中,我们尝试将一条线拟合到一堆点以最小化误差。 代替线性回归,我们使用逻辑回归。 Logistic 回归本身不是分类技术,但是以这种方式使用来促进分类。 由于其简单性,它通常在机器学习中使用。 让我们看看如何使用逻辑回归构建分类器。 在继续操作之前,请确保已安装软件包。 如果不是,[则可以在这里找到](https://docs.python.org/2/library/tkinter.html)
它与广义线性模型分析密切相关,在广义线性模型分析中,我们尝试将一条线拟合到一堆点以最小化误差。 代替线性回归,我们使用逻辑回归。 逻辑回归本身不是分类技术,但是以这种方式使用来促进分类。 由于其简单性,它通常在机器学习中使用。 让我们看看如何使用逻辑回归构建分类器。 在继续操作之前,请确保已安装软件包。 如果不是,[则可以在这里找到](https://docs.python.org/2/library/tkinter.html)
创建一个新的 Python 文件并导入以下软件包:
......@@ -419,7 +419,7 @@ classifier = linear_model.LogisticRegression(solver='liblinear', C=100)
**朴素贝叶斯**是一种用于使用贝叶斯定理建立分类器的技术。 贝叶斯定理描述了基于与该事件相关的不同条件发生事件的概率。 通过为问题实例分配类标签,我们构建了朴素的贝叶斯分类器。 这些问题实例被表示为特征值的向量。 这里的假设是任何给定特征的值都独立于任何其他特征的值。 这称为独立性假设,它是朴素贝叶斯分类器的朴素部分。
给定 class 变量,我们可以仅查看给定功能如何影响它,而不管其对其他功能的影响。 例如,如果发现动物,有四条腿,有一条尾巴并且以大约 70 MPH 的速度奔跑,则可以将其视为猎豹。 朴素的贝叶斯分类器认为这些特征中的每一个都对结果有独立的贡献。 结果是指该动物是猎豹的可能性。 我们并不关心皮肤图案,腿数,尾巴的存在和运动速度之间可能存在的相关性。 让我们看看如何构建朴素贝叶斯分类器。
给定类别变量,我们可以仅查看给定功能如何影响它,而不管其对其他功能的影响。 例如,如果发现动物,有四条腿,有一条尾巴并且以大约 70 MPH 的速度奔跑,则可以将其视为猎豹。 朴素的贝叶斯分类器认为这些特征中的每一个都对结果有独立的贡献。 结果是指该动物是猎豹的可能性。 我们并不关心皮肤图案,腿数,尾巴的存在和运动速度之间可能存在的相关性。 让我们看看如何构建朴素贝叶斯分类器。
创建一个新的 Python 文件并导入以下软件包:
......@@ -487,7 +487,7 @@ visualize_classifier(classifier, X, y)
先前用于的计算分类器准确性的方法并不可靠。 我们需要执行交叉验证,以便在测试数据时不会使用相同的训练数据。
将数据分为训练和测试子集。 如以下行中的`test_size`参数所指定,我们将分配 80%用于训练,其余 20%用于测试。 然后,我们将在此数据上训练朴素贝叶斯分类器:
将数据分为训练和测试子集。 如以下行中的`test_size`参数所指定,我们将分配 80% 用于训练,其余 20% 用于测试。 然后,我们将在此数据上训练朴素贝叶斯分类器:
```py
# Split data into training and test data
......@@ -569,7 +569,7 @@ F1: 99.75%
在构建此表的过程中,我们遇到了一些关键指标,这些指标在机器学习领域很重要。 让我们考虑一个二进制分类的情况,其中输出为`0``1`
* **真实阳性**:这些是我们预测`1`作为输出的样本,而真实情况也是`1`
* **真底片**:这些是我们为其预测了`0`作为输出的样本,并且地面真实情况也是`0`
* **真底片**:这些是我们为其预测了`0`作为输出的样本,并且真实情况也是`0`
* **假阳性**:这些是我们预测将其作为输出的`1`但实际情况为`0`的样本。 这也称为 *I 型错误*
* **假阴性**:这些是我们预测其输出为`0`但实际情况为`1`的样本。 这也称为 *II 型错误*
......@@ -584,7 +584,7 @@ from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
```
Defi 为地面真实情况和预测的输出提供了一些样本标签:
为真实情况和预测的输出提供了一些定义的样本标签:
```py
# Define sample labels
......@@ -629,7 +629,7 @@ targets = ['Class-0', 'Class-1', 'Class-2', 'Class-3', 'Class-4'] print('\n', cl
图 7:分类报告中每个班级的表现
Whit e 表示较高的值,而黑色表示较低的值,如在图像右侧的颜色图键上所示。 在理想情况下,对角正方形将全为白色,其他所有区域均为黑色。 这表示 100%的准确性。
白色表示较高的值,而黑色表示较低的值,如在图像右侧的颜色图键上所示。 在理想情况下,对角正方形将全为白色,其他所有区域均为黑色。 这表示 100% 的准确性。
输出应为如下:
......@@ -637,17 +637,17 @@ Whit e 表示较高的值,而黑色表示较低的值,如在图像右侧的
图 8:分类报告中的值
可以看出,平均`precision`为 85%,平均`recall`为 73%。 而`f1-score`为 75%。 根据我们正在使用的域,这些结果可能是好结果,也可能是不好的结果。 如果所讨论的领域是试图确定患者是否患有癌症,而我们的准确率只能达到 85%,那么将有 15%的人口被错误分类,并且会非常不满意。 如果我们正在分析的领域是某人是否打算购买产品并且我们的精度结果相同,则可以认为这是本垒打,可以大大减少我们的营销费用。
可以看出,平均`precision`为 85%,平均`recall`为 73%。 而`f1-score`为 75%。 根据我们正在使用的域,这些结果可能是好结果,也可能是不好的结果。 如果所讨论的领域是试图确定患者是否患有癌症,而我们的准确率只能达到 85%,那么将有 15% 的人口被错误分类,并且会非常不满意。 如果我们正在分析的领域是某人是否打算购买产品并且我们的精度结果相同,则可以认为这是本垒打,可以大大减少我们的营销费用。
该部分的代码在文件`confusion_matrix.py`中给出。
# 支持 ort 矢量机
# 支持量机
**支持向量机****SVM**)是分类器,使用类别之间的分隔超平面进行定义。 此**超平面**是直线的 N 维版本。 给定带标签的训练数据和二进制分类问题,SVM 会找到将训练数据分为两类的最佳超平面。 这很容易扩展到`N`类的问题。
让我们考虑具有两类点的二维情况。 考虑到它是 2D,我们只必须处理 2D 平面上的点和线。 这比在高维空间中的矢量和超平面更容易可视化。 当然,这是 SVM 问题的简化版本,但是在将其应用于高维数据之前,了解它并对其进行可视化非常重要。
Co 位于下图:
考虑下图:
![](img/B15441_05_09.png)
......@@ -655,9 +655,9 @@ Co 位于下图:
点分为两类,我们想找到最佳的超平面来将这两个类分开。 但是我们如何定义最优? 在此图片中,实线代表最佳超平面。 您可以绘制许多不同的线以将两类点分开,但这条线是最好的分隔符,因为它可以使每个点到分隔线的距离最大化。 虚线上的点称为支持向量。 两条虚线之间的垂直距离称为最大边距。 您可以将最大边距视为可以为给定数据集绘制的最​​粗边框。
# Cl 使用支持向量机将收入数据分类
# 使用支持向量机将收入数据分类
我们将构建一个支持向量机分类器,根据 14 个属性预测给定人员的收入等级。 我们的目标是查看年收入是高于还是低于$ 50,000。 因此,这是一个二进制分类问题。 我们将使用[这个页面](https://archive.ics.uci.edu/ml/datasets/Census+Income)上提供的普查收入数据集。 此数据集中需要注意的一项是,每个数据点都是单词和数字的混合体。 我们不能使用原始格式的数据,因为算法不知道如何处理单词。 我们无法使用标签编码器来转换所有内容,因为数字数据很有价值。 因此,我们需要结合使用标签编码器和原始数值数据来构建有效的分类器。
我们将构建一个支持向量机分类器,根据 14 个属性预测给定人员的收入等级。 我们的目标是查看年收入是高于还是低于 50,000 美元。 因此,这是一个二进制分类问题。 我们将使用[这个页面](https://archive.ics.uci.edu/ml/datasets/Census+Income)上提供的普查收入数据集。 此数据集中需要注意的一项是,每个数据点都是单词和数字的混合体。 我们不能使用原始格式的数据,因为算法不知道如何处理单词。 我们无法使用标签编码器来转换所有内容,因为数字数据很有价值。 因此,我们需要结合使用标签编码器和原始数值数据来构建有效的分类器。
创建一个新的 Python 文件并导入以下软件包:
......@@ -757,7 +757,7 @@ classifier = OneVsOneClassifier(LinearSVC(random_state=0)) classifier.fit(X_trai
y_test_pred = classifier.predict(X_test)
```
计算分类器的 F1 分数
计算分类器的 F1 得分
```py
# Compute the F1 score of the SVM classifier
......@@ -1058,7 +1058,7 @@ datapoint = [[7.75, 6.35, 5.56]]
poly_datapoint = polynomial.fit_transform(datapoint)
```
如果仔细观察,该数据点非常接近我们数据文件中第 11 行的数据点,即 *[7.66,6.29,5.66]* 。 因此,一个好的回归器应该预测接近 *41.35* 的输出。 创建一个线性回归对象并执行多项式拟合。 使用线性和多项式回归器执行预测以查看差异:
如果仔细观察,该数据点非常接近我们数据文件中第 11 行的数据点,即`[7.66, 6.29, 5.66]`。 因此,一个好的回归器应该预测接近`41.35`的输出。 创建一个线性回归对象并执行多项式拟合。 使用线性和多项式回归器执行预测以查看差异:
```py
poly_linear_model = linear_model.LinearRegression()
......@@ -1128,7 +1128,7 @@ X_train, y_train = X[:num_training], y[:num_training]
X_test, y_test = X[num_training:], y[num_training:]
```
使用线性核创建并训练支持向量回归器。 `C`参数代表训练错误的代价。 如果增加`C`的值,则模型将对其进行微调以适合训练数据。 但这可能会导致过度拟合并使其失去通用性。 epsilon 参数指定阈值; 如果预测值在与实际值的距离之内,则不会对训练错误造成任何损失:
使用线性核创建并训练支持向量回归器。 `C`参数代表训练错误的代价。 如果增加`C`的值,则模型将对其进行微调以适合训练数据。 但这可能会导致过度拟合并使其失去通用性。 `epsilon`参数指定阈值; 如果预测值在与实际值的距离之内,则不会对训练错误造成任何损失:
```py
# Create Support Vector Regression model
......@@ -1170,7 +1170,7 @@ Explained variance score = 0.82
Predicted price: 18.5217801073
```
该部分的代码在文件`house_prices.py`中给出。 查看文件的第一行,查看`18.52`的预测与实际 t arget 变量的接近程度。
该部分的代码在文件`house_prices.py`中给出。 查看文件的第一行,查看`18.52`的预测与实际目标变量的接近程度。
# 摘要
......
......@@ -135,7 +135,7 @@ plt.show()
图 3:训练数据集上的分类器性能
分类器的性能以`precision``recall``f1-scores`为特征。 精度是指分类的准确性,召回率是指检索到的项目数占应检索的项目总数的百分比。 好的分类器将具有较高的精度和较高的查全率,但是通常在这两者之间需要权衡。 因此,我们有`f1-score`来表征。 F1 分数是精度和查全率的谐波平均值,使 F1 分数在精度和查全率之间取得了很好的平衡。
分类器的性能以`precision``recall``f1-scores`为特征。 精度是指分类的准确性,召回率是指检索到的项目数占应检索的项目总数的百分比。 好的分类器将具有较高的精度和较高的查全率,但是通常在这两者之间需要权衡。 因此,我们有`f1-score`来表征。 F1 得分是精度和查全率的谐波平均值,使 F1 得分在精度和查全率之间取得了很好的平衡。
决策树是使用单个模型进行预测的示例。 通过组合和汇总多个模型的结果,有时可以创建更强大的模型和更好的预测。 一种方法是使用集成学习,这将在下一节中讨论。
......
......@@ -19,9 +19,9 @@
# 启发式搜索是人工智能吗?
在第 2 章,“人工智能的基本用例”中,我们了解了 Pedro Domingos 定义的五个部落。 *象征主义者*部落是最“古老”的部落之一。 至少对我来说,这一事实不足为奇。 作为人类,我们尝试在所有事物中找到规则和模式。 不幸的是,世界有时是混乱的,并非所有事物都遵循简单的规则。
在第 2 章,“人工智能的基本用例”中,我们了解了 Pedro Domingos 定义的五个流派。 *符号主义者*流派是最“古老”的流派之一。 至少对我来说,这一事实不足为奇。 作为人类,我们尝试在所有事物中找到规则和模式。 不幸的是,世界有时是混乱的,并非所有事物都遵循简单的规则。
这就是为什么当我们没有秩序的世界时,其他部落出现来帮助我们的原因。 但是,当我们的搜索空间较小且域受到限制时,使用启发式,约束满足以及本章中介绍的其他技术对于这组问题很有用。 当组合的数量相对较少且组合爆炸受到限制时,这些技术很有用。 例如,当城市数量大约为 20 时,使用这些技术解决旅行商问题很简单。如果我们尝试对`n`= 2000 求解相同的问题,则必须使用其他方法来解决。 不要探索整个空间,而只能给出结果的近似值。
这就是为什么当我们没有秩序的世界时,其他流派出现来帮助我们的原因。 但是,当我们的搜索空间较小且域受到限制时,使用启发式,约束满足以及本章中介绍的其他技术对于这组问题很有用。 当组合的数量相对较少且组合爆炸受到限制时,这些技术很有用。 例如,当城市数量大约为 20 时,使用这些技术解决旅行商问题很简单。如果我们尝试对`n`= 2000 求解相同的问题,则必须使用其他方法来解决。 不要探索整个空间,而只能给出结果的近似值。
# 什么是启发式搜索?
......
......@@ -13,9 +13,9 @@
* 解决符号回归问题
* 构建智能机器人控制器
# 进化论者部落
# 进化论者流派
正如我们在书的开头提到的那样,研究遗传算法和遗传编程的计算机科学和数据科学研究人员是 Pedro Domingos 定义的进化论部落的一部分。 在某些方面,这个部落不在前面和中间。 联络员在阳光下度过一天,似乎在聚光灯下度过了愉快的时光。 正如 Domingos 博士所强调的那样,随着 CPU 的速度越来越快,并且在这一领域进行了更多的研究,如果在未来几年中出现新的,令人兴奋的前沿研究,不要感到惊讶。 他们已经在该领域做出了许多强大的创新性贡献,并将继续这样做。
正如我们在书的开头提到的那样,研究遗传算法和遗传编程的计算机科学和数据科学研究人员是 Pedro Domingos 定义的进化论流派的一部分。 在某些方面,这个流派不在前面和中间。 连接论者在阳光下度过一天,似乎在聚光灯下度过了愉快的时光。 正如 Domingos 博士所强调的那样,随着 CPU 的速度越来越快,并且在这一领域进行了更多的研究,如果在未来几年中出现新的,令人兴奋的前沿研究,不要感到惊讶。 他们已经在该领域做出了许多强大的创新性贡献,并将继续这样做。
# 了解进化和遗传算法
......@@ -25,11 +25,11 @@
进化算法的基本步骤如下:
**步骤 1**
*“步骤 1”*
随机生成数据点或*个人*的初始种群。 由 GA 定义的个体是具有某些*特征**特征*的人群的成员。 在算法的后续步骤中,我们将确定这些特征是否使个体能够适应环境并生存足够长的时间以产生后代。
**步骤 2**
*“步骤 2”*
循环执行以下步骤,直到终止:
......@@ -1102,11 +1102,11 @@ if __name__ == "__main__":
# 遗传编程用例
正如早期章节之一所讨论的那样,遗传算法(GA)和遗传编程(GP)是机器学习的“五个部落”之一。
正如早期章节之一所讨论的那样,遗传算法(GA)和遗传编程(GP)是机器学习的“五个流派”之一。
![](img/B15441_11_14.png)
图 14:五个部落(佩德罗·多明戈斯)
图 14:五个流派(佩德罗·多明戈斯)
从一开始,GP 就取得了各种各样的进步。 涵盖 GP 数千种应用程序的文献包含许多成功应用 GP 的用例。 详尽地涵盖该列表将超出本书的范围,但是我们在此处列出了一些更重要的列表。
......@@ -1207,7 +1207,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
# 摘要
在本章中,我们了解了 GA 及其基本概念。 我们讨论了进化算法和遗传规划。 我们了解了它们与 GA 之间的关系。 我们讨论了 GA 的基本构建模块,包括种群,交叉,突变,选择和适应度功能的概念。 我们学习了如何使用预定义的参数生成位模式。 我们讨论了如何使用 CMA-ES 可视化演变过程。 我们学习了如何在此范例中解决符号回归问题。 然后,我们使用这些概念来构建机器人控制器,以遍历地图并消耗所有目标。 在下一章中,我们将学习强化学习,并了解如何构建智能代理
在本章中,我们了解了 GA 及其基本概念。 我们讨论了进化算法和遗传规划。 我们了解了它们与 GA 之间的关系。 我们讨论了 GA 的基本构建模块,包括种群,交叉,突变,选择和适应度功能的概念。 我们学习了如何使用预定义的参数生成位模式。 我们讨论了如何使用 CMA-ES 可视化演变过程。 我们学习了如何在此范例中解决符号回归问题。 然后,我们使用这些概念来构建机器人控制器,以遍历地图并消耗所有目标。 在下一章中,我们将学习强化学习,并了解如何构建智能
# 参考
......
......@@ -34,7 +34,7 @@
## Minimax 算法
现在,我们已经简要地讨论了组合搜索,下面我们来讨论组合搜索算法所采用的启发式方法。 这些启发式方法可用于加快搜索策略,而 Minimax 算法就是组合搜索使用的此类策略之一。 当两个玩家互相对抗时,他们的目标是截然相反的。 每个玩家都试图赢得胜利。 因此,每一方都需要预测对方球员要做什么才能赢得比赛。 牢记这一点,Minimax 试图通过战略来实现这一目标。 它将尝试最小化对手试图最大化的功能。
现在,我们已经简要地讨论了组合搜索,下面我们来讨论组合搜索算法所采用的启发式方法。 这些启发式方法可用于加快搜索策略,而 Minimax 算法就是组合搜索使用的此类策略之一。 当两个玩家互相对抗时,他们的目标是截然相反的。 每个玩家都试图赢得胜利。 因此,每一方都需要预测对方选手要做什么才能赢得比赛。 牢记这一点,Minimax 试图通过战略来实现这一目标。 它将尝试最小化对手试图最大化的功能。
如前所述,蛮力仅在具有少量可能动作的简单游戏中起作用。 在更复杂的情况下,计算机无法通过所有可能的状态来找到最佳游戏玩法。 在这种情况下,计算机可以尝试使用启发式方法基于当前状态计算最佳移动。 计算机构造一棵树,它从底部开始。 它评估哪些举动会对自己的对手有利。 该算法基于以下前提:对手将做出哪些动作,前提是对手将做出最有利于他们的动作,从而使计算机受益最少。 此结果是树的终端节点之一,计算机使用此位置向后工作。 可以为计算机可用的每个选项分配一个值,然后可以选择最高的值来执行操作。
......@@ -88,7 +88,7 @@ class LastCoinStanding(TwoPlayersGame):
self.players = players
```
定义要开始游戏的玩家。 球员从一开始编号。 因此,在这种情况下,玩家一开始游戏:
定义要开始游戏的玩家。 选手从一开始编号。 因此,在这种情况下,玩家一开始游戏:
```py
# Define who starts the game. Necessary parameter.
......
......@@ -708,7 +708,7 @@ if __name__=='__main__':
fileids=[f])), 'Negative') for f in fileids_neg]
```
定义培训和测试之间的区别。 在这种情况下,我们将为培训分配 80%,为测试分配 20%
定义培训和测试之间的区别。 在这种情况下,我们将为培训分配 80%,为测试分配 20%
```py
# Define the train and test split (80% and 20%)
......@@ -815,7 +815,7 @@ if __name__=='__main__':
主题建模是识别文本数据中与主题相对应的模式的过程。 如果文本包含多个主题,则可以使用此技术来识别和分隔输入文本中的那些主题。 该技术可用于发现给定文档集中的隐藏主题结构。
主题建模可以帮助我们以最佳方式组织文档,然后可以将其用于分析。 关于主题建模算法要注意的一件事是它们不需要标记的数据。 就像无监督学习一样,它将自行识别模式。 考虑到 Internet 上生成的大量文本数据,主题建模非常重要,因为它可以汇总大量数据,否则这是不可能的。
主题建模可以帮助我们以最佳方式组织文档,然后可以将其用于分析。 关于主题建模算法要注意的一件事是它们不需要标记的数据。 就像无监督学习一样,它将自行识别模式。 考虑到互联网上生成的大量文本数据,主题建模非常重要,因为它可以汇总大量数据,否则这是不可能的。
**潜在狄利克雷分配**是一种主题建模技术,其基本概念是文本的给定片段是多个主题的组合。 让我们考虑以下句子:数据可视化是财务分析中的重要工具。 这句话有多个主题,例如数据,可视化和财务。 这种组合有助于识别大型文档中的文本。 它是一个统计模型,试图捕获概念并基于这些概念创建模型。 该模型假定文档是基于这些主题通过随机过程生成的。 主题是固定单词词汇的分布。 让我们看看如何在 Python 中进行主题建模。
......
......@@ -55,7 +55,7 @@ Google Duplex 是一个很好的聊天机器人听起来很自然的有力例子
顺便说一下,这项技术通常是可用的,如果您有 Android 手机或 iPhone,则应该可以使用它。
毫无疑问,聊天机器人将是多产的—在我们的家中,在我们的汽车中,在可穿戴设备中,在呼叫中心以及在电话中。 根据一项估计,聊天机器人的全球市场预计将从 2019 年的 42 亿美元增长到 2024 年的 157 亿美元,年复合增长率为 30.2。 与其他技术一样,使用该技术成长的年轻人永远不会知道没有聊天机器人为我们服务并改善我们的生活会是什么样子。
毫无疑问,聊天机器人将是多产的—在我们的家中,在我们的汽车中,在可穿戴设备中,在呼叫中心以及在电话中。 根据一项估计,聊天机器人的全球市场预计将从 2019 年的 42 亿美元增长到 2024 年的 157 亿美元,年复合增长率为 30.2%。 与其他技术一样,使用该技术成长的年轻人永远不会知道没有聊天机器人为我们服务并改善我们的生活会是什么样子。
本节讨论了聊天机器人在未来几年内的外观。 在下一节中,我们将回到现实,并就如何利用现有的聊天机器人技术使用当今可用的工具创建出色的应用程序提供一些建议。
......@@ -358,7 +358,7 @@ if __name__ == '__main__':
$ python app.py or FLASK_APP=hello.py flask run
```
如果您看到前面的输出,这将确认该应用程序的初始版本正在运行。 到目前为止,我们仅使用本地服务器,因此其他外部客户端无法通过 Internet 访问该服务器。 要将其集成为 DialogFlow 的 Webhook,我们需要将其部署在可以通过 Internet 访问的服务器上。 那就是 ngrok 工具出现的地方。[可以在这里下载该工具](https://ngrok.io)
如果您看到前面的输出,这将确认该应用程序的初始版本正在运行。 到目前为止,我们仅使用本地服务器,因此其他外部客户端无法通过互联网访问该服务器。 要将其集成为 DialogFlow 的 Webhook,我们需要将其部署在可以通过互联网访问的服务器上。 那就是 ngrok 工具出现的地方。[可以在这里下载该工具](https://ngrok.io)
要运行 ngrok,请使用以下命令:
......
......@@ -414,7 +414,7 @@ import matplotlib.pyplot as plt
import neurolab as nl
```
从文件`data_vector_quantization.txt`加载输入数据。 该文件中的每一行都包含六个数字。 前两个数字形成数据点,后四个数字形成一个热编码标签。 总体上有四个课程。
从文件`data_vector_quantization.txt`加载输入数据。 该文件中的每一行都包含六个数字。 前两个数字形成数据点,后四个数字形成热编码标签。 总体上有四个课程。
```py
# Load input data
......@@ -660,7 +660,7 @@ if __name__=='__main__':
# 在光学字符识别数据库中可视化字符
神经网络可以将用于光学字符识别。 它可能是其最常见的用例之一。 将手写体转换为计算机字符一直是许多计算机科学家试图解决的基本问题,但仍然难以捉摸。 我们已经取得了长足的进步,但是,由于显而易见的原因,100的准确性仍然遥不可及。 为什么?
神经网络可以将用于光学字符识别。 它可能是其最常见的用例之一。 将手写体转换为计算机字符一直是许多计算机科学家试图解决的基本问题,但仍然难以捉摸。 我们已经取得了长足的进步,但是,由于显而易见的原因,100% 的准确性仍然遥不可及。 为什么?
考虑这种情况。 您曾经写下任何东西吗?五分钟后,您无法阅读自己的笔迹? 计算机也总是会出现此问题。 写下数字`6`的方法有无数种,其中有些看起来比 *6 更像`0`或`5`。* 。 我可能是错的,但是我认为我们将找到一种治愈癌症的方法,然后才能找到一种可靠的方法来使计算机识别医生的笔迹。 我们已经可以达到很高的准确性,并且*的笔迹越漂亮*,阅读起来就越容易。 我们继续尝试解决此问题的原因是,这是一个有价值的目标,具有许多应用程序。 举一个简短的例子,医生的时间受到高度重视。 随着系统能够更好地识别他们的笔记,他们将获得更多的精力来专注于实际治疗和帮助患者的精力,而不再关注文书工作。
......@@ -788,7 +788,7 @@ orig_labels = 'omandig'
num_orig_labels = len(orig_labels)
```
定义训练和测试拆分。 我们将使用 90%的培训和 10%的测试:
定义训练和测试拆分。 我们将使用 90% 的培训和 10% 的测试:
```py
# Define the training and testing parameters
......
......@@ -412,11 +412,11 @@ print('\nAccuracy =', session.run(accuracy, feed_dict = {
图 12:精度输出
如输出所示,该模型的准确性为 92.1。 这是一个相当低的分数。 让我们看看如何使用 CNN 来改善。
如输出所示,该模型的准确性为 92.1%。 这是一个相当低的分数。 让我们看看如何使用 CNN 来改善。
# 使用卷积神经网络构建图像分类器
上一节部分中的图像分类器效果不佳。 在 MNIST 数据集上获得 92.1相对容易。 让我们看看如何使用 CNN 来获得更高的准确性。 我们将使用相同的数据集构建图像分类器,但使用 CNN 而不是单层神经网络。
上一节部分中的图像分类器效果不佳。 在 MNIST 数据集上获得 92.1% 相对容易。 让我们看看如何使用 CNN 来获得更高的准确性。 我们将使用相同的数据集构建图像分类器,但使用 CNN 而不是单层神经网络。
创建一个新的 Python 文件并导入以下软件包:
......
......@@ -19,7 +19,7 @@
# 循环神经网络的基础
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在第 1 章,“人工智能导论”中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*部落( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 是另一种流行的模型,目前正在获得很大的关注。 正如我们在第 1 章,“人工智能导论”中讨论的那样,对一般神经网络(尤其是 RNN)的研究是*联系主义者*流派( 在 Pedro Domingos 的 AI 分类中进行了介绍)。 RNN 通常用于解决自然语言处理(**NLP**)和**自然语言理解****NLU**)问题 。
RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之前,请牢记以下思想:赛车手不需要完全了解其赛车的机械原理即可使其快速行驶并赢得比赛。 同样,我们不一定需要完全了解 RNN 在幕后的工作方式,以使其对我们有用,有时甚至是令人印象深刻的工作。 Keras 库的创建者 Francois Chollet 描述了**长短期记忆****LSTM**)网络,这是 RNN 的一种形式,如下所示:
......@@ -126,7 +126,7 @@ RNN 之所以称为递归,是因为这些算法对序列的每个元素执行
资料来源:LeCun,Bengio 和 G. Hinton,2015 年,《深度学习》,《自然》
`x`<sub style="font-style: italic;">t</sub> 是时间步长`t`的输入。 在这种情况下,`x`<sub style="font-style: italic;">1</sub> 可能是一个热门属性,与句子中的第 2 <sup></sup>单词相对应。
`x`<sub style="font-style: italic;">t</sub> 是时间步长`t`的输入。 在这种情况下,`x`<sub style="font-style: italic;">1</sub> 可能是热门属性,与句子中的第 2 <sup></sup>单词相对应。
`s`<sub style="font-style: italic;">t</sub> 是时间步长`t`的隐藏状态。 您可以将其视为网络的*存储器*`s`<sub style="font-style: italic;">t</sub> 是使用先前的隐藏状态和当前步骤的输入来计算的:
......@@ -475,4 +475,4 @@ RMSE 是方差的平方根。 可以将其解释为无法解释的方差的标
在本章中,我们继续学习深度学习并学习了 RNN 的基础。 然后,我们讨论了 RNN 架构的基本概念是什么,以及为什么这些概念很重要。 在学习了基础知识之后,我们研究了 RNN 的一些潜在用途,并着眼于使用它来实现语言模型。 最初,我们使用基本技术来实现语言模型,然后开始为模型添加越来越多的复杂性以理解更高层次的概念。
希望您和我们一样兴奋,进入下一章,我们将学习如何使用强化学习来创建智能代理。
\ No newline at end of file
希望您和我们一样兴奋,进入下一章,我们将学习如何使用强化学习来创建智能体。
\ No newline at end of file
# 22
# 通过强化学习创建智能代理
# 通过强化学习创建智能
在本章中,我们将学习**强化学习****RL**)。 我们将讨论 RL 的前提。 我们将讨论 RL 和监督学习之间的区别。 我们将通过一些真实的 RL 实例来了解 RL 如何以各种形式表现出来。 我们将学习 RL 的组成部分以及所涉及的各种概念。 然后,我们将在 Python 中创建一个环境,以了解其在实际中的工作方式。 然后,我们将使用这些概念来构建学习代理。
......
......@@ -139,7 +139,7 @@ Google 的工作方式与图书馆卡目录类似,不同之处在于 Google
图 4:大数据的三个 V
根据 IBM 的数据,2012 年每天产生 2.5 EB 的数据。无论以何种方式衡量,这都是一个很大的数字。 同样,大约 75的数据是非结构化的,来自文本,语音和视频等来源。
根据 IBM 的数据,2012 年每天产生 2.5 EB 的数据。无论以何种方式衡量,这都是一个很大的数字。 同样,大约 75% 的数据是非结构化的,来自文本,语音和视频等来源。
这么多正在创建的新数据没有被构造的事实带来了关于大数据的另一个好处。 数据量不是使大数据难以处理的唯一特征。 在处理数据时,至少要考虑另外两个项目,这会增加处理的复杂性。 它们通常被称为速度和变化。 让我们仔细看看通常所说的三个 V。
......
......@@ -24,7 +24,7 @@
到目前为止,我们已经针对不同的用例实现了不同的 GAN 网络。 条件 GAN 扩展了普通 GAN 的概念,并允许我们控制发电机网络的输出。 面部衰老就是在不更改身份的情况下更改一个人的面部年龄。 在大多数其他模型(包括 GAN)中,由于不考虑面部表情和面部配件(例如太阳镜或胡须),因此会使人的外观或身份损失 50。 Age-cGAN 会考虑所有这些属性。 在本节中,我们将探索用于面部衰老的 cGAN。
到目前为止,我们已经针对不同的用例实现了不同的 GAN 网络。 条件 GAN 扩展了普通 GAN 的概念,并允许我们控制发电机网络的输出。 面部衰老就是在不更改身份的情况下更改一个人的面部年龄。 在大多数其他模型(包括 GAN)中,由于不考虑面部表情和面部配件(例如太阳镜或胡须),因此会使人的外观或身份损失 50%。 Age-cGAN 会考虑所有这些属性。 在本节中,我们将探索用于面部衰老的 cGAN。
......
......@@ -938,7 +938,7 @@ d_loss = 0.5 * np.add(0.5 * np.add(dALoss1, dALoss2), 0.5 *
为了训练对抗网络,我们需要输入值和地面真实值。 网络的输入值为`batchA``batchB`。 基本真值是`real_labels``real_labels``batchA``batchB``batchA``batchB`,如下所示:
为了训练对抗网络,我们需要输入值和真实值。 网络的输入值为`batchA``batchB`。 基本真值是`real_labels``real_labels``batchA``batchB``batchA``batchB`,如下所示:
```py
g_loss = adversarial_model.train_on_batch([batchA, batchB],
......
......@@ -292,7 +292,7 @@ pip install -r requirements.txt
[ht](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/facades.tar.gz) [tp://efrosgans.eecs.berkeley.edu/pix2pix/datasets/facades.tar.gz](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/facades.tar.gz) 。
该数据集包含立面标签和地面真实立面图像。 外观通常是建筑物的正面,外观标签是外观图像的建筑标签。 下载数据集后,我们将了解有关立面的更多信息。 执行以下命令以下载和提取数据集:
该数据集包含立面标签和真实立面图像。 外观通常是建筑物的正面,外观标签是外观图像的建筑标签。 下载数据集后,我们将了解有关立面的更多信息。 执行以下命令以下载和提取数据集:
1. 通过执行以下命令下载数据集:
......
......@@ -44,7 +44,7 @@
数据无处不在。 此刻,成千上万的系统正在收集构成特定服务历史的记录,以及日志,用户交互和许多其他上下文相关元素。 仅十年前,大多数公司甚至无法有效地管理其数据的 1。 因此,数据库会被定期删除,并且只有重要数据才能保留在永久存储服务器中。
数据无处不在。 此刻,成千上万的系统正在收集构成特定服务历史的记录,以及日志,用户交互和许多其他上下文相关元素。 仅十年前,大多数公司甚至无法有效地管理其数据的 1%。 因此,数据库会被定期删除,并且只有重要数据才能保留在永久存储服务器中。
相反,如今,几乎每个公司都可以利用可扩展的云基础架构,以应对不断增长的传入数据量。 诸如 Apache Hadoop 或 Apache Spark 之类的工具使数据科学家和工程师都可以实施涉及大量数据的复杂管道。 在这一点上,所有的障碍都已被拆除,民主化进程已经到位。 但是,这些大型数据集的实际价值是多少? 从业务角度来看,仅当信息可以帮助做出正确的决策,减少不确定性并提供更好的上下文洞察力时,信息才有价值。 这意味着,在没有正确工具和知识的情况下,一堆数据只是对公司的一项成本,需要对其进行限制以增加利润。
......@@ -168,7 +168,7 @@ Learned distribution
![](img/c7e60603-2d54-4e9f-90b6-acbbb6fc56e5.png)
如上一节中所述,所有样本必须是独立于**且从数据生成过程中均匀采样的****IID**)值相等。 特别是,所有类别都必须代表实际分布(例如,如果 *p(y = 0)= 0.4**p(y = 1)= 0.6* ,则比例应为 40% 或 60%)。 但是,为了避免偏差,当类别之间的差异不是很大时,合理的选择是完全均匀的采样,并且对于 *y = 1,2,...,M* 具有相同的代表数 ]。
如上一节中所述,所有样本必须是独立于**且从数据生成过程中均匀采样的****IID**)值相等。 特别是,所有类别都必须代表实际分布(例如,如果 *p(y = 0)= 0.4**p(y = 1)= 0.6* ,则比例应为 40% 或 60% )。 但是,为了避免偏差,当类别之间的差异不是很大时,合理的选择是完全均匀的采样,并且对于 *y = 1,2,...,M* 具有相同的代表数 ]。
通用分类器![](img/91b8220c-e8df-436d-98be-2c519efcb45d.png)可以通过两种方式建模:
......@@ -272,7 +272,7 @@ Dataset and regression line
可以想象,在无监督的情况下,没有隐藏的老师,因此主要目标不能与最小化关于地面真实性的预测误差有关。 的确,在这种情况下,相同的基本事实概念的含义稍有不同。 实际上,在使用分类器时,我们希望训练样本出现空错误(这意味着除真实类别外,其他类别也永远不会被接受为正确的类别)。
可以想象,在无监督的情况下,没有隐藏的老师,因此主要目标不能与最小化关于真实性的预测误差有关。 的确,在这种情况下,相同的基本事实概念的含义稍有不同。 实际上,在使用分类器时,我们希望训练样本出现空错误(这意味着除真实类别外,其他类别也永远不会被接受为正确的类别)。
相反,在一个无监督的问题中,我们希望模型在没有任何正式指示的情况下学习一些信息。 这种情况意味着只能学习样本本身中包含的元素。 因此,无监督算法通常旨在发现样本之间的相似性和模式,或者在给定一组从中得出的向量的情况下,再现输入分布。 现在让我们分析一些无监督模型的最常见类别。
......@@ -328,7 +328,7 @@ Dataset and regression line
我们正在考虑的最后一种无监督方法是基于**关联规则**的发现,它在数据挖掘领域中极为重要。 常见方案是由一组商品子集组成的商业交易的集合。 目的是找出产品之间最重要的关联(例如,购买 *P <sub class="calibre20">i</sub>**P <sub class="calibre20">j</sub>* 的概率为 70)。 特定算法可以有效地挖掘整个数据库,突出显示出于战略和物流目的可以考虑的所有关系。 例如,在线商店可以采用这种方法来促销经常与其他商品一​​起购买的所有那些商品。 此外,由于其他项目的销量增加,因此预测性方法可以通过建议所有极有可能售罄的产品来简化配置过程。
我们正在考虑的最后一种无监督方法是基于**关联规则**的发现,它在数据挖掘领域中极为重要。 常见方案是由一组商品子集组成的商业交易的集合。 目的是找出产品之间最重要的关联(例如,购买 *P <sub class="calibre20">i</sub>**P <sub class="calibre20">j</sub>* 的概率为 70% )。 特定算法可以有效地挖掘整个数据库,突出显示出于战略和物流目的可以考虑的所有关系。 例如,在线商店可以采用这种方法来促销经常与其他商品一​​起购买的所有那些商品。 此外,由于其他项目的销量增加,因此预测性方法可以通过建议所有极有可能售罄的产品来简化配置过程。
在这一点上,向读者介绍无监督学习的实际示例是有帮助的。 不需要特定的先决条件,但是最好具有概率论的基本知识。
......@@ -409,7 +409,7 @@ P(more than 10 trains) = 0.30833234660452563
P(more than 11 trains) = 0.20878680161156604
```
不出所料,观察到 10 列以上火车的概率很低(30),并且派遣 10 个特工似乎并不合理。 但是,由于我们的模型是自适应的,因此我们可以继续收集观测值(例如,在清晨),如下所示:
不出所料,观察到 10 列以上火车的概率很低(30% ),并且派遣 10 个特工似乎并不合理。 但是,由于我们的模型是自适应的,因此我们可以继续收集观测值(例如,在清晨),如下所示:
```py
new_obs = np.array([13, 14, 11, 10, 11, 13, 13, 9, 11, 14, 12, 11, 12, 14, 8, 13, 10, 14, 12, 13, 10, 9, 14, 13, 11, 14, 13, 14])
......@@ -444,7 +444,7 @@ P(more than 10 trains) = 0.49668918740243756
P(more than 11 trains) = 0.3780218948425254
```
使用新的数据集,观察到 9 列以上火车的概率约为 62%(这证实了我们的最初选择),但是现在观察到 10 列以上火车的概率约为 50%。 由于我们不想冒险支付罚款(高于代理商的费用),因此最好派出一组 10 名代理商。 为了进一步确认,我们决定从分布中抽取 2,000 个值,如下所示:
使用新的数据集,观察到 9 列以上火车的概率约为 62% (这证实了我们的最初选择),但是现在观察到 10 列以上火车的概率约为 50%。 由于我们不想冒险支付罚款(高于代理商的费用),因此最好派出一组 10 名代理商。 为了进一步确认,我们决定从分布中抽取 2,000 个值,如下所示:
```py
syn = poisson.rvs(mu, size=2000)
......@@ -475,7 +475,7 @@ Histogram of 2000 points sampled from the final Poisson distribution
第一个称为**标签传播**,其目标是将一些样本的标签传播到更大的人群。 通过考虑一个图形来实现此目标,其中每个顶点代表一个样本,并且使用距离函数对每个边缘进行加权。 通过迭代过程,所有标记的样本将一部分标记值发送给所有邻居,并重复该过程,直到标记停止更改为止。 该系统具有稳定点(即,不能再进化的配置),并且算法可以通过有限的迭代次数轻松达到目标。
在所有可以根据相似性度量标记样本的情况下,标记传播都非常有用。 例如,在线商店可能有大量的客户群,但是只有 10的顾客公开了自己的性别。 如果特征向量足够丰富,可以代表男性和女性用户的常见行为,则可以使用标签传播算法来猜测尚未公开的用户性别。 当然,重要的是要记住,所有分配均基于类似样品具有相同标签的假设。 在许多情况下这可能是正确的,但是当特征向量的复杂性增加时,也会产生误导。
在所有可以根据相似性度量标记样本的情况下,标记传播都非常有用。 例如,在线商店可能有大量的客户群,但是只有 10% 的顾客公开了自己的性别。 如果特征向量足够丰富,可以代表男性和女性用户的常见行为,则可以使用标签传播算法来猜测尚未公开的用户性别。 当然,重要的是要记住,所有分配均基于类似样品具有相同标签的假设。 在许多情况下这可能是正确的,但是当特征向量的复杂性增加时,也会产生误导。
半监督算法的另一个重要系列是基于将标准 **SVM****Support Vector Machine** 的缩写)扩展到包含未标记样本的数据集。 在这种情况下,我们不想传播现有标签,而是传播分类标准。 换句话说,我们要使用标记的数据集训练分类器,并将判别规则也扩展到未标记的样本。
......@@ -527,7 +527,7 @@ Histogram of 2000 points sampled from the final Poisson distribution
我们还重点研究了前两个模型,探讨了有监督,无监督,半监督和强化学习之间的差异。 我们还使用了两个简单的示例来了解监督和非监督方法。
在下一章中,我们将介绍聚类分析的基本概念,并将讨论重点放在一些非常著名的算法上,例如 k 均值和 **K 最近邻****KNN**) ,以及最重要的评估指标。
在下一章中,我们将介绍聚类分析的基本概念,并将讨论重点放在一些非常著名的算法上,例如 K 均值和 **K 最近邻****KNN**) ,以及最重要的评估指标。
......@@ -542,7 +542,7 @@ Histogram of 2000 points sampled from the final Poisson distribution
3. 给定独立样本的数据集和候选数据生成过程(例如,高斯分布),可通过对所有样本的概率求和来获得可能性。 它是正确的?
4. 在哪种假设下,可能性可以作为单个概率的乘积来计算?
5. 假设我们有一个包含一些未知数字特征(例如年龄,分数等)的学生数据集。 您想将男性和女性学生分开,因此决定将数据集分为两组。 不幸的是,这两个集群大约都有 50%的男生和 50%的女生。 您如何解释这个结果?
5. 假设我们有一个包含一些未知数字特征(例如年龄,分数等)的学生数据集。 您想将男性和女性学生分开,因此决定将数据集分为两组。 不幸的是,这两个集群大约都有 50% 的男生和 50% 的女生。 您如何解释这个结果?
6. 考虑前面的示例,但重复该实验并将其分为五个组。 您希望在其中每个中找到什么? (列出一些合理的可能性。)
7. 您已经将在线商店的客户聚集在一起。 给定一个新样本,您可以做出什么样的预测?
......
......@@ -202,7 +202,7 @@ Std(distances) = 0.042885311128215066
在本章中,我们使用著名的**乳腺癌威斯康星州数据集**进行聚类分析。 最初,提出数据集是为了训练分类器。 但是,这对于非平凡的聚类分析非常有帮助。 它包含由 32 个属性(包括诊断和标识号)组成的 569 条记录。 所有属性都与肿瘤的生物学和形态学特性严格相关,但是我们的目标是考虑基本事实(良性或恶性)和数据集的统计特性来验证通用假设。 在继续之前,弄清楚一些要点很重要。 数据集是高维的,聚类是非凸的(因此我们不能期望有完美的分割)。 此外,我们的目标不是使用聚类算法来获得分类器的结果; 因此,必须仅将地面真实情况作为潜在分组的一般指示。 该示例的目的是演示如何执行简短的初步分析,选择最佳数量的聚类以及验证最终结果。
在本章中,我们使用著名的**乳腺癌威斯康星州数据集**进行聚类分析。 最初,提出数据集是为了训练分类器。 但是,这对于非平凡的聚类分析非常有帮助。 它包含由 32 个属性(包括诊断和标识号)组成的 569 条记录。 所有属性都与肿瘤的生物学和形态学特性严格相关,但是我们的目标是考虑基本事实(良性或恶性)和数据集的统计特性来验证通用假设。 在继续之前,弄清楚一些要点很重要。 数据集是高维的,聚类是非凸的(因此我们不能期望有完美的分割)。 此外,我们的目标不是使用聚类算法来获得分类器的结果; 因此,必须仅将真实情况作为潜在分组的一般指示。 该示例的目的是演示如何执行简短的初步分析,选择最佳数量的聚类以及验证最终结果。
下载后(如技术要求部分所述),CSV 文件必须放在我们通常表示为`<data_folder>`的文件夹中。 第一步是加载数据集,并通过熊猫`DataFrame`暴露的函数`describe()`进行全局统计分析,如下所示:
......@@ -366,7 +366,7 @@ for i in range(2, 51):
Inertia as a function of the number of clusters for the Breast Cancer Wisconsin dataset
在这种情况下,基本事实表明,我们应该根据诊断将其分为两组。 但是,该图显示了急剧下降,下降到 *K = 8* 并以较低的斜率继续,直到大约 *K = 40* 为止。 在初步分析过程中,我们已经看到二维投影由具有相同诊断的许多孤立的斑点组成。 因此,我们可以决定采用例如 *K = 8* 并分析与每个群集相对应的特征。 由于这不是分类任务,因此可以将地面真实情况用作主要参考,但是正确的探索性分析可以尝试理解子结构的组成,以便为技术人员(例如,医生)提供更多详细信息。
在这种情况下,基本事实表明,我们应该根据诊断将其分为两组。 但是,该图显示了急剧下降,下降到 *K = 8* 并以较低的斜率继续,直到大约 *K = 40* 为止。 在初步分析过程中,我们已经看到二维投影由具有相同诊断的许多孤立的斑点组成。 因此,我们可以决定采用例如 *K = 8* 并分析与每个群集相对应的特征。 由于这不是分类任务,因此可以将真实情况用作主要参考,但是正确的探索性分析可以尝试理解子结构的组成,以便为技术人员(例如,医生)提供更多详细信息。
现在,我们在乳腺癌威斯康星州数据集上对八个聚类进行 K-均值聚类,以描述两个样本组, 的结构,如下所示
......@@ -910,7 +910,7 @@ Picture quantized with 24 vectors
RGB histogram of the original image (top) and quantized version (bottom)For readers who are not familiar with histograms, we can briefly describe them as having a dataset`X`and a fixed number of bins. Each bin is assigned to a range (starting from *min(X)* and ending in *max(X)*) and each range (*a, b*) is associated with the number of samples such that *a ≤ x < b*. The resulting plot is proportional to an approximation of the actual probability distribution that generated`X`. In our case, on the x-axis, there are all possible values for each pixel per channel (8-bit), while the y-axis represents the estimated frequency (*Nx / Total number of pixels*).
可以看到,量化减少了信息量,但是直方图往往会重现原始信息。 增加量化矢量的数量具有减少近似值的效果,从而产生差异较小的直方图。 对该主题的完整分析超出了本书的范围。 但是,我邀请读者使用其他图像和不同数量的量化矢量来测试该过程。 也可以将原始图像的(协)方差(或熵)与量化版本进行比较,并找到保留 80的方差的阈值。 例如,仅考虑红色通道,并使用频率计数来近似每个值(0÷255)的概率,我们可以获得以下信息:
可以看到,量化减少了信息量,但是直方图往往会重现原始信息。 增加量化矢量的数量具有减少近似值的效果,从而产生差异较小的直方图。 对该主题的完整分析超出了本书的范围。 但是,我邀请读者使用其他图像和不同数量的量化矢量来测试该过程。 也可以将原始图像的(协)方差(或熵)与量化版本进行比较,并找到保留 80% 的方差的阈值。 例如,仅考虑红色通道,并使用频率计数来近似每个值(0÷255)的概率,我们可以获得以下信息:
```py
import numpy as np
......@@ -933,7 +933,7 @@ print('Original entropy: {0:.3f} bits - Quantized entropy: {1:.3f} bits'.format(
Original entropy: 7.726 bits - Quantized entropy: 5.752 bits
```
由于信息量与熵成正比,因此我们现在已经确认,24 个量化矢量(具有 2×2 正方形块)能够解释红色通道原始熵的大约 74(即使三个通道都不是)。 独立地,可以通过对三个熵求和来获得总熵的粗略近似。 该方法可以有效地用于在压缩强度和最终结果质量之间进行权衡。
由于信息量与熵成正比,因此我们现在已经确认,24 个量化矢量(具有 2×2 正方形块)能够解释红色通道原始熵的大约 74% (即使三个通道都不是)。 独立地,可以通过对三个熵求和来获得总熵的粗略近似。 该方法可以有效地用于在压缩强度和最终结果质量之间进行权衡。
......
......@@ -246,7 +246,7 @@ The point x<sub class="calibre26">2</sub> is density-reachable from x<sub class=
最后,重要的是要记住,DBSCAN 可以处理非凸几何形状,并且与均值移位相反,它假设存在由低密度区域包围的高密度区域。 而且,它的复杂性与所采用的 KNN 方法(强力,球树或 kd 树)严格相关。 通常,当数据集不太大时,平均性能大约为 *O(N log N)*,但可能趋于 *O(N <sup class="calibre27">2</sup> )*`N`非常大时。 要记住的另一个重要元素是样品的尺寸。 正如我们已经讨论的那样,高维度量可以减少两点的可分辨性,从而对 KNN 方法的性能产生负面影响。 因此,当维数很高时,应避免(或至少仔细分析)DBSCAN,因为生成的簇不能有效地表示实际的密集区域。
在显示具体示例之前,最好先介绍一种在未知的地面真实情况下可以采用的进一步评估方法。
在显示具体示例之前,最好先介绍一种在未知的真实情况下可以采用的进一步评估方法。
......@@ -666,7 +666,7 @@ Example of a simple CF-Tree with a binary repartition
![](img/3a24c4e7-7463-4f9f-a215-c21bf165d098.png)
但是,如果没有控制权,则树很容易变得不平衡,从而导致性能损失。 因此,该算法执行一个附加步骤。 一旦确定了 CF,就计算更新后的半径 *r <sub class="calibre20">j</sub>* ,以及是否 *r <sub class="calibre20">j</sub> > T* 并且 CF 的数量大于分支因子,分配新的块并且原始的 CF 保持不变。 由于这个新块几乎完全是空的( *x <sub class="calibre20">i</sub>* 除外),BIRCH 会执行一个附加步骤来检查所有子集群之间的差异(此概念在[第 4 章中会更清楚](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_27) , “实用的分层聚类”;但是,读者可以考虑属于两个不同子类的点之间的平均距离)。 最不相似的一对分为两部分,其中之一移到新块中。 这样的选择确保了子群集的高度紧凑性,并加快了最终步骤。 实际上,实际聚类阶段中涉及的算法需要合并子聚类,直到总数减少到所需值为止。 因此,如果先前已将总不相似性最小化,则更容易执行此操作,因为*段*可以立即识别为连续并合并。 在本章中将不详细讨论此阶段,但不难想象。 将所有终端 CF 依次合并到较大的块中,直到确定单个群集为止(即使当数量与所需群集数目匹配时也可以停止该过程)。 因此,与小批量 K 均值相反,此方法可以轻松管理大量簇 *n <sub class="calibre20">c</sub>* ,而当 *n <sub class="calibre20">c 时效果不佳</sub>* 很小。 实际上,正如我们在示例中将要看到的那样,其准确性通常比使用小批量 k 均值所能达到的精度低,并且其最佳用法要求准确选择分支因子和阈值。 由于此算法的主要目的是在在线情况下工作,因此`B``T`在处理了某些批次后可能会失效(而小批量 K 均值通常可以纠正 在几次迭代后聚类),产生次优的结果。 因此,BIRCH 的主要用例是需要非常细粒度细分的在线过程,而在所有其他情况下,通常最好选择小批量 K 均值作为初始选项。
但是,如果没有控制权,则树很容易变得不平衡,从而导致性能损失。 因此,该算法执行一个附加步骤。 一旦确定了 CF,就计算更新后的半径 *r <sub class="calibre20">j</sub>* ,以及是否 *r <sub class="calibre20">j</sub> > T* 并且 CF 的数量大于分支因子,分配新的块并且原始的 CF 保持不变。 由于这个新块几乎完全是空的( *x <sub class="calibre20">i</sub>* 除外),BIRCH 会执行一个附加步骤来检查所有子集群之间的差异(此概念在[第 4 章中会更清楚](https://cdp.packtpub.com/hands_on_unsupervised_learning_with_python/wp-admin/post.php?post=26&action=edit#post_27) , “实用的分层聚类”;但是,读者可以考虑属于两个不同子类的点之间的平均距离)。 最不相似的一对分为两部分,其中之一移到新块中。 这样的选择确保了子群集的高度紧凑性,并加快了最终步骤。 实际上,实际聚类阶段中涉及的算法需要合并子聚类,直到总数减少到所需值为止。 因此,如果先前已将总不相似性最小化,则更容易执行此操作,因为*段*可以立即识别为连续并合并。 在本章中将不详细讨论此阶段,但不难想象。 将所有终端 CF 依次合并到较大的块中,直到确定单个群集为止(即使当数量与所需群集数目匹配时也可以停止该过程)。 因此,与小批量 K 均值相反,此方法可以轻松管理大量簇 *n <sub class="calibre20">c</sub>* ,而当 *n <sub class="calibre20">c 时效果不佳</sub>* 很小。 实际上,正如我们在示例中将要看到的那样,其准确性通常比使用小批量 K 均值所能达到的精度低,并且其最佳用法要求准确选择分支因子和阈值。 由于此算法的主要目的是在在线情况下工作,因此`B``T`在处理了某些批次后可能会失效(而小批量 K 均值通常可以纠正 在几次迭代后聚类),产生次优的结果。 因此,BIRCH 的主要用例是需要非常细粒度细分的在线过程,而在所有其他情况下,通常最好选择小批量 K 均值作为初始选项。
......@@ -786,7 +786,7 @@ Adjusted Rand score BIRCH: 0.767304858161472
4. K-medoids 基于欧几里得度量。 它是否正确?
5. DBSCAN 对数据集的几何非常敏感。 它是否正确?
6. 数据集包含 10,000,000 个样本,可以使用 K-means 在大型计算机上轻松进行聚类。 相反,我们可以使用更小的机器和小批量的 K 均值吗?
7. 群集的标准偏差等于 1.0。 施加噪声`N`(0,0.005)后,80的原始分配被更改。 我们可以说这样的集群配置通常是稳定的吗?
7. 群集的标准偏差等于 1.0。 施加噪声`N`(0,0.005)后,80% 的原始分配被更改。 我们可以说这样的集群配置通常是稳定的吗?
......
此差异已折叠。
......@@ -99,7 +99,7 @@
* *N <sub class="calibre20">离群值</sub> < < N* ,如果存在离群检测(即数据集部分为*污垢;* ,因此, (找出一种方法将所有异常值过滤掉)
* *N <sub class="calibre20">离群值</sub> = 0* (或更实际地, *P( N <sub class="calibre20">离群值</sub> > 0)→0 )*,如果存在新颖性检测(也就是说,我们通常可以信任现有样本,而将注意力集中在新样本上)
这些标准的原因很明显:让我们考虑前面讨论的示例。 如果在 1,000,000 个处理步骤后观察到的异常率等于 0.2%,则表示存在 2,000 个异常,这对于一个工作过程而言可能是一个合理的值。 如果这个数字大得多,则意味着系统中应该存在一个更严重的问题,这超出了数据科学家的职责范围。 因此,在这种情况下,我们期望一个数据集包含大量正确的样本和非常少的异常(甚至为零)。 在许多情况下,经验法则是反映潜在的数据生成过程,因此,如果专家可以确认例如发生 0.2%的异常,则该比率应为 *1000÷2* 找出现实的概率密度函数。 实际上,在这种情况下,更重要的是找出确定异常值可区分性的因素。 另一方面,如果要求我们仅执行新颖性检测(例如:区分有效和恶意网络请求),则必须对数据集进行验证,以便不包含异常,但同时要进行反映 负责所有可能有效样本的真实数据生成过程。
这些标准的原因很明显:让我们考虑前面讨论的示例。 如果在 1,000,000 个处理步骤后观察到的异常率等于 0.2%,则表示存在 2,000 个异常,这对于一个工作过程而言可能是一个合理的值。 如果这个数字大得多,则意味着系统中应该存在一个更严重的问题,这超出了数据科学家的职责范围。 因此,在这种情况下,我们期望一个数据集包含大量正确的样本和非常少的异常(甚至为零)。 在许多情况下,经验法则是反映潜在的数据生成过程,因此,如果专家可以确认例如发生 0.2% 的异常,则该比率应为 *1000÷2* 找出现实的概率密度函数。 实际上,在这种情况下,更重要的是找出确定异常值可区分性的因素。 另一方面,如果要求我们仅执行新颖性检测(例如:区分有效和恶意网络请求),则必须对数据集进行验证,以便不包含异常,但同时要进行反映 负责所有可能有效样本的真实数据生成过程。
实际上,如果正确样本的数量是详尽无遗的,则与高概率区域的任何较大偏差都足以触发警报。 相反,真实数据生成过程的有限区域可能会导致假阳性结果(也就是说,尚未包含在训练集中并被错误标识为异常值的有效样本)。 在最坏的情况下,如果特征发生更改(即,错误地识别为有效样本的离群值),则噪声很大的子集也可能确定假阴性。 但是,在大多数现实生活中,最重要的因素是样本的数量和收集样本的环境。 毋庸置疑,任何模型都必须使用将要测试的相同类型的元素进行训练。 例如:如果使用低精度的仪器在化工厂内部进行测量,则高精度采集的测试可能无法代表总体(当然,它们比数据集可靠得多)。 因此,在进行分析之前,我强烈建议您仔细检查数据的性质,并询问是否所有测试样本均来自同一数据生成过程。
......@@ -186,7 +186,7 @@ print('P(48.84 < x < 51.58) = {:.2f} ({:.2f}%)'.format(p50, p50 * 100.0))
P(48.84 < x < 51.58) = 0.13 (13.43%)
```
因此,概率的近似值约为 13.5,这也由直方图的结构证实。 但是,读者应该清楚地了解到这种方法有明显的局限性。 首先,也是最明显的是关于垃圾箱的数量和宽度。 实际上,一小部分产生的粗略结果无法考虑快速振荡。 另一方面,非常大的数量会驱动到*带孔的*直方图,因为大多数 bin 都没有样本。 因此,考虑到现实生活中可能遇到的所有动态因素,需要一种更可靠的方法。 这是我们将在下一节中讨论的内容。
因此,概率的近似值约为 13.5%,这也由直方图的结构证实。 但是,读者应该清楚地了解到这种方法有明显的局限性。 首先,也是最明显的是关于垃圾箱的数量和宽度。 实际上,一小部分产生的粗略结果无法考虑快速振荡。 另一方面,非常大的数量会驱动到*带孔的*直方图,因为大多数 bin 都没有样本。 因此,考虑到现实生活中可能遇到的所有动态因素,需要一种更可靠的方法。 这是我们将在下一节中讨论的内容。
......@@ -459,11 +459,11 @@ p(Age = 90) = 0.0000000 (Anomaly)
本示例基于 KDD Cup 99 数据集,该数据集收集了一系列正常和恶意的 Internet 活动。 特别是,我们将重点放在 HTTP 请求的子集上,该子集具有四个属性:持续时间,源字节,目标字节和行为(这是一个分类元素,但是对我们而言,可以立即访问某些特定的属性很有帮助。 攻击)。 由于原始值是非常小的零附近的数字,因此所有版本(包括 scikit-learn 在内)都使用公式 *log(x + 0.1)*(因此,在模拟 新样本的异常检测)。 当然,逆变换如下:
本示例基于 KDD Cup 99 数据集,该数据集收集了一系列正常和恶意的互联网活动。 特别是,我们将重点放在 HTTP 请求的子集上,该子集具有四个属性:持续时间,源字节,目标字节和行为(这是一个分类元素,但是对我们而言,可以立即访问某些特定的属性很有帮助。 攻击)。 由于原始值是非常小的零附近的数字,因此所有版本(包括 scikit-learn 在内)都使用公式 *log(x + 0.1)*(因此,在模拟 新样本的异常检测)。 当然,逆变换如下:
![](img/98a32c8c-7f0e-4862-bebe-331853a2ba0f.png)
让我们首先使用 scikit-learn 内置函数`fetch_kddcup99()`加载并准备数据集,然后选择`percent10=True`将数据限制为原始集合的 10(非常大)。 当然,我邀请读者也使用整个数据集和完整的参数列表(包含 34 个数值)进行测试。
让我们首先使用 scikit-learn 内置函数`fetch_kddcup99()`加载并准备数据集,然后选择`percent10=True`将数据限制为原始集合的 10% (非常大)。 当然,我邀请读者也使用整个数据集和完整的参数列表(包含 34 个数值)进行测试。
在这种情况下,我们还选择`subset='http'`,它已经准备好包含大量的正常连接和一些特定的攻击(如在标准期刊日志中):
......@@ -587,8 +587,8 @@ print(np.sum(Yn < 0.015))
由于有 56,516 个正常样本,我们可以决定选择两个阈值(还要考虑异常离群值):
* **正常连接***p <sub class="calibre20">K</sub> (x)> 0.03*
* **中度警报**:0.03(涉及 3.1的正常样本,可以将其识别为假阳性)
* **高警报**:0.015(在这种情况下,只有 1.2的正常样本可以触发警报)
* **中度警报**:0.03(涉及 3.1% 的正常样本,可以将其识别为假阳性)
* **高警报**:0.015(在这种情况下,只有 1.2% 的正常样本可以触发警报)
此外,在第二个警报中,我们捕获到以下内容:
......@@ -734,7 +734,7 @@ Xs = ss.fit_transform(X)
Dataset for the one-class SVM example
主斑点主要由内部像素组成,一部分测试样本位于同一高密度区域。 因此,我们可以合理地假设在包含所有样本的数据集中有大约 20的异常值(因此*ν= 0.2* )。 当然,这种选择是基于我们的假设,在任何实际场景中, *ν*的值必须始终反映数据集中预期异常值的实际百分比 。 当此信息不可用时,最好从较大的值开始(例如 *ν= 0.5* ),然后再减小它直到找到最佳配置为止(即 ,则错误分类的可能性最小)。
主斑点主要由内部像素组成,一部分测试样本位于同一高密度区域。 因此,我们可以合理地假设在包含所有样本的数据集中有大约 20% 的异常值(因此*ν= 0.2* )。 当然,这种选择是基于我们的假设,在任何实际场景中, *ν*的值必须始终反映数据集中预期异常值的实际百分比 。 当此信息不可用时,最好从较大的值开始(例如 *ν= 0.5* ),然后再减小它直到找到最佳配置为止(即 ,则错误分类的可能性最小)。
同样重要的是要记住,训练过程有时会找到次优的解决方案。 因此,可以将一些孤立点标记为孤立点。 在这些情况下,最佳策略是测试不同内核的效果,例如,在处理多项式内核时,增加它们的复杂度,直到找到最佳解决方案(不一定排除所有错误)为止。
......@@ -802,7 +802,7 @@ ss = StandardScaler()
X = ss.fit_transform(X)
```
现在,我们可以实例化`IsolationForest`类并设置最重要的超参数。 第一个是`n_estimators=150`,它通知模型训练 150 棵树。 另一个基本参数(类似于一类 SVM 中的`v`)称为`contamination`,其值表示训练集中异常值的预期百分比。 当我们信任数据集时,我们选择了等于 0.01(1)的值来解决数量可忽略不计的奇怪样本的存在。 出于兼容性原因,已插入`behaviour='new'`参数(请查看官方文档以获取更多信息),并且`random_state=1000`保证实验的可重复性。 一旦类被初始化,就可以训练模型:
现在,我们可以实例化`IsolationForest`类并设置最重要的超参数。 第一个是`n_estimators=150`,它通知模型训练 150 棵树。 另一个基本参数(类似于一类 SVM 中的`v`)称为`contamination`,其值表示训练集中异常值的预期百分比。 当我们信任数据集时,我们选择了等于 0.01(1% )的值来解决数量可忽略不计的奇怪样本的存在。 出于兼容性原因,已插入`behaviour='new'`参数(请查看官方文档以获取更多信息),并且`random_state=1000`保证实验的可重复性。 一旦类被初始化,就可以训练模型:
```py
from sklearn.ensemble import IsolationForest
......
......@@ -255,13 +255,13 @@ print(np.sum(pca.explained_variance_ratio_))
0.8493974642542452
```
因此,在将维数减少到 16 个分量的情况下,考虑到每个样本都将丢弃 48 个分量,我们正在解释原始差异的 85,这是一个合理的值。
因此,在将维数减少到 16 个分量的情况下,考虑到每个样本都将丢弃 48 个分量,我们正在解释原始差异的 85%,这是一个合理的值。
以下屏幕快照显示了显示所有单个贡献的图:
![](img/f34df112-3c13-4331-b106-31b3c662783d.png)Explained variance ratio corresponding to each principal component
正如预期的那样,贡献趋于减少,因为在这种情况下,第一个主要成分负责任; 例如,对于一种颜色的线条(例如黑色或白色),而其余的则为灰色。 这种行为非常普遍,几乎在每种情况下都可以观察到。 通过该图,还可以轻松找到额外的损耗,以进一步减少损耗。 例如,我们可以立即发现,对 3 个成分的严格限制可以解释原始差异的 40%; 因此,剩余的 45%被分为剩余的 13 个组成部分。 我邀请您重复此示例,尝试找出人类区分所有数字所需的最少数量的组件。
正如预期的那样,贡献趋于减少,因为在这种情况下,第一个主要成分负责任; 例如,对于一种颜色的线条(例如黑色或白色),而其余的则为灰色。 这种行为非常普遍,几乎在每种情况下都可以观察到。 通过该图,还可以轻松找到额外的损耗,以进一步减少损耗。 例如,我们可以立即发现,对 3 个成分的严格限制可以解释原始差异的 40% ; 因此,剩余的 45% 被分为剩余的 13 个组成部分。 我邀请您重复此示例,尝试找出人类区分所有数字所需的最少数量的组件。
......@@ -747,7 +747,7 @@ print(Xl[200])
[0.01528335 0.98471665]
```
因此,第一个消息大约有`Topic 0`的概率为 98,而第二个消息几乎几乎没有分配给`Topic 1`。 这证实了分解工作正常。 为了更好地了解整体分布,可视化属于每个类别的消息的混合将很有帮助,如以下屏幕快照所示:
因此,第一个消息大约有`Topic 0`的概率为 98%,而第二个消息几乎几乎没有分配给`Topic 1`。 这证实了分解工作正常。 为了更好地了解整体分布,可视化属于每个类别的消息的混合将很有帮助,如以下屏幕快照所示:
![](img/045bb9d5-9249-4207-8995-0d44461e6ec2.png)
......
......@@ -135,7 +135,7 @@ Examples of unimodal (left) and bimodal (right) distributions
当处理复杂的数据集时,我们无法轻松地估计模式数量。 但是,可以合理地假设数据生成过程是多模式的。 有时,当样本基于共同的结构时,可以有一个主导模式和几个次要模式。 但是通常,如果样本在结构上不同,则具有单一模式的可能性非常低(当然,如果对相同基本元素进行少量修改,则可能具有单一模式,但这不是要考虑的有效情况) 帐户)。
现在,让我们想象一下我们正在处理人脸图片的多模式分布(例如下一节将要讨论的示例中的人脸图片)。 模式的内容是什么? 很难精确地回答这个问题,但是很容易理解,对应于最大数据生成过程的人脸应该包含数据集中最常见的元素(例如,如果 80的人留着胡须 ,我们可以合理地假设该模式将包含它)。
现在,让我们想象一下我们正在处理人脸图片的多模式分布(例如下一节将要讨论的示例中的人脸图片)。 模式的内容是什么? 很难精确地回答这个问题,但是很容易理解,对应于最大数据生成过程的人脸应该包含数据集中最常见的元素(例如,如果 80% 的人留着胡须 ,我们可以合理地假设该模式将包含它)。
我们在使用 GAN 时面临的最著名,最棘手的问题之一就是**模式崩溃**,它涉及到次优的最终配置,其中生成器冻结在某个模式附近,并不断提供与 输出。 发生这种情况的原因非常难以分析(实际上,只有理论),但是我们可以理解如果重新考虑 minimax 游戏,为什么会发生这种情况。 当我们要训练两个不同的分量时,即使保证了纳什均衡,在几次迭代之后,对于最常见的模式,鉴别器也会变得非常有选择性。 当然,当训练发生器以欺骗鉴别器时,实现此目标的最简单方法是简单地避免所有采样远离模式。 这种行为增加了鉴别器的选择性,并创建了一个反馈过程,使 GAN 陷入只有数据生成过程只有一小部分区域的状态。
......
......@@ -33,11 +33,11 @@
3. 是; k-means 设计用于凸簇,而对于凹簇则性能较差。
4. 这意味着所有聚类(样本百分比可忽略不计)分别仅包含属于同一类别(即具有相同真实标签)的样本。
5. 它表示真实标签分配和分配之间的中等/强烈的负差异。 这个值是明显的负条件,不能接受,因为绝大多数样本已分配给错误的聚类。
6. 不可以,因为调整后的 Rand 分数是根据地面真实情况得出的(也就是说,预期的簇数是固定的)。
6. 不可以,因为调整后的 Rand 分数是根据真实情况得出的(也就是说,预期的簇数是固定的)。
7. 如果所有基本查询都需要相同的时间,则会在 *60-(2×4)-2 = 50* 秒内执行它们。 因此,它们每个都需要 *50/100 = 0.5* 秒。 在*叶子大小= 50* 的情况下,我们可以期望将 *50-NN* 查询的执行时间减半,而对基本查询没有影响。 因此,可用于基本查询的总时间变为 *60-(2×2)-2 = 54* 秒。 因此,我们可以执行 *108* 基本查询。
8. 没有; 球树是一种不会遭受维度诅咒的数据结构,其计算复杂度始终为 *O(N log M)*
9. 高斯 *N([-1.0,0.0],diag [0.1,0.2])**N([-0.8,0.0 ],diag [0.3,0.3])*重叠(即使所得聚类非常伸展),而第三个则足够远(考虑均值和方差),可以被单独的聚类捕获。 因此,最佳簇大小为 2,而 k 均值很难将大斑点正确地分为两个内聚分量(特别是对于大量样本)。
9. 高斯 *N([-1.0,0.0],diag [0.1,0.2])**N([-0.8,0.0 ],diag [0.3,0.3])*重叠(即使所得聚类非常伸展),而第三个则足够远(考虑均值和方差),可以被单独的聚类捕获。 因此,最佳簇大小为 2,而 K 均值很难将大斑点正确地分为两个内聚分量(特别是对于大量样本)。
10. VQ 是一种有损压缩方法。 仅当语义没有通过小或中转换而改变时,才可以使用它。 在这种情况下,如果不修改基础语义就不可能与另一个交换令牌。
......@@ -53,8 +53,8 @@
3.*ε= 1.0* 的情况下,许多点无法达到密度。 当球的半径减小时,我们应该期望有更多的噪点。
4. 没有; k 型参量可以采用任何度量。
5. 没有; DBSCAN 对几何不敏感,并且可以管理任何种类的群集结构。
6. 我们已经表明,小批量 K 均值的性能稍差于 k 均值。 因此,答案是肯定的。 使用批处理算法可以节省内存。
7. 考虑到噪声的方差为*σ <sup class="calibre27">2</sup> = 0.005→σ≈0.07* ,它比聚类标准偏差小约 14 倍,因此,我们不能期望有这么多的新 在稳定的群集配置中分配(80)。
6. 我们已经表明,小批量 K 均值的性能稍差于 K 均值。 因此,答案是肯定的。 使用批处理算法可以节省内存。
7. 考虑到噪声的方差为*σ <sup class="calibre27">2</sup> = 0.005→σ≈0.07* ,它比聚类标准偏差小约 14 倍,因此,我们不能期望有这么多的新 在稳定的群集配置中分配(80% )。
......@@ -83,7 +83,7 @@
1. 硬聚类基于固定分配; 因此,样本 *x <sub class="calibre20">i</sub>* 将始终属于单个群集。 相反,相对于每个聚类,软聚类返回一个度向量,该向量的元素表示隶属度(例如,(0.1、0.7、0.05、0.15))。
2. 没有; 模糊 c 均值是 k 均值的扩展,它不适用于非凸几何。 但是,软分配可以评估相邻群集的影响。
2. 没有; 模糊 c 均值是 K 均值的扩展,它不适用于非凸几何。 但是,软分配可以评估相邻群集的影响。
3. 主要假设是,数据集是从可以用多个高斯分布的加权和有效地近似的分布中得出的。
4. 这意味着第一个模型的参数数量是第二个模型的两倍。
5. 第二个是因为它可以用更少的参数实现相同的结果。
......
......@@ -4,7 +4,7 @@
**人工智能****AI**),是计算机中人类智能的模拟,历史悠久。 自 1956 年正式诞生以来,人工智能经历了数次兴衰。 持续不断的 AI 复兴或新的 AI 革命始于深度学习的突破。深度学习是机器学习的一个分支,由于深度学习,机器学习的分支现已成为 AI 最热门的分支。 深度卷积神经网络(**DCNN**)赢得了 ImageNet 大规模视觉识别挑战赛,其错误率仅为 16.4%,相比之下,第二最佳非 DCNN 条目 错误率为 26.2%。 自 2012 年以来,基于 DCNN 的改进条目每年都赢得了 ImageNet 挑战,并且深度学习技术已应用于计算机视觉以外的许多硬 AI 问题,例如语音识别,机器翻译和围棋游戏,从而取得了突破 接 another 而至。 2016 年 3 月,谷歌 DeepMind 的 AlphaGo 通过深度强化学习构建,击败了 18 届人类世界围棋冠军 Lee Sedol 4:1。 在 2017 年 Google I / O 大会上,Google 宣布他们正从移动优先转变为 AI 优先。 其他领先的公司,例如亚马逊,苹果,Facebook 和微软,都对 AI 进行了大量投资,并推出了许多基于 AI 的产品。
**人工智能****AI**),是计算机中人类智能的模拟,历史悠久。 自 1956 年正式诞生以来,人工智能经历了数次兴衰。 持续不断的 AI 复兴或新的 AI 革命始于深度学习的突破。深度学习是机器学习的一个分支,由于深度学习,机器学习的分支现已成为 AI 最热门的分支。 深度卷积神经网络(**DCNN**)赢得了 ImageNet 大规模视觉识别挑战赛,其错误率仅为 16.4%,相比之下,第二最佳非 DCNN 条目 错误率为 26.2%。 自 2012 年以来,基于 DCNN 的改进条目每年都赢得了 ImageNet 挑战,并且深度学习技术已应用于计算机视觉以外的许多硬 AI 问题,例如语音识别,机器翻译和围棋游戏,从而取得了突破 接 another 而至。 2016 年 3 月,谷歌 DeepMind 的 AlphaGo 通过深度强化学习构建,击败了 18 届人类世界围棋冠军 Lee Sedol 4:1。 在 2017 年 Google I/O 大会上,Google 宣布他们正从移动优先转变为 AI 优先。 其他领先的公司,例如亚马逊,苹果,Facebook 和微软,都对 AI 进行了大量投资,并推出了许多基于 AI 的产品。
TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应用程序。 自 2015 年 11 月首次发布以来,TensorFlow 已经有数个流行的开源深度学习框架,在不到两年的时间内,它已迅速成为最受欢迎的开源深度学习框架。 每周都会构建新的 TensorFlow 模型,以解决需要人类甚至是超人类智能的所有任务。 关于 TensorFlow 的数十本书已经出版。 TensorFlow 上的更多在线博客,教程,课程和视频已可用。 很明显,AI 和 TensorFlow 很热门,但为什么还要再加上一本书标题中带有“ TensorFlow”一词呢?
......@@ -90,7 +90,7 @@ TensorFlow 是 Google 的开放源代码框架,用于构建机器学习 AI 应
As we have to stop with a specific TensorFlow version at certain points to get the book published, we'll continue to test run all the code in the book with every new major TensorFlow release, and update the code and test results accordingly on the book's source code repository at [http://github.com/jeffxtang/mobiletfbook](http://github.com/jeffxtang/mobiletfbook). If you have any questions about the code or the book, you may also post an issue directly on the repository.
另一个问题是 TensorFlow Mobile 和 TensorFlow Lite 之间的选择。 该书在大多数章节(1 至 10)中介绍了 TensorFlow Mobile。 TensorFlow Lite 可能是在移动设备上运行 TensorFlow 的未来,它在 Google I / O 2018 上仍处于开发人员预览版中,这就是 Google 希望您“使用 TensorFlow Mobile 覆盖生产案例”的原因。 即使在 TensorFlow Lite 正式发布后,根据 Google 的说法,“ TensorFlow Mobile 不会很快消失”-实际上,在本书出版之前我们测试了最新的 TensorFlow 1.8.0 版本,我们发现 使用 TensorFlow Mobile 变得更加简单
另一个问题是 TensorFlow Mobile 和 TensorFlow Lite 之间的选择。 该书在大多数章节(1 至 10)中介绍了 TensorFlow Mobile。 TensorFlow Lite 可能是在移动设备上运行 TensorFlow 的未来,它在 Google I/O 2018 上仍处于开发人员预览版中,这就是 Google 希望您“使用 TensorFlow Mobile 覆盖生产案例”的原因。 即使在 TensorFlow Lite 正式发布后,根据 Google 的说法,“ TensorFlow Mobile 不会很快消失”-实际上,在本书出版之前我们测试了最新的 TensorFlow 1.8.0 版本,我们发现 使用 TensorFlow Mobile 变得更加简单
如果 TensorFlow Lite 在所有用例中完全取代 TensorFlow Mobile 的那一天(具有 Lite 更好的性能和更小的尺寸)终于到了,那么您从书本中学到的技能将只会为您做好准备。 同时,在那个不可预见的未来到来之前,您可以阅读这本书并了解如何使用 TensorFlow Mobile 这样的老大哥在您的移动应用程序中运行所有这些功能强大的 TensorFlow 模型。
......
......@@ -25,7 +25,7 @@
TensorFlow 是领先的机器智能开源框架。 当 Google 在 2015 年 11 月将 TensorFlow 作为一个开源项目发布时,已经有其他一些类似的深度学习开源框架:Caffe,Torch 和 Theano。 在 5 月 10 日的 Google I / O 2018 上,GitHub 上的 TensorFlow 已达到 99000 星,在 4 个月内增加了 14k 星,而 Caffe 仅增加了 2k 至 24k 星。 两年后,它已经成为*和*最流行的开源框架,用于训练和部署深度学习模型(它对传统机器学习也有很好的支持)。 截至 2018 年 1 月,TensorFlow 在 GitHub 上拥有[近 8.5 万颗星](https://github.com/tensorflow/tensorflow),而其他三个领先的开源深度学习框架 [Caffe](https://github.com/BVLC/caffe)[CNTK](https://github.com/Microsoft/CNTK)[Mxnet](https://github.com/apache/incubator-mxnet) 分别拥有 22k,13k 和 12k 颗星。
TensorFlow 是领先的机器智能开源框架。 当 Google 在 2015 年 11 月将 TensorFlow 作为一个开源项目发布时,已经有其他一些类似的深度学习开源框架:Caffe,Torch 和 Theano。 在 5 月 10 日的 Google I/O 2018 上,GitHub 上的 TensorFlow 已达到 99000 星,在 4 个月内增加了 14k 星,而 Caffe 仅增加了 2k 至 24k 星。 两年后,它已经成为*和*最流行的开源框架,用于训练和部署深度学习模型(它对传统机器学习也有很好的支持)。 截至 2018 年 1 月,TensorFlow 在 GitHub 上拥有[近 8.5 万颗星](https://github.com/tensorflow/tensorflow),而其他三个领先的开源深度学习框架 [Caffe](https://github.com/BVLC/caffe)[CNTK](https://github.com/Microsoft/CNTK)[Mxnet](https://github.com/apache/incubator-mxnet) 分别拥有 22k,13k 和 12k 颗星。
If you're a little confused about the buzz words machine learning, deep learning, machine intelligence, and artificial intelligence (AI), here's a quick summary: machine intelligence and AI are really just the same thing; machine learning is a field, also the most popular one, of AI; deep learning is one special type of machine learning, and is also the modern and most effective approach to solving complicated problems such as computer vision, speech recognition and synthesis, and natural language processing. So in this book, when we say AI, we primarily mean deep learning, the savior that took AI from the long winter to the summer. For more information about the AI winter and deep learning, you can check out [https://en.wikipedia.org/wiki/AI_winter](https://en.wikipedia.org/wiki/AI_winter) and [http://www.deeplearningbook.org](http://www.deeplearningbook.org).
......@@ -225,7 +225,7 @@ Android Studio 是开发 Android 应用程序的最佳工具,并且 TensorFlow
在我们开始运行示例 TensorFlow iOS 和 Android 应用程序之前,让我们澄清一下。 TensorFlow 当前有两种在移动设备上开发和部署深度学习应用程序的方法:TensorFlow Mobile 和 TensorFlow Lite。 TensorFlow Mobile 从一开始就是 TensorFlow 的一部分,而 TensorFlow Lite 是开发和部署 TensorFlow 应用程序的较新方法,因为它具有更好的性能和更小的应用程序尺寸。 但是有一个关键因素可以让我们在本书中专注于 TensorFlow Mobile,同时仍在一个章节中介绍 TensorFlow Lite:从 TensorFlow 1.8 和 2018 年 5 月的 Google I / O 开始,TensorFlow Lite 仍在开发人员预览版中。 现在,准备投入生产的移动 TensorFlow 应用程序,您必须按照 Google 的建议使用 TensorFlow Mobile。
在我们开始运行示例 TensorFlow iOS 和 Android 应用程序之前,让我们澄清一下。 TensorFlow 当前有两种在移动设备上开发和部署深度学习应用程序的方法:TensorFlow Mobile 和 TensorFlow Lite。 TensorFlow Mobile 从一开始就是 TensorFlow 的一部分,而 TensorFlow Lite 是开发和部署 TensorFlow 应用程序的较新方法,因为它具有更好的性能和更小的应用程序尺寸。 但是有一个关键因素可以让我们在本书中专注于 TensorFlow Mobile,同时仍在一个章节中介绍 TensorFlow Lite:从 TensorFlow 1.8 和 2018 年 5 月的 Google I/O 开始,TensorFlow Lite 仍在开发人员预览版中。 现在,准备投入生产的移动 TensorFlow 应用程序,您必须按照 Google 的建议使用 TensorFlow Mobile。
我们决定现在专注于 TensorFlow Mobile 的另一个原因是,虽然 TensorFlow Lite 仅对模型运算符提供了有限的支持,但 TensorFlow Mobile 支持自定义以添加默认情况下 TensorFlow Mobile 不支持的新运算符,您会发现它经常发生在我们的各种模型中 AI 应用程序的模型。
......
......@@ -4,7 +4,7 @@
上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序 TF Classify 都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
上一章中描述的示例 TensorFlow iOS 应用程序,Simple 和 Camera 以及 Android 应用程序 TF Classify 都使用了 Inception v1 模型,该模型是 Google 公开提供的预先训练的图像分类深度神经网络模型。 该模型针对 [ImageNet](http://image-net.org) 进行了训练,ImageNet 是最大和最知名的图像数据库之一,其中有超过一千万个图像被标注为对象类别。 Inception 模型可用于将图像分类为[列出的 1,000 个类别之一](http://image-net.org/challenges/LSVRC/2014/browse-synsets)。 这 1000 个对象类别包括很多对象中的很多犬种。 但是,识别狗品种的准确性不是很高,约为 70%,因为模型经过训练可以识别大量对象,而不是像狗品种之类的特定对象。
如果我们想提高准确性并在使用改进模型的智能手机上构建移动应用程序怎么办,那么当我们四处走走并看到一只有趣的狗时,我们可以使用该应用程序告诉我们它是哪种狗。
......@@ -96,7 +96,7 @@ INFO:tensorflow:Final test accuracy = 91.0% (N=2109)
如果火车精度很高,但验证精度仍然很低,则意味着模型过拟合。 如果火车精度仍然很低,则表明模型不适合。 同样,交叉熵是损失函数值,如果再训练顺利进行,则总体上应该越来越小。 最后,测试准确性取决于尚未用于训练或验证的图像。 通常,这是我们可以说出的关于重新训练模型的最准确的值。
如前面的输出所示,在再培训结束时,我们看到验证精度与火车精度相似(90%和 93%,相比之初为 3%和 21%),最终测试精度为 91% 。 交叉熵也从开始时的 4.767 下降到最后的 0.379。 因此,我们现在有了一个很好的再训练狗品种识别模型。
如前面的输出所示,在再培训结束时,我们看到验证精度与火车精度相似(90% 和 93%,相比之初为 3% 和 21% ),最终测试精度为 91% 。 交叉熵也从开始时的 4.767 下降到最后的 0.379。 因此,我们现在有了一个很好的再训练狗品种识别模型。
To further improve the accuracy, you can play with the `retrain.py`'s other parameters such as training steps (`--how_many_training_steps`), learning rate (`--learning_rate`), and data augmentation (`--flip_left_right`, `--random_crop`, `--random_scale`, `--random_brightness`). Generally, this is a tedious process that involves a lot of "dirty work" as called by Andrew Ng, one of the best-known deep learning experts, in his *Nuts and Bolts of Applying Deep Learning* speech (video is available at: [https://www.youtube.com/watch?v=F1ka6a13S9I](https://www.youtube.com/watch?v=F1ka6a13S9I)).
......@@ -183,7 +183,7 @@ Out[5]: [u'final_result']
现在,我们准备讨论如何进一步修改重新训练的模型,以便可以在移动设备上部署和运行它。 重新训练的模型文件`dog_retrained.pb`的大小太大,大约 80 MB,在部署到移动设备之前,应该经过两个步骤进行优化:
1. **去除未使用的节点**:删除模型中仅在训练期间使用但在推理期间不需要的节点。
2. **量化模型**:将模型参数的所有 32 位浮点数转换为 8 位值。 这样可以将模型大小减小到其原始大小的 25,同时保持推理精度大致相同。
2. **量化模型**:将模型参数的所有 32 位浮点数转换为 8 位值。 这样可以将模型大小减小到其原始大小的 25%,同时保持推理精度大致相同。
TensorFlow's documentation ([https://www.tensorflow.org/performance/quantization](https://www.tensorflow.org/performance/quantization)) offers more details on quantization and why it works.
......
......@@ -33,7 +33,7 @@ Andrej Karpathy wrote a good introduction to RCNN, "Playing around with RCNN, St
快速 RCNN 通过首先在整个输入图像上而不是数千个建议的区域上应用 CNN,然后处理区域建议,从而显着改善了训练过程和推理时间(10 小时的训练和 2.x 秒的推理)。 更快的 RCNN 通过使用区域建议网络进一步将推理速度提高到了实时(0.2 秒),因此在训练后,不再需要耗时的区域建议过程。
与 RCNN 检测系列不同,SSD 和 YOLO 都是单发方法,这意味着它们将单个 CNN 应用于完整的输入图像,而无需使用区域建议和区域分类。 这使这两种方法都非常快,它们的平均平均精度( mAP )约为 80,优于 Faster RCNN。
与 RCNN 检测系列不同,SSD 和 YOLO 都是单发方法,这意味着它们将单个 CNN 应用于完整的输入图像,而无需使用区域建议和区域分类。 这使这两种方法都非常快,它们的平均平均精度( mAP )约为 80%,优于 Faster RCNN。
如果这是您第一次听说这些方法,则可能会感到有些迷茫。 但是,作为对使用 AI 增强移动应用程序功能感兴趣的开发人员,您无需了解设置深度神经网络架构和训练对象检测模型的所有细节; 您应该只知道如何使用以及(如果需要)重新训练经过预先训练的模型,以及如何在 iOS 和 Android 应用中使用经过预先训练或重新训练的模型。
......
......@@ -6,7 +6,7 @@
如果在上一章中在移动设备上玩过涂鸦和构建(并运行模型以识别涂鸦),当您在股市上赚钱时会感到很开心,而如果您不认真的话会变得很认真。 一方面,股价是时间序列数据,一系列离散时间数据,而处理时间序列数据的最佳深度学习方法是 RNN,这是我们在前两章中使用的方法。 AurélienGéron 在他的畅销书*和 Scikit-Learn 和 TensorFlow* 的动手机器学习中,建议使用 RNN“分析时间序列数据,例如股票价格,并告诉您何时买卖”。 另一方面,其他人则认为股票的过去表现无法预测其未来收益,因此,随机选择的投资组合的表现与专家精心挑选的股票一样好。 实际上,Keras(在 TensorFlow 和其他几个库之上运行的非常受欢迎的高级深度学习库)的作者 FrançoisChollet 在他的畅销书 *Python 深度学习*中表示,使用 RNN。 仅用公开数据来击败市场是“一项非常困难的努力,您可能会浪费时间和资源,而无所作为。”
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50的策略更好地预测股价,我们将 首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来构建 RNN LSTM 模型 价格预测。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
因此,冒着“可能”浪费我们时间和资源的风险,但是可以肯定的是,我们至少将了解更多有关 RNN 的知识,以及为什么有可能比随机 50% 的策略更好地预测股价,我们将 首先概述如何使用 RNN 进行股票价格预测,然后讨论如何使用 TensorFlow API 构建 RNN 模型来预测股票价格,以及如何使用易于使用的 Keras API 来构建 RNN LSTM 模型 价格预测。 我们将测试这些模型是否可以击败随机的买入或卖出策略。 如果我们对我们的模型感到满意,以提高我们在市场上的领先优势,或者只是出于专有技术的目的,我们将了解如何冻结并准备 TensorFlow 和 Keras 模型以在 iOS 和 Android 应用程序上运行。 如果该模型可以提高我们的机会,那么我们支持该模型的移动应用程序可以在任何时候,无论何时何地做出买或卖决定。 感觉有点不确定和兴奋? 欢迎来到市场。
总之,本章将涵盖以下主题:
......@@ -122,7 +122,7 @@ for i in range(len(d) - seq_len - 1):
result = np.array(result)
```
3. `result` 数组现在包含我们模型的整个数据集,但是我们需要将其进一步处理为 RNN API 期望的格式。 首先,将其分为训练集(占整个数据集的 90%)和测试集(占 10%):
3. `result` 数组现在包含我们模型的整个数据集,但是我们需要将其进一步处理为 RNN API 期望的格式。 首先,将其分为训练集(占整个数据集的 90% )和测试集(占 10% ):
```py
row = int(round(0.9 * result.shape[0]))
......@@ -267,11 +267,11 @@ You can replace BasicRNNCell in step 4 with BasicLSTMCell and run the training c
plt.show()
```
现在运行代码将显示如图 8.1 所示,正确预测的比率为 56.25
现在运行代码将显示如图 8.1 所示,正确预测的比率为 56.25%
![](img/71f57975-9e80-4886-a13f-7a38b52dc84d.png)Figure 8.1 Showing the stock price prediction correctness trained with TensorFlow RNN
注意,每次运行此培训和测试代码时,您获得的比率可能都会有所不同。 通过微调模型的超参数,您可能会获得超过 60%的比率,这似乎比随机预测要好。 如果您乐观的话,您可能会认为至少有 50%(56.25%)的东西要显示出来,并且可能希望看到该模型在移动设备上运行。 但首先让我们看看是否可以使用酷的 Keras 库来构建更好的模型-在执行此操作之前,让我们通过简单地运行来冻结经过训练的 TensorFlow 模型:
注意,每次运行此培训和测试代码时,您获得的比率可能都会有所不同。 通过微调模型的超参数,您可能会获得超过 60% 的比率,这似乎比随机预测要好。 如果您乐观的话,您可能会认为至少有 50% (56.25% )的东西要显示出来,并且可能希望看到该模型在移动设备上运行。 但首先让我们看看是否可以使用酷的 Keras 库来构建更好的模型-在执行此操作之前,让我们通过简单地运行来冻结经过训练的 TensorFlow 模型:
```py
python tensorflow/python/tools/freeze_graph.py --input_meta_graph=/tmp/amzn_model.ckpt.meta --input_checkpoint=/tmp/amzn_model.ckpt --output_graph=/tmp/amzn_tf_frozen.pb --output_node_names="preds" --input_binary=true
......@@ -518,7 +518,7 @@ plt.show()
![](img/b8227667-1d0d-4ea7-bf0b-fa7dac192064.png)Figure 8.2 Making stock price predictions with the Keras bidirectional and stacked LSTM layers
很容易在堆栈中添加更多 LSTM 层,或者使用诸如学习率和辍学率以及许多恒定设置之类的超参数。 但是,对于使用`pred_len``shift_pred`的不同设置,正确率的差异还没有发现。 也许我们现在应该对接近 60的正确率感到满意,并看看如何在 iOS 和 Android 上使用 TensorFlow 和 Keras 训练的模型-我们可以在以后继续尝试改进模型,但是 了解使用 TensorFlow 和 Keras 训练的 RNN 模型是否会遇到任何问题将非常有价值。
很容易在堆栈中添加更多 LSTM 层,或者使用诸如学习率和辍学率以及许多恒定设置之类的超参数。 但是,对于使用`pred_len``shift_pred`的不同设置,正确率的差异还没有发现。 也许我们现在应该对接近 60% 的正确率感到满意,并看看如何在 iOS 和 Android 上使用 TensorFlow 和 Keras 训练的模型-我们可以在以后继续尝试改进模型,但是 了解使用 TensorFlow 和 Keras 训练的 RNN 模型是否会遇到任何问题将非常有价值。
As François Chollet points out, "deep learning is more an art than a science... every problem is unique and you will have to try and evaluate different strategies empirically. There is currently no theory that will tell you in advance precisely what you should do to optimally solve a problem. You must try and iterate." Hopefully we have provided a good starting point for you to improve the stock price prediction models using TensorFlow and Keras APIs.
......@@ -709,7 +709,7 @@ Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered
![](img/4114a6b9-15da-41f7-b535-bf04c7fb4dad.png)Figure 8.6 Predicting with the Keras RNN model
我们无法确定哪个模型能在没有进一步研究的情况下更好地工作,但是我们可以确定的是,我们的两个 RNN 模型都使用 TensorFlow 和 Keras API 从头开始训练了,其准确性接近 60, 在 iOS 上运行良好,这很值得我们付出努力,因为我们正在尝试建立一个许多专家认为将达到与随机选择相同的性能的模型,并且在此过程中,我们学到了一些新奇的东西-使用 TensorFlow 和 Keras 构建 RNN 模型并在 iOS 上运行它们。 在下一章中,我们只剩下一件事了:如何在 Android 上使用模型? 我们会遇到新的障碍吗?
我们无法确定哪个模型能在没有进一步研究的情况下更好地工作,但是我们可以确定的是,我们的两个 RNN 模型都使用 TensorFlow 和 Keras API 从头开始训练了,其准确性接近 60%, 在 iOS 上运行良好,这很值得我们付出努力,因为我们正在尝试建立一个许多专家认为将达到与随机选择相同的性能的模型,并且在此过程中,我们学到了一些新奇的东西-使用 TensorFlow 和 Keras 构建 RNN 模型并在 iOS 上运行它们。 在下一章中,我们只剩下一件事了:如何在 Android 上使用模型? 我们会遇到新的障碍吗?
......@@ -858,9 +858,9 @@ Figure 8.8 Using the Keras model to make stock price predictions on Amazon
在本章中,我们首先对表示不屑一顾,试图通过使用 TensorFlow 和 Keras RNN API 预测股价来击败市场。 我们首先讨论了 RNN 和 LSTM 模型是什么以及如何使用它们进行股价预测。 然后,我们使用 TensorFlow 和 Keras 从零开始构建了两个 RNN 模型,接近测试正确率的 60。 最后,我们介绍了如何冻结模型并在 iOS 和 Android 上使用它们,并使用自定义 TensorFlow 库修复了 iOS 上可能出现的运行时错误。
在本章中,我们首先对表示不屑一顾,试图通过使用 TensorFlow 和 Keras RNN API 预测股价来击败市场。 我们首先讨论了 RNN 和 LSTM 模型是什么以及如何使用它们进行股价预测。 然后,我们使用 TensorFlow 和 Keras 从零开始构建了两个 RNN 模型,接近测试正确率的 60%。 最后,我们介绍了如何冻结模型并在 iOS 和 Android 上使用它们,并使用自定义 TensorFlow 库修复了 iOS 上可能出现的运行时错误。
如果您对我们尚未建立正确预测比率为 80%或 90%的模型感到有些失望,则可能需要继续进行“尝试并迭代”过程,以查看是否以该正确比率预测股票价格 可能的。 但是,您肯定会从使用 TensorFlow 和 Keras API 的 RNN 模型构建,培训和测试中学到的技能以及在 iOS 和 Android 上运行的技能而受益。
如果您对我们尚未建立正确预测比率为 80% 或 90% 的模型感到有些失望,则可能需要继续进行“尝试并迭代”过程,以查看是否以该正确比率预测股票价格 可能的。 但是,您肯定会从使用 TensorFlow 和 Keras API 的 RNN 模型构建,培训和测试中学到的技能以及在 iOS 和 Android 上运行的技能而受益。
如果您对使用深度学习技术打败市场感兴趣并感到兴奋,让我们在 GAN(Generative Adversarial Networks)上的下一章中进行研究,该模型试图击败能够分辨真实数据与虚假数据之间差异的对手, 并且越来越擅长生成看起来像真实数据的数据,欺骗对手。 GAN 实际上被深度学习的一些顶级研究人员誉为是过去十年中深度学习中最有趣和令人兴奋的想法。
......
......@@ -4,9 +4,9 @@
在前九章中,我们使用 TensorFlow Mobile 在移动设备上运行各种由 TensorFlow 和 Keras 构建的强大的深度学习模型。 正如我们在第 1 章,“移动 TensorFlow 入门”中提到的那样,Google 还提供了 TensorFlow Lite(可替代 TensorFlow Mobile 的版本)在移动设备上运行模型。 尽管自 Google I / O 2018 起它仍在开发人员预览中,但 Google 打算“ 大大简化开发人员针对小型设备的模型定位的体验。” 因此,值得详细研究 TensorFlow Lite 并为未来做好准备。
在前九章中,我们使用 TensorFlow Mobile 在移动设备上运行各种由 TensorFlow 和 Keras 构建的强大的深度学习模型。 正如我们在第 1 章,“移动 TensorFlow 入门”中提到的那样,Google 还提供了 TensorFlow Lite(可替代 TensorFlow Mobile 的版本)在移动设备上运行模型。 尽管自 Google I/O 2018 起它仍在开发人员预览中,但 Google 打算“ 大大简化开发人员针对小型设备的模型定位的体验。” 因此,值得详细研究 TensorFlow Lite 并为未来做好准备。
如果您是 iOS 开发人员,或者同时使用 iOS 和 Android,则 Apple 一年一度的**全球开发人员大会****WWDC**)是您不容错过的活动。 在 WWDC 2017 中,Apple 宣布了新的 Core ML 框架,以支持 iOS(以及所有其他 Apple OS 平台:macOS,tvOS 和 watchOS)上的深度学习模型和标准机器学习模型的运行。 自 iOS 11 起,Core ML 就可用了,截至 2018 年 5 月,Core ML 已占到 80的标记份额。至少了解您可以在 iOS 应用中使用 Core ML 的基本知识绝对有意义。
如果您是 iOS 开发人员,或者同时使用 iOS 和 Android,则 Apple 一年一度的**全球开发人员大会****WWDC**)是您不容错过的活动。 在 WWDC 2017 中,Apple 宣布了新的 Core ML 框架,以支持 iOS(以及所有其他 Apple OS 平台:macOS,tvOS 和 watchOS)上的深度学习模型和标准机器学习模型的运行。 自 iOS 11 起,Core ML 就可用了,截至 2018 年 5 月,Core ML 已占到 80% 的标记份额。至少了解您可以在 iOS 应用中使用 Core ML 的基本知识绝对有意义。
因此,我们将在本章涵盖 TensorFlow Lite 和 Core ML,并通过以下主题展示两者的优势和局限性:
......
......@@ -10,7 +10,7 @@
最后,我们将向您展示如何使用 TensorFlow 和 OpenAI Gym,这是一个用于开发和比较强化学习算法的 Python 工具包,如何在模拟环境中实现强大的强化学习算法,以使我们的机器人能够在真实的身体中移动和平衡 环境。
在 Google I / O 2016 中,有一个名为*的会话,该会话如何使用 Cloud Vision 和 Speech API* 构建智能的 RasPi Bot(您可以在 YouTube 上观看视频)。 它使用 Google 的 Cloud API 执行图像分类以及语音识别和合成。 在本章中,我们将了解如何在设备上离线实现演示中的任务以及增强学习,从而展示 TensorFlow 在 Raspberry Pi 上的强大功能。
在 Google I/O 2016 中,有一个名为*的会话,该会话如何使用 Cloud Vision 和 Speech API* 构建智能的 RasPi Bot(您可以在 YouTube 上观看视频)。 它使用 Google 的 Cloud API 执行图像分类以及语音识别和合成。 在本章中,我们将了解如何在设备上离线实现演示中的任务以及增强学习,从而展示 TensorFlow 在 Raspberry Pi 上的强大功能。
总而言之,我们将在本章中涵盖以下主题,以构建一个可以移动,看到,聆听,说话和学习的机器人:
......@@ -134,7 +134,7 @@ ctl.!default {
Occasionally, after the Pi board reboots, the card number for the USB speaker gets changed by the system automatically and you won't hear the audio when running `aplay test.wav`. In that case, you can run `aplay -l` again to find the new card number set for the USB speaker and update the `~/``.asoundrc` file accordingly.
如果要调节扬声器的音量,请使用`amixer set PCM -- 100%`命令,其中 100将音量设置为最大。
如果要调节扬声器的音量,请使用`amixer set PCM -- 100%`命令,其中 100% 将音量设置为最大。
要加载相机的驱动程序,请运行`sudo modprobe bcm2835-v4l2`命令。 之后,要验证是否已检测到摄像机,请运行`vcgencmd get_camera`命令,该命令应返回`supported=1 detected=1` 。 要在每次主板启动时加载摄像机驱动程序(这是我们需要的),请运行`sudo vi /etc/modules`并在`/etc/modules`的末尾添加一行 `bcm2835-v4l2`(或者您可以运行`sudo bash -c "echo 'bcm2835-v4l2' >> /etc/modules"`)。 当我们运行 TensorFlow 图像分类示例时,我们将在后面的部分中测试相机。
......@@ -472,7 +472,7 @@ INFO:audio:go
INFO:audio:stop
```
您可以在单独的终端中运行相机应用程序,因此,当机器人根据您的语音命令走动时,它会识别出所看到的新图像并说出结果。 这就是构建一个基本的 Raspberry Pi 机器人所需的全部内容,该机器人可以听,动,看和说-Google I / O 2016 演示所做的事情,却不使用任何 Cloud API。 它远不是一个能听懂自然人的语音,进行有趣的对话或执行有用且不重要的任务的幻想机器人。 但是,借助预训练,再训练或其他强大的 TensorFlow 模型,并使用各种传感器,您当然可以为我们构建的 Pi 机器人增加越来越多的智能和物理动力。
您可以在单独的终端中运行相机应用程序,因此,当机器人根据您的语音命令走动时,它会识别出所看到的新图像并说出结果。 这就是构建一个基本的 Raspberry Pi 机器人所需的全部内容,该机器人可以听,动,看和说-Google I/O 2016 演示所做的事情,却不使用任何 Cloud API。 它远不是一个能听懂自然人的语音,进行有趣的对话或执行有用且不重要的任务的幻想机器人。 但是,借助预训练,再训练或其他强大的 TensorFlow 模型,并使用各种传感器,您当然可以为我们构建的 Pi 机器人增加越来越多的智能和物理动力。
在下一节中,您将看到如何在 Pi 上运行经过预训练和再训练的 TensorFlow 模型,我们将向您展示如何向使用 TensorFlow 构建和训练的机器人添加强大的强化学习模型。 毕竟,强化学习的反复试验方式及其与环境交互以获取最大回报的本质,使得强化学习成为机器人非常合适的机器学习方法。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册