提交 69f90249 编写于 作者: W wizardforcel

2020-12-17 21:50:46

上级 e2936c82
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
第 4 章,“特征选择和特征工程” 第 4 章,“特征选择和特征工程”
通过选择正确的尺寸传递给模型以及发现可以丰富输入数据集的新尺寸,可以提高模型表现。 本章将说明如何从现有功能以及外部资源创建新功能。 它还将介绍如何消除冗余或低值的功能 通过选择正确的尺寸传递给模型以及发现可以丰富输入数据集的新尺寸,可以提高模型表现。 本章将说明如何从现有特征以及外部资源创建新特征。 它还将介绍如何消除冗余或低值的特征
第 5 章,“使用监督学习的分类和回归” 第 5 章,“使用监督学习的分类和回归”
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
第 14 章,“构建语音识别器” 第 14 章,“构建语音识别器”
本章将介绍如何执行语音识别。 它将显示如何处理语音数据并从中提取特征。 最后,它将演示如何使用提取的功能来构建语音识别系统。 本章将介绍如何执行语音识别。 它将显示如何处理语音数据并从中提取特征。 最后,它将演示如何使用提取的特征来构建语音识别系统。
第 15 章,“自然语言处理” 第 15 章,“自然语言处理”
......
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
接下来,我们介绍一个常见的分类: 接下来,我们介绍一个常见的分类:
* **机器学习和模式识别**:这也许是目前最流行的 AI 形式。 我们设计和开发可以从数据中学习的软件。 基于这些学习模型,我们对未知数据进行预测。 这里的主要限制之一是这些程序仅限于数据的功能 * **机器学习和模式识别**:这也许是目前最流行的 AI 形式。 我们设计和开发可以从数据中学习的软件。 基于这些学习模型,我们对未知数据进行预测。 这里的主要限制之一是这些程序仅限于数据的特征
如果数据集很小,那么学习模型也将受到限制。 让我们看看典型的机器学习系统是什么样的: 如果数据集很小,那么学习模型也将受到限制。 让我们看看典型的机器学习系统是什么样的:
......
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
到目前为止,选择相关的输入变量并建立成功的模型仍然需要数据科学家具有领域知识。 并在某些情况下具有深厚的领域知识。 让我们进一步探讨一个例子。 到目前为止,选择相关的输入变量并建立成功的模型仍然需要数据科学家具有领域知识。 并在某些情况下具有深厚的领域知识。 让我们进一步探讨一个例子。
继续以贷款违约为例,让我们考虑一些最重要的功能,以便做出准确的预测。 这是该列表的第一个选项。 由于篇幅所限,我们将不列出所有通常使用的功能。 我们将从数据中学到的内容添加和删除项目: 继续以贷款违约为例,让我们考虑一些最重要的特征,以便做出准确的预测。 这是该列表的第一个选项。 由于篇幅所限,我们将不列出所有通常使用的特征。 我们将从数据中学到的内容添加和删除项目:
| **特征名称** | **特征描述** | **为什么有用?** | | **特征名称** | **特征描述** | **为什么有用?** |
| --- | --- | --- | | --- | --- | --- |
...@@ -305,7 +305,7 @@ ...@@ -305,7 +305,7 @@
### 模型表现 ### 模型表现
数据科学环境中的表现并不意味着模型运行的速度如何,而是预测的准确性。 监视机器学习模型的数据科学家主要关注一个指标:漂移。 当数据不再是模型的相关输入或有用输入时,就会发生漂移。 数据可能会更改并失去其预测价值。 数据科学家和工程师必须不断监控模型,以确保模型特征继续与模型训练期间使用的数据点相似。 如果数据漂移,则预测结果将变得不太准确,因为输入功能已过时或不再相关。 例如,考虑一下股票市场数据。 30 年前,市场大为不同。 它与众不同的一些方式包括: 数据科学环境中的表现并不意味着模型运行的速度如何,而是预测的准确性。 监视机器学习模型的数据科学家主要关注一个指标:漂移。 当数据不再是模型的相关输入或有用输入时,就会发生漂移。 数据可能会更改并失去其预测价值。 数据科学家和工程师必须不断监控模型,以确保模型特征继续与模型训练期间使用的数据点相似。 如果数据漂移,则预测结果将变得不太准确,因为输入特征已过时或不再相关。 例如,考虑一下股票市场数据。 30 年前,市场大为不同。 它与众不同的一些方式包括:
* 证券交易所的交易量大大低于今天 * 证券交易所的交易量大大低于今天
* 高频交易甚至不是一个主意 * 高频交易甚至不是一个主意
......
此差异已折叠。
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
现在拍摄同一组照片,但是这次我们在每张照片上都有一个标签。 假设标签是性别。 因为我们现在有了数据的标签,所以我们可以将数据通过监督算法处理,并使用输入变量(在这种情况下,输入变量是照片像素)来计算目标变量(在这种情况下,性别)。 更正式的: 现在拍摄同一组照片,但是这次我们在每张照片上都有一个标签。 假设标签是性别。 因为我们现在有了数据的标签,所以我们可以将数据通过监督算法处理,并使用输入变量(在这种情况下,输入变量是照片像素)来计算目标变量(在这种情况下,性别)。 更正式的:
**监督学习**是指指的是基于标记的训练数据构建机器学习模型的过程。 在监督学习中,每个示例或行都是一个由输入变量和所需目标变量组成的元组。 例如,机器学习中使用的常见数据集是“泰坦尼克号”数据集。 该数据集包含描述著名船只 RMS Titanic 的乘客的特征。 一些输入功能是: **监督学习**是指指的是基于标记的训练数据构建机器学习模型的过程。 在监督学习中,每个示例或行都是一个由输入变量和所需目标变量组成的元组。 例如,机器学习中使用的常见数据集是“泰坦尼克号”数据集。 该数据集包含描述著名船只 RMS Titanic 的乘客的特征。 一些输入特征是:
* 旅客姓名 * 旅客姓名
* 性别 * 性别
...@@ -134,17 +134,17 @@ Std deviation = [ 1\. 1\. 1.] ...@@ -134,17 +134,17 @@ Std deviation = [ 1\. 1\. 1.]
## 缩放 ## 缩放
正如在上一节中所做的一样,让我们​​通过访问一个示例来直观了解什么是缩放。 假设您有一个包含与房屋相关的特征的数据集,并且您正在尝试预测这些房屋的价格。 这些功能的数值范围可能会大不相同。 例如,房屋的平方英尺通常为数千,而房间数通常少于 10。此外,其中一些功能可能包含一些异常值。 例如,我们的数据集中可能有一些大厦使其他数据集倾斜。 正如在上一节中所做的一样,让我们​​通过访问一个示例来直观了解什么是缩放。 假设您有一个包含与房屋相关的特征的数据集,并且您正在尝试预测这些房屋的价格。 这些特征的数值范围可能会大不相同。 例如,房屋的平方英尺通常为数千,而房间数通常少于 10。此外,其中一些特征可能包含一些异常值。 例如,我们的数据集中可能有一些大厦使其他数据集倾斜。
我们需要找到一种缩放这些特征的方法,以使赋予每个特征的权重大致相同,而离群值的重要性也不会太大。 一种方法是重新调整所有功能,使它们落入较小的范围内,例如`0``1`。 MinMaxScaler 算法可能是实现此目的的最有效方法。 该算法的公式为: 我们需要找到一种缩放这些特征的方法,以使赋予每个特征的权重大致相同,而离群值的重要性也不会太大。 一种方法是重新调整所有特征,使它们落入较小的范围内,例如`0``1`。 MinMaxScaler 算法可能是实现此目的的最有效方法。 该算法的公式为:
![](img/B15441_05_001.png) ![](img/B15441_05_001.png)
其中`max(x)`是变量的最大值,`min(x)`是最小值,并且`x[i]`分别是个体的值。 其中`max(x)`是变量的最大值,`min(x)`是最小值,并且`x[i]`分别是个体的值。
在我们的特征向量中,每个特征的值可以在许多随机值之间变化。 因此,对这些功能进行缩放以具有一个公平的竞争环境以训练机器学习算法就变得很重要。 仅仅由于测量的性质,任何功能都不能人为地变大或变小。 在我们的特征向量中,每个特征的值可以在许多随机值之间变化。 因此,对这些特征进行缩放以具有一个公平的竞争环境以训练机器学习算法就变得很重要。 仅仅由于测量的性质,任何特征都不能人为地变大或变小。
要在 Python 中实现此功能,请在文件中添加以下几行: 要在 Python 中实现,请在文件中添加以下几行:
```py ```py
# Min max scaling # Min max scaling
...@@ -323,7 +323,7 @@ classifier.fit(X, y) ...@@ -323,7 +323,7 @@ classifier.fit(X, y)
visualize_classifier(classifier, X, y) visualize_classifier(classifier, X, y)
``` ```
必须先定义功能,然后才能使用它。 在本章中,我们将多次使用此函数,因此最好在一个单独的文件中对其进行定义并导入该函数。 此功能在提供的`utilities.py`文件中提供。 必须先定义函数,然后才能使用它。 在本章中,我们将多次使用此函数,因此最好在一个单独的文件中对其进行定义并导入该函数。 此函数在提供的`utilities.py`文件中提供。
创建一个新的 Python 文件并导入以下包: 创建一个新的 Python 文件并导入以下包:
...@@ -417,7 +417,7 @@ classifier = linear_model.LogisticRegression(solver='liblinear', C=100) ...@@ -417,7 +417,7 @@ classifier = linear_model.LogisticRegression(solver='liblinear', C=100)
**朴素贝叶斯**是一种用于使用贝叶斯定理建立分类器的技术。 贝叶斯定理描述了基于与该事件相关的不同条件发生事件的概率。 通过为问题实例分配类标签,我们构建了朴素的贝叶斯分类器。 这些问题实例被表示为特征值的向量。 这里的假设是任何给定特征的值都独立于任何其他特征的值。 这称为独立性假设,它是朴素贝叶斯分类器的朴素部分。 **朴素贝叶斯**是一种用于使用贝叶斯定理建立分类器的技术。 贝叶斯定理描述了基于与该事件相关的不同条件发生事件的概率。 通过为问题实例分配类标签,我们构建了朴素的贝叶斯分类器。 这些问题实例被表示为特征值的向量。 这里的假设是任何给定特征的值都独立于任何其他特征的值。 这称为独立性假设,它是朴素贝叶斯分类器的朴素部分。
给定类别变量,我们可以仅查看给定功能如何影响它,而不管其对其他功能的影响。 例如,如果发现动物,有四条腿,有一条尾巴并且以大约 70 MPH 的速度奔跑,则可以将其视为猎豹。 朴素的贝叶斯分类器认为这些特征中的每一个都对结果有独立的贡献。 结果是指该动物是猎豹的可能性。 我们并不关心皮肤图案,腿数,尾巴的存在和运动速度之间可能存在的相关性。 让我们看看如何构建朴素贝叶斯分类器。 给定类别变量,我们可以仅查看给定特征如何影响它,而不管其对其他特征的影响。 例如,如果发现动物,有四条腿,有一条尾巴并且以大约 70 MPH 的速度奔跑,则可以将其视为猎豹。 朴素的贝叶斯分类器认为这些特征中的每一个都对结果有独立的贡献。 结果是指该动物是猎豹的可能性。 我们并不关心皮肤图案,腿数,尾巴的存在和运动速度之间可能存在的相关性。 让我们看看如何构建朴素贝叶斯分类器。
创建一个新的 Python 文件并导入以下包: 创建一个新的 Python 文件并导入以下包:
......
...@@ -647,7 +647,7 @@ for metric in metrics: ...@@ -647,7 +647,7 @@ for metric in metrics:
# 计算特征相对重要性 # 计算特征相对重要性
在将与包含 N 维数据点的数据集一起使用时,必须理解,并非所有功能都同样重要。 有些比其他更具歧视性。 如果我们有此信息,则可以使用它来减少维数。 这对于降低复杂度和提高算法速度很有用。 有时,一些功能是完全多余的。 因此,可以轻松地将它们从数据集中删除。 在将与包含 N 维数据点的数据集一起使用时,必须理解,并非所有特征都同样重要。 有些比其他更具歧视性。 如果我们有此信息,则可以使用它来减少维数。 这对于降低复杂度和提高算法速度很有用。 有时,一些特征是完全多余的。 因此,可以轻松地将它们从数据集中删除。
我们将使用`AdaBoost`回归器计算特征重要性。 AdaBoost 是 Adaptive Boosting 的缩写,是一种经常与其他机器学习算法结合使用以提高其表现的算法。 在 AdaBoost 中,从分布中提取训练数据点以训练当前分类器。 该分布会进行迭代更新,以便后续的分类器可以专注于更困难的数据点。 困难的数据点是那些分类错误的数据点。 这是通过在每个步骤更新发行版来完成的。 这将使先前被错误分类的数据点更有可能出现在用于训练的下一个样本数据集中。 我们将使用`AdaBoost`回归器计算特征重要性。 AdaBoost 是 Adaptive Boosting 的缩写,是一种经常与其他机器学习算法结合使用以提高其表现的算法。 在 AdaBoost 中,从分布中提取训练数据点以训练当前分类器。 该分布会进行迭代更新,以便后续的分类器可以专注于更困难的数据点。 困难的数据点是那些分类错误的数据点。 这是通过在每个步骤更新发行版来完成的。 这将使先前被错误分类的数据点更有可能出现在用于训练的下一个样本数据集中。
...@@ -758,7 +758,7 @@ plt.show() ...@@ -758,7 +758,7 @@ plt.show()
![](img/B15441_06_18.png) ![](img/B15441_06_18.png)
图 18:使用 Adaboost 回归器的功能重要性 图 18:使用 Adaboost 回归器的特征重要性
根据这一分析,特征`LSTAT`是该数据集中最重要的特征。 根据这一分析,特征`LSTAT`是该数据集中最重要的特征。
...@@ -803,7 +803,7 @@ with open(input_file, 'r') as f: ...@@ -803,7 +803,7 @@ with open(input_file, 'r') as f:
data = np.array(data) data = np.array(data)
``` ```
数据中的非数字特征需要进行编码。 不对数字特征进行编码也很重要。 每个需要编码的功能都需要有一个单独的标签编码器。 我们需要跟踪这些编码器,因为当我们要计算未知数据点的输出时将需要它们。 让我们创建那些标签编码器: 数据中的非数字特征需要进行编码。 不对数字特征进行编码也很重要。 每个需要编码的特征都需要有一个单独的标签编码器。 我们需要跟踪这些编码器,因为当我们要计算未知数据点的输出时将需要它们。 让我们创建那些标签编码器:
```py ```py
# Convert string data to numerical data # Convert string data to numerical data
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
* **函数式**:将计算视为对数学函数的评估,并且不允许更改状态或可变数据。 * **函数式**:将计算视为对数学函数的评估,并且不允许更改状态或可变数据。
* **声明式**:一种编程的方式,其中,通过描述需要完成的操作而不是如何执行来编写程序。 在不明确描述控制流程的情况下表达了底层计算的逻辑。 * **声明式**:一种编程的方式,其中,通过描述需要完成的操作而不是如何执行来编写程序。 在不明确描述控制流程的情况下表达了底层计算的逻辑。
* **面向对象**:将程序中的代码分组,以使每个对象都对自己负责。 对象包含指定更改如何发生的数据和方法。 * **面向对象**:将程序中的代码分组,以使每个对象都对自己负责。 对象包含指定更改如何发生的数据和方法。
* **过程式**:将代码分组为功能,每个功能负责一系列步骤。 * **过程式**:将代码分组为函数,每个函数负责一系列步骤。
* **符号式**:使用样式的语法和语法,程序可通过将样式视为纯数据来修改其自身的组件。 * **符号式**:使用样式的语法和语法,程序可通过将样式视为纯数据来修改其自身的组件。
* **逻辑式**:将计算视为对由事实和规则组成的知识数据库的自动推理。 * **逻辑式**:将计算视为对由事实和规则组成的知识数据库的自动推理。
...@@ -349,7 +349,7 @@ def sibling(x, y): ...@@ -349,7 +349,7 @@ def sibling(x, y):
return conde((parent(temp, x), parent(temp, y))) return conde((parent(temp, x), parent(temp, y)))
``` ```
定义一个函数以检查`x`是否是`y`的叔叔。 我们将使用以下逻辑:如果`x``y`的叔叔,那么`x`的祖父母将与`y`的父母相同。 请注意,此处需要进行一些修改,因为当我们列出`x`的所有叔叔时,也会列出`x`的父亲,因为`x`的父亲满足了这些条件。 因此,当我们打印输出时,我们将不得不从列表中删除`x`的父亲。 我们将在主要功能中对此进行讨论: 定义一个函数以检查`x`是否是`y`的叔叔。 我们将使用以下逻辑:如果`x``y`的叔叔,那么`x`的祖父母将与`y`的父母相同。 请注意,此处需要进行一些修改,因为当我们列出`x`的所有叔叔时,也会列出`x`的父亲,因为`x`的父亲满足了这些条件。 因此,当我们打印输出时,我们将不得不从列表中删除`x`的父亲。 我们将在`main`函数中对此进行讨论:
```py ```py
# Check if x is y's uncle # Check if x is y's uncle
......
...@@ -109,7 +109,7 @@ def eval_func(individual): ...@@ -109,7 +109,7 @@ def eval_func(individual):
当个数等于`45`时,前一个函数中使用的公式将达到最大值。 所有个体的长度为 75。当个数等于`45`时,返回值为`75` 当个数等于`45`时,前一个函数中使用的公式将达到最大值。 所有个体的长度为 75。当个数等于`45`时,返回值为`75`
现在让我们定义一个函数来创建`toolbox`。 首先,为健身功能定义`creator`对象并跟踪个体。 这里使用的`Fitness`类是一个抽象类,它需要定义`weights`属性。 我们正在使用正权重建立最大适应度: 现在让我们定义一个函数来创建`toolbox`。 首先,为适应性函数定义`creator`对象并跟踪个体。 这里使用的`Fitness`类是一个抽象类,它需要定义`weights`属性。 我们正在使用正权重建立最大适应度:
```py ```py
# Create the toolbox with the right parameters def # Create the toolbox with the right parameters def
...@@ -127,7 +127,7 @@ def create_toolbox(num_bits): ...@@ -127,7 +127,7 @@ def create_toolbox(num_bits):
toolbox = base.Toolbox() toolbox = base.Toolbox()
``` ```
现在我们将开始向`toolbox`注册各种功能。 让我们从生成`0``1`之间的随机整数的随机数生成器开始。 这基本上是生成位字符串: 现在我们将开始向`toolbox`注册各种函数。 让我们从生成`0``1`之间的随机整数的随机数生成器开始。 这基本上是生成位字符串:
```py ```py
# Generate attributes # Generate attributes
...@@ -181,7 +181,7 @@ def create_toolbox(num_bits): ...@@ -181,7 +181,7 @@ def create_toolbox(num_bits):
return toolbox return toolbox
``` ```
这是上一节中讨论的所有概念的实现。 `DEAP`中常见的是`toolbox`生成器功能,我们将在本章通篇使用它。 因此,花一些时间来了解`toolbox`是如何产生的,这一点很重要。 这是上一节中讨论的所有概念的实现。 `DEAP`中常见的是`toolbox`生成器函数,我们将在本章通篇使用它。 因此,花一些时间来了解`toolbox`是如何产生的,这一点很重要。
从位模式的长度开始,通过定义`main`函数: 从位模式的长度开始,通过定义`main`函数:
...@@ -585,7 +585,7 @@ if __name__ == "__main__": ...@@ -585,7 +585,7 @@ if __name__ == "__main__":
在本章的最后,我们将看到 GA 在众多行业和领域中的许多应用。 从财务到流量优化,GA 的应用几乎是无止境的。 不过,到目前为止,我们继续另一个简单的示例。 让我们看看如何使用遗传编程来解决符号回归问题。 重要的是要了解遗传程序设计与 GA 并不相同。 遗传编程是一种进化算法,其中解决方案以计算机程序的形式出现。 每代人都是计算机程序,他们的适应水平与其解决问题的能力相对应。 每次迭代时,都使用 GA 修改这些程序。 遗传程序设计是 GA 的应用。 在本章的最后,我们将看到 GA 在众多行业和领域中的许多应用。 从财务到流量优化,GA 的应用几乎是无止境的。 不过,到目前为止,我们继续另一个简单的示例。 让我们看看如何使用遗传编程来解决符号回归问题。 重要的是要了解遗传程序设计与 GA 并不相同。 遗传编程是一种进化算法,其中解决方案以计算机程序的形式出现。 每代人都是计算机程序,他们的适应水平与其解决问题的能力相对应。 每次迭代时,都使用 GA 修改这些程序。 遗传程序设计是 GA 的应用。
关于符号回归问题,我们有一个多项式表达式,在这里需要近似。 这是一个经典的回归问题,我们尝试估计基本功能。 在此示例中,我们将使用表达式:`f(x) = 2x ^ 3 – 3x ^ 2 + 4x – 1` 关于符号回归问题,我们有一个多项式表达式,在这里需要近似。 这是一个经典的回归问题,我们尝试估计基本函数。 在此示例中,我们将使用表达式:`f(x) = 2x ^ 3 – 3x ^ 2 + 4x – 1`
此处讨论的代码是`DEAP`库中给出的符号回归问题的变体。 创建一个新的 Python 文件并导入以下内容: 此处讨论的代码是`DEAP`库中给出的符号回归问题的变体。 创建一个新的 Python 文件并导入以下内容:
...@@ -804,7 +804,7 @@ class RobotController(object): ...@@ -804,7 +804,7 @@ class RobotController(object):
self.direction_col = [0, 1, 0, -1] self.direction_col = [0, 1, 0, -1]
``` ```
定义重置功能 定义重置函数
```py ```py
def _reset(self): def _reset(self):
...@@ -1205,7 +1205,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域; ...@@ -1205,7 +1205,7 @@ GP 算法广泛用于金融交易,时间序列预测和经济建模领域;
# 总结 # 总结
在本章中,我们了解了 GA 及其基本概念。 我们讨论了进化算法和遗传规划。 我们了解了它们与 GA 之间的关系。 我们讨论了 GA 的基本构建模块,包括种群,交叉,突变,选择和适应度功能的概念。 我们学习了如何使用预定义的参数生成位模式。 我们讨论了如何使用 CMA-ES 可视化演变过程。 我们学习了如何在此范例中解决符号回归问题。 然后,我们使用这些概念来构建机器人控制器,以遍历地图并消耗所有目标。 在下一章中,我们将学习强化学习,并了解如何构建智能体。 在本章中,我们了解了 GA 及其基本概念。 我们讨论了进化算法和遗传规划。 我们了解了它们与 GA 之间的关系。 我们讨论了 GA 的基本构建模块,包括种群,交叉,突变,选择和适应度函数的概念。 我们学习了如何使用预定义的参数生成位模式。 我们讨论了如何使用 CMA-ES 可视化演变过程。 我们学习了如何在此范例中解决符号回归问题。 然后,我们使用这些概念来构建机器人控制器,以遍历地图并消耗所有目标。 在下一章中,我们将学习强化学习,并了解如何构建智能体。
# 参考 # 参考
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
## Minimax 算法 ## Minimax 算法
现在,我们已经简要地讨论了组合搜索,下面我们来讨论组合搜索算法所采用的启发式方法。 这些启发式方法可用于加快搜索策略,而 Minimax 算法就是组合搜索使用的此类策略之一。 当两个玩家互相对抗时,他们的目标是截然相反的。 每个玩家都试图赢得胜利。 因此,每一方都需要预测对方选手要做什么才能赢得比赛。 牢记这一点,Minimax 试图通过战略来实现这一目标。 它将尝试最小化对手试图最大化的功能 现在,我们已经简要地讨论了组合搜索,下面我们来讨论组合搜索算法所采用的启发式方法。 这些启发式方法可用于加快搜索策略,而 Minimax 算法就是组合搜索使用的此类策略之一。 当两个玩家互相对抗时,他们的目标是截然相反的。 每个玩家都试图赢得胜利。 因此,每一方都需要预测对方选手要做什么才能赢得比赛。 牢记这一点,Minimax 试图通过战略来实现这一目标。 它将尝试最小化对手试图最大化的函数
如前所述,暴力仅在具有少量可能动作的简单游戏中起作用。 在更复杂的情况下,计算机无法通过所有可能的状态来找到最佳游戏玩法。 在这种情况下,计算机可以尝试使用启发式方法基于当前状态计算最佳移动。 计算机构造一棵树,它从底部开始。 它评估哪些举动会对自己的对手有利。 该算法基于以下前提:对手将做出哪些动作,前提是对手将做出最有利于他们的动作,从而使计算机受益最少。 此结果是树的终端节点之一,计算机使用此位置向后工作。 可以为计算机可用的每个选项分配一个值,然后可以选择最高的值来执行操作。 如前所述,暴力仅在具有少量可能动作的简单游戏中起作用。 在更复杂的情况下,计算机无法通过所有可能的状态来找到最佳游戏玩法。 在这种情况下,计算机可以尝试使用启发式方法基于当前状态计算最佳移动。 计算机构造一棵树,它从底部开始。 它评估哪些举动会对自己的对手有利。 该算法基于以下前提:对手将做出哪些动作,前提是对手将做出最有利于他们的动作,从而使计算机受益最少。 此结果是树的终端节点之一,计算机使用此位置向后工作。 可以为计算机可用的每个选项分配一个值,然后可以选择最高的值来执行操作。
......
...@@ -380,7 +380,7 @@ if __name__=='__main__': ...@@ -380,7 +380,7 @@ if __name__=='__main__':
tone_freq = tone_map[tone_name] tone_freq = tone_map[tone_name]
``` ```
使用前面定义的音调合成器功能生成音调: 使用前面定义的音调合成器函数生成音调:
```py ```py
# Generate the tone using the above parameters # Generate the tone using the above parameters
...@@ -453,7 +453,7 @@ if __name__=='__main__': ...@@ -453,7 +453,7 @@ if __name__=='__main__':
# 提取语音特征 # 提取语音特征
我们学习了如何将时域信号转换为频域。 频域功能已在所有语音识别系统中广泛使用。 我们之前讨论的概念是对该概念的介绍,但实际的频域功能要复杂一些。 将信号转换到频域后,我们需要确保以特征向量的形式使用该信号。 这就是 **梅尔频谱系数****MFCC**)的概念。 MFCC 是工具,用于从给定音频信号中提取频域特征。 我们学习了如何将时域信号转换为频域。 频域特征已在所有语音识别系统中广泛使用。 我们之前讨论的概念是对该概念的介绍,但实际的频域特征要复杂一些。 将信号转换到频域后,我们需要确保以特征向量的形式使用该信号。 这就是 **梅尔频谱系数****MFCC**)的概念。 MFCC 是工具,用于从给定音频信号中提取频域特征。
为了从音频信号中提取频率特征,MFCC 首先提取功率谱。 然后,它使用滤波器组和**离散余弦变换****DCT**)提取特征。 如果您有兴趣进一步研究 MFCC,[请查看以下链接](http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs) 为了从音频信号中提取频率特征,MFCC 首先提取功率谱。 然后,它使用滤波器组和**离散余弦变换****DCT**)提取特征。 如果您有兴趣进一步研究 MFCC,[请查看以下链接](http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs)
...@@ -540,17 +540,17 @@ plt.show() ...@@ -540,17 +540,17 @@ plt.show()
图 5:MFCC 特征图 图 5:MFCC 特征图
第二张屏幕截图显示了滤波器组功能 第二张屏幕截图显示了滤波器组特征
![](img/B15441_14_06.png) ![](img/B15441_14_06.png)
图 6:滤波器组功能 图 6:滤波器组特征
您将看到以下打印出来: 您将看到以下打印出来:
![](img/B15441_14_07.png) ![](img/B15441_14_07.png)
图 7:MFCC 和滤波器组功能输出 图 7:MFCC 和滤波器组特征输出
正如我们在上一张图表中所看到的以及在本章中学到的那样,将声音转换为图片可能非常有用,并且它可以让我们以不同的方式分析声音并得出我们否则会错过的有见识的见解。 正如我们在上一张图表中所看到的以及在本章中学到的那样,将声音转换为图片可能非常有用,并且它可以让我们以不同的方式分析声音并得出我们否则会错过的有见识的见解。
......
...@@ -268,7 +268,7 @@ def chunker(input_data, N): ...@@ -268,7 +268,7 @@ def chunker(input_data, N):
return output return output
``` ```
定义主要功能并使用 Brown 语料库读取输入数据。 在这种情况下,我们将读取`12000`字。 您可以随意阅读任意多个单词: 定义主函数并使用 Brown 语料库读取输入数据。 在这种情况下,我们将读取`12000`字。 您可以随意阅读任意多个单词:
```py ```py
if __name__=='__main__': if __name__=='__main__':
...@@ -696,7 +696,7 @@ if __name__=='__main__': ...@@ -696,7 +696,7 @@ if __name__=='__main__':
fileids_neg = movie_reviews.fileids('neg') fileids_neg = movie_reviews.fileids('neg')
``` ```
从电影评论中提取功能,并相应地标记它们: 从电影评论中提取特征,并相应地标记它们:
```py ```py
# Extract the features from the reviews # Extract the features from the reviews
......
...@@ -508,7 +508,7 @@ action = req.get('queryResult').get('action') ...@@ -508,7 +508,7 @@ action = req.get('queryResult').get('action')
如果要调试聊天机器人并对其进行故障排除,可以单击**诊断信息**。 在这里,我们可以查看所有 DialogFlow 请求的详细信息以及从 Webhook 发送回的响应。 如果 Webhook 中存在错误,则**诊断信息**也可以用于调试。 如果要调试聊天机器人并对其进行故障排除,可以单击**诊断信息**。 在这里,我们可以查看所有 DialogFlow 请求的详细信息以及从 Webhook 发送回的响应。 如果 Webhook 中存在错误,则**诊断信息**也可以用于调试。
本章的目的是介绍聊天机器人的基本知识。 在这一点上,我们的聊天机器人除了演示如何从服务器获取响应外,还没有做其他事情。 我们将其留给您,以探索如何进一步增强聊天机器人。 一些明显的增强功能包括:根据 e 稳定菜单检查所请求的食物,以查看菜单上是否有可用项目; 根据当前库存检查请求的食物数量,以查看是否可以完成订单; 将订单存储在后端数据库中以进行记帐和跟踪; 并将聊天机器人连接到机器人或后端系统以实际完成订单。 本章的目的是介绍聊天机器人的基本知识。 在这一点上,我们的聊天机器人除了演示如何从服务器获取响应外,还没有做其他事情。 我们将其留给您,以探索如何进一步增强聊天机器人。 一些明显的增强功能包括:根据建立的菜单检查所请求的食物,以查看菜单上是否有可用项目; 根据当前库存检查请求的食物数量,以查看是否可以完成订单; 将订单存储在后端数据库中以进行记帐和跟踪; 并将聊天机器人连接到机器人或后端系统以实际完成订单。
# 总结 # 总结
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
**人类语言**:沟通时顺序非常重要。 如果我们开始更改本书中单词的顺序,不久之后,本书将变得完全不可理解! **人类语言**:沟通时顺序非常重要。 如果我们开始更改本书中单词的顺序,不久之后,本书将变得完全不可理解!
**计算机语言**:在大多数计算机语言中,正确的输入顺序对于任何功能正常运行至关重要。 例如,在许多计算机语言中,符号“ > =“的意思是“大于或等于”,而在其他语言中,“ = >”的意思可能是赋值或产生语法错误。 **计算机语言**:在大多数计算机语言中,正确的输入顺序对于任何功能正常运行至关重要。 例如,在许多计算机语言中,符号`>=`的意思是“大于或等于”,而在其他语言中,`=>`的意思可能是赋值或产生语法错误。
时间序列数据是序列数据的子分类。 时间序列数据的一些示例如下: 时间序列数据是序列数据的子分类。 时间序列数据的一些示例如下:
......
...@@ -87,7 +87,7 @@ def frame_diff(prev_frame, cur_frame, next_frame): ...@@ -87,7 +87,7 @@ def frame_diff(prev_frame, cur_frame, next_frame):
return cv2.bitwise_and(diff_frames_1, diff_frames_2) return cv2.bitwise_and(diff_frames_1, diff_frames_2)
``` ```
定义一个功能以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它: 定义一个函数以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它:
```py ```py
# Define a function to get the current frame from the webcam # Define a function to get the current frame from the webcam
...@@ -205,7 +205,7 @@ import cv2 ...@@ -205,7 +205,7 @@ import cv2
import numpy as np import numpy as np
``` ```
定义一个功能以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它: 定义一个函数以从网络摄像头抓取当前帧。 首先从视频捕获对象中读取它:
```py ```py
# Define a function to get the current frame from the webcam # Define a function to get the current frame from the webcam
...@@ -966,7 +966,7 @@ def start_tracking(): ...@@ -966,7 +966,7 @@ def start_tracking():
cv2.circle(mask, (x, y), 6, 0, -1) cv2.circle(mask, (x, y), 6, 0, -1)
``` ```
使用内置函数以及遮罩,最大拐角,质量级别,最小距离和块大小等参数,计算要跟踪的良好功能 使用内置函数以及遮罩,最大拐角,质量级别,最小距离和块大小等参数,计算要跟踪的良好特征
```py ```py
# Compute good features to track # Compute good features to track
...@@ -1055,7 +1055,7 @@ if __name__ == '__main__': ...@@ -1055,7 +1055,7 @@ if __name__ == '__main__':
如果我们建立一个准确的模型,它将是复杂的。 因此,我们将无法实时运行它。 如果太简单,则可能不准确。 在机器学习领域中,经常会在速度和准确性之间进行权衡。 Viola-Jones 方法通过构建一组简单的分类器克服了这个问题。 然后将这些分类器级联到或健壮且准确的统一分类器中。 如果我们建立一个准确的模型,它将是复杂的。 因此,我们将无法实时运行它。 如果太简单,则可能不准确。 在机器学习领域中,经常会在速度和准确性之间进行权衡。 Viola-Jones 方法通过构建一组简单的分类器克服了这个问题。 然后将这些分类器级联到或健壮且准确的统一分类器中。
让我们看看如何使用它来执行人脸检测。 为了构建用于检测人脸的机器学习系统,我们首先需要构建特征提取器。 机器学习算法将使用这些功能来了解人脸。 这就是 Haar 特征变得相关的地方。 让我们看看如何使用它来执行人脸检测。 为了构建用于检测人脸的机器学习系统,我们首先需要构建特征提取器。 机器学习算法将使用这些特征来了解人脸。 这就是 Haar 特征变得相关的地方。
它们只是图像上补丁的简单总结和差异。 Haar 特征易于计算。 为了使其具有强大的缩放能力,我们在多种图像尺寸下执行此操作。 如果您想以教程格式了解更多信息,[可以查看以下链接](http://www.cs.ubc.ca/~lowe/425/slides/13-ViolaJones.pdf) 它们只是图像上补丁的简单总结和差异。 Haar 特征易于计算。 为了使其具有强大的缩放能力,我们在多种图像尺寸下执行此操作。 如果您想以教程格式了解更多信息,[可以查看以下链接](http://www.cs.ubc.ca/~lowe/425/slides/13-ViolaJones.pdf)
......
...@@ -56,7 +56,7 @@ $ pip3 install neurolab ...@@ -56,7 +56,7 @@ $ pip3 install neurolab
* 神经元可以互相交流 * 神经元可以互相交流
* 神经元与其他神经元在物理上是分开的 * 神经元与其他神经元在物理上是分开的
利用 Ramony Cajal 和 Sherrington,Warren McCulloch 和 Walter Pitts 在 1943 年的论文中进行的研究,《神经活动固有的逻辑思想》描述了一种结构,该结构借鉴了具有二进制阈值激活的神经元的结构。 功能类似于一阶逻辑语句。 利用 Ramony Cajal 和 Sherrington,Warren McCulloch 和 Walter Pitts 在 1943 年的论文中进行的研究,《神经活动固有的逻辑思想》描述了一种结构,该结构借鉴了神经元的结构,具有二进制阈值激活函数,类似于一阶逻辑语句。
以下是 McCulloch 和 Pitts 神经元的基本表示,也称为感知器: 以下是 McCulloch 和 Pitts 神经元的基本表示,也称为感知器:
......
...@@ -61,7 +61,7 @@ CNN 也由神经元组成,这些神经元由权重和偏差组成。 这些神 ...@@ -61,7 +61,7 @@ CNN 也由神经元组成,这些神经元由权重和偏差组成。 这些神
CNN 在处理数据时会明确考虑图像的结构。 CNN 中的神经元按 3 个维度排列-宽度,高度和深度。 当前层中的每个神经元都连接到前一层输出的一小块。 就像在输入图像上叠加`NxN`过滤器一样。 这与完全连接层形成对比,在完全连接层中,每个神经元都连接到上一层的所有神经元。 CNN 在处理数据时会明确考虑图像的结构。 CNN 中的神经元按 3 个维度排列-宽度,高度和深度。 当前层中的每个神经元都连接到前一层输出的一小块。 就像在输入图像上叠加`NxN`过滤器一样。 这与完全连接层形成对比,在完全连接层中,每个神经元都连接到上一层的所有神经元。
由于单个过滤器无法捕获图像的所有细微差别,因此我们多次执行`M`,以确保捕获所有细节。 这些`M`过滤器充当特征提取器。 如果查看这些过滤器的输出,我们可以看到它们提取了诸如边,角等特征。 对于 CNN 中的初始层来说,这是正确的。 随着我们在网络的层中的进展,我们将看到后面的层提取更高级别的功能 由于单个过滤器无法捕获图像的所有细微差别,因此我们多次执行`M`,以确保捕获所有细节。 这些`M`过滤器充当特征提取器。 如果查看这些过滤器的输出,我们可以看到它们提取了诸如边,角等特征。 对于 CNN 中的初始层来说,这是正确的。 随着我们在网络的层中的进展,我们将看到后面的层提取更高级别的特征
CNN 是深度学习网络。 它通常用于识别图像。 了解它如何识别图像将有助于您了解它们的工作原理。 像任何其他神经网络一样,它为图像中的元素分配权重和偏差,并能够将这些元素彼此区分开。 与其他分类模型相比,CNN 中使用的预处理较少。 当使用经过足够训练的原始方法过滤器时,可以训练 CNN 来区分这些过滤器和特征。 CNN 是深度学习网络。 它通常用于识别图像。 了解它如何识别图像将有助于您了解它们的工作原理。 像任何其他神经网络一样,它为图像中的元素分配权重和偏差,并能够将这些元素彼此区分开。 与其他分类模型相比,CNN 中使用的预处理较少。 当使用经过足够训练的原始方法过滤器时,可以训练 CNN 来区分这些过滤器和特征。
...@@ -101,7 +101,7 @@ CNN 通常使用以下类型的层: ...@@ -101,7 +101,7 @@ CNN 通常使用以下类型的层:
卷积层基本上计算权重和前一层输出中的一个小补丁之间的点积。 卷积层基本上计算权重和前一层输出中的一个小补丁之间的点积。
**整流线性单元层**:此层将激活函数应用于上一层的输出。 此函数通常类似于`max(0, x)`。 需要这一层来为网络增加非线性,以便可以很好地推广到任何类型的功能 **整流线性单元层**:此层将激活函数应用于上一层的输出。 此函数通常类似于`max(0, x)`。 需要这一层来为网络增加非线性,以便可以很好地推广到任何类型的函数
**合并层**:此层对上一层的输出进行采样,从而得到具有较小尺寸的结构。 池化有助于我们在网络发展过程中仅保留重要部分。 最大池化通常在池化层中使用,我们在给定的`KxK`窗口中选择最大值。 **合并层**:此层对上一层的输出进行采样,从而得到具有较小尺寸的结构。 池化有助于我们在网络发展过程中仅保留重要部分。 最大池化通常在池化层中使用,我们在给定的`KxK`窗口中选择最大值。
...@@ -111,7 +111,7 @@ CNN 通常使用以下类型的层: ...@@ -111,7 +111,7 @@ CNN 通常使用以下类型的层:
图 4:CNN 层 图 4:CNN 层
当我们从网络中的输入层到输出层时,输入图像就从像素值转换为最终的类别分数。 已经为 CNN 提出了许多不同的架构,这是一个活跃的研究领域。 模型的准确性和鲁棒性取决于许多因素-层的类型,网络的深度,网络内各种类型的层的排列,为每个层选择的功能离子,训练数据 , 等等。 当我们从网络中的输入层到输出层时,输入图像就从像素值转换为最终的类别分数。 已经为 CNN 提出了许多不同的架构,这是一个活跃的研究领域。 模型的准确性和鲁棒性取决于许多因素-层的类型,网络的深度,网络内各种类型的层的排列,为每个层选择的函数,训练数据,等等。
# 基于感知器建立线性回归器 # 基于感知器建立线性回归器
......
...@@ -25,7 +25,7 @@ RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之 ...@@ -25,7 +25,7 @@ RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之
现在让我们进入神经网络的一些基础知识。 顾名思义,*神经网络*从大脑神经元的结构中获得灵感。 神经网络中的神经元大致模拟了人类神经元的结构和功能。 对于一般的大脑,尤其是神经元,我们有很多不了解的地方。 但在基本级别上,神经元接受输入,并且如果达到阈值,它将触发输出。 用数学术语来说,*人工*神经元是数学函数的容器,其唯一的任务是通过将给定的输入应用于函数来传递输出。 现在让我们进入神经网络的一些基础知识。 顾名思义,*神经网络*从大脑神经元的结构中获得灵感。 神经网络中的神经元大致模拟了人类神经元的结构和功能。 对于一般的大脑,尤其是神经元,我们有很多不了解的地方。 但在基本级别上,神经元接受输入,并且如果达到阈值,它将触发输出。 用数学术语来说,*人工*神经元是数学函数的容器,其唯一的任务是通过将给定的输入应用于函数来传递输出。
既然我们已经了解了使神经网络*滴答作响*的原因以及使它们发火的原因,那么让我们了解一些用于触发神经网络的常用功能。 这些功能通常称为,称为*激活函数*,因为它们在达到阈值时就会激活。 您可以将任何类型的功能用作激活函数,但以下是一些用作激活函数的常用功能 既然我们已经了解了使神经网络*滴答作响*的原因以及使它们发火的原因,那么让我们了解一些用于触发神经网络的常用函数。 这些函数通常称为*激活函数*,因为它们在达到阈值时就会激活。 您可以将任何类型的函数用作激活函数,但以下是一些用作激活函数的常用函数
* 步进函数 * 步进函数
* Sigmoid 函数 * Sigmoid 函数
...@@ -36,7 +36,7 @@ RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之 ...@@ -36,7 +36,7 @@ RNN 背后的数学有时可能会令人不知所措。 在深入研究 RNN 之
## 步进函数 ## 步进函数
步进函数是简单功能。 就这么简单。 如果输出高于某个阈值,则会触发该函数。 否则就不会。 图形化: 步进函数是简单函数。 就这么简单。 如果输出高于某个阈值,则会触发该函数。 否则就不会。 图形化:
![](img/B15441_21_01.png) ![](img/B15441_21_01.png)
...@@ -56,7 +56,7 @@ Sigmoid 函数(也称为作为逻辑函数)定义如下: ...@@ -56,7 +56,7 @@ Sigmoid 函数(也称为作为逻辑函数)定义如下:
`z`(自变量)趋于负无穷大时,函数的值趋于`0`;当`z`趋于趋近时,函数的值趋于`1`到无穷远。 `z`(自变量)趋于负无穷大时,函数的值趋于`0`;当`z`趋于趋近时,函数的值趋于`1`到无穷远。
Sigmoid 函数有一个缺点。 容易出现梯度消失的问题。 从图形中可以看出,Sigmoid 函数的值在 0 到 1 之间的较小范围内。Sigmoid 函数具有陡峭的梯度。 因此,在许多情况下,输入的大变化会导致输出的小变化。 此问题称为*梯度消失*。 随着网络中层数的增加,该问题呈指数增长,因此很难扩展使用此功能的神经网络。 Sigmoid 函数有一个缺点。 容易出现梯度消失的问题。 从图形中可以看出,Sigmoid 函数的值在 0 到 1 之间的较小范围内。Sigmoid 函数具有陡峭的梯度。 因此,在许多情况下,输入的大变化会导致输出的小变化。 此问题称为*梯度消失*。 随着网络中层数的增加,该问题呈指数增长,因此很难扩展使用此函数的神经网络。
使用 Sigmoid 函数的原因之一是因为其输出始终落在 0 到 1 之间。因此,它对于需要预测输出为概率的模型很有用。 概率总是在 0 到 1 的范围内。因此,在这些情况下,Sigmoid 是要使用的适当函数。 使用 Sigmoid 函数的原因之一是因为其输出始终落在 0 到 1 之间。因此,它对于需要预测输出为概率的模型很有用。 概率总是在 0 到 1 的范围内。因此,在这些情况下,Sigmoid 是要使用的适当函数。
...@@ -70,9 +70,9 @@ Sigmoid 函数有一个缺点。 容易出现梯度消失的问题。 从图形 ...@@ -70,9 +70,9 @@ Sigmoid 函数有一个缺点。 容易出现梯度消失的问题。 从图形
图 3:Tanh 函数 图 3:Tanh 函数
之所以使用 *tanh* 函数而不是 Sigmoid 函数的主要原因是因为值以 0 为中心,所以导数更高。 较高的梯度有助于产生更好的学习率,因此可以更快地训练模型。 但是,使用 *tanh* 功能时,仍然存在梯度消失问题。 之所以使用 *tanh* 函数而不是 Sigmoid 函数的主要原因是因为值以 0 为中心,所以导数更高。 较高的梯度有助于产生更好的学习率,因此可以更快地训练模型。 但是,使用 *tanh* 函数时,仍然存在梯度消失问题。
现在,我们将了解另一个功能:ReLU 函数。 现在,我们将了解另一个函数:ReLU 函数。
## ReLU 函数 ## ReLU 函数
......
...@@ -64,7 +64,7 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报 ...@@ -64,7 +64,7 @@ RL 是指学习操作方法并将情况映射到某些动作以最大化回报
通常,RL 智能体执行以下步骤: 通常,RL 智能体执行以下步骤:
1. 有一组与智能体和环境有关的状态。 在给定的时间点,智能体会观察输入状态以感知环境。 1. 有一组与智能体和环境有关的状态。 在给定的时间点,智能体会观察输入状态以感知环境。
2. 有策略规定需要采取什么措施。 这些策略具有决策功能。 使用这些策略根据输入状态确定操作。 2. 策略规定需要采取什么措施。 这些策略充当决策函数。 使用这些策略根据输入状态确定操作。
3. 智能体根据上一步采取行动。 3. 智能体根据上一步采取行动。
4. 环境对此动作做出反应。 智能体从环境中获得强化,也称为奖励。 4. 环境对此动作做出反应。 智能体从环境中获得强化,也称为奖励。
5. 智能体计算并记录有关该奖励的信息。 重要的是要注意,将为此状态/动作对收到此奖励,以便在给定特定状态的情况下,将来可将其用于采取更多的奖励行动。 5. 智能体计算并记录有关该奖励的信息。 重要的是要注意,将为此状态/动作对收到此奖励,以便在给定特定状态的情况下,将来可将其用于采取更多的奖励行动。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册