人工智能和机器学习系列(八) NumPy、TensorFlow 和 scikit-learn

2021-08-25 10:52:32 浏览数 (3403)

本篇文章是我们学习Python及其在机器学习(ML)和人工智能(AI)的应用系列中的最后一个模块了,在上一个模块中,我们学习Keras,讨论了神经网络。下面,我们将要学习 Numpy 和 TensorFlow,这两个是学习机器学习的构建块,所以在使用机器学习的时候,你一定会接触到它们。同时,还会简要概述 scikit-learn 库,因为它是Python中最完整的机器学习(不包括深度学习)库。

安装

如果你看了本系列文章的前几个模块,那么本文章将要介绍到的库就已经安装好了。如果你还没安装,可以看看前面几篇的文章。

NumPy

正如模块 4中所述,NumPy 的核心是其 N 维数组,它还提供线性代数和傅立叶变换等功能。NumPy 数组是机器学习库函数中非常常见的输入值。因此,当你拥有一种特定格式的数据集并且必须将其转换为另一种格式时,你往往可以直接使用 NumPy。或者你可以使用 NumPy 作为库函数调用的结果。

只要维度有意义,NumPy 数组就可以直接从嵌套列表、嵌套元组或它们的组合中创建,维度数量不限。

import numpy as np
arr = np.array([ [1, 2, 3], (4, 5, 6) ])
print(arr[0, 1])

在这里,我们把numpy命名为np将它导入。

此外,(0, 1)是用作索引的元组。

NumPy 数组具有切片,可让你获取一行或一列:

# returns the first row as a one-dimensional vector
print(arr[0, :])
# returns the first column as a one-dimensional vector 
print(arr[:, 0])

相同的语法也适用于更多维度(尽管在这里很难称为“行”和“列”):

arr = np.array([ [ [1, 2, 3], [4, 5, 6] ], 
                 [ [7, 8, 9], [10, 11, 12] ] ])
print(arr[:, :, 0]) # [[ 1,  4], [ 7, 10]]
print(arr[1, :, 0]) # [ 7, 10]

NumPy 的索引和切片比这更强大。查看参考资料以获得更完整的概述。

NumPy 数组可以使用hstackand水平或垂直堆叠(如果维度正确)vstack,两者都将数组元组作为参数(正确获得括号的数量!):

arr1 = np.array([ [ 1, 1 ], [ 1, 1 ]])
arr2 = np.array([ [ 2, 2 ], [2, 2]])
print(np.hstack((arr1, arr2)))
print(np.vstack((arr1, arr2)))

reshape​ 是 NumPy 中的一个强大的方法。顾名思义,它改变了数组的形状。以下就是一个例子:

vector = np.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
matrix = vector.reshape((3, 3))

reshape的参数是新的形状,一个所需维度的元组。这是一个相当简单的示例,但你也可以使用它来重新调整具有更多维度的数组。元素以特定索引顺序从原始数组中读取,并以相同索引顺序写入新数组。请参阅 reshape 文档 以了解有关索引顺序的更多信息。

TensorFlow

为了在高层次上使用神经网络,我们在 Keras简介中研究了 Keras。从本质上讲,TensorFlow 是一个用于张量计算的库。

张量是向量和多维矩阵的推广:

  • 0-张量是标量
  • 1-张量是一个向量
  • 2-张量是一个矩阵
  • 一个 3-Tensor 是...只是一个 3-Tensor。

等等。

张量可以保存任何类型的数据:整数、浮点数、字符串等等。尽管在使用 Keras 等高级库时通常不会遇到这些,但查看它们仍然很有趣,因为它们是 TensorFlow 的基础构建块。

那么,NumPy 数组和张量之间有什么区别?两个对象或多或少代表相同的数据,但张量是不可变的。

TensorFlow 可以对张量执行各种操作。这是一个示例,它以三个矩阵开始,对前两个矩阵执行矩阵乘法,然后将第三个矩阵相加,然后将结果求反。

import tensorflow as tf
a = tf.constant([ [ 0.6, 0.1 ], [ 0.4, -0.3 ] ])
b = tf.constant([ [ 1.2, 0.7 ], [ 0.9, 1.1 ] ])
c = tf.constant([ [ -0.1, 0.2 ], [ 0.3, 0.1 ] ])

d = tf.matmul(a, b)
e = tf.add(c, d)
f = tf.linalg.inv(e)

sess = tf.Session()
result = sess.run(f) # a NumPy array

操作不会立即执行。结果仅在创建并运行会话时计算。在会话创建之前,上述代码构建了一个操作图,然后对其进行评估。

scikit-学习

scikit-learn 是一个广泛的库,提供了许多传统的机器学习方法(非常粗略地说:除了机器学习之外的一切)。您可以在 Jupyter Notebook 单元中使用 pip 安装它:

Python复制代码

!pip install scikit-learn

考虑到库的广度,我们不会专注于一个特定的代码示例,而是概述您可以从这个库中获得什么。scikit-learn 提供有监督和无监督的学习方法。监督意味着您对训练集中的每个输入都有预期的输出;无监督意味着你没有,你会让算法得出自己的结论。其监督学习的主要特征是分类(识别类别)和回归(预测连续值),通过支持向量机、随机森林/决策树、最近邻、朴素贝叶斯等算法进行。无监督学习主要侧重于聚类(基于特征的自动分组),使用k-means和mean-shift等算法。除了学习功能本身,scikit-learn 提供了验证、评估和比较模型和工具以预处理输入数据的方法。这里遗漏了很多,所以我邀请你看看他们的完整概述的用户指南

结论

在本次相关Python在机器学习和人工智能的学习系列模块中,我们几乎没有接触Numpy、TensorFlow 和 scikit-learn的基础,但相信大家通过文章能够大概了解它们可以做什么,以及为什么它们在机器学习生态系统中非常的重要。随着本篇文章的结束,此次模块学习系列的就到此结束了,相信各位也基本掌握了在Python中利用各种AI/ML相关库的基础知识。感谢各位的阅读!