NumPy、TensorFlow 和 scikit-learn 入门






4.60/5 (9投票s)
在本文中,我们将快速了解 NumPy 和 TensorFlow,并对 scikit-learn 库进行简短的概述。
这是我们关于 Python 及其在机器学习和人工智能中应用的系列文章中的第八个也是最后一个模块。在上一篇中,我们讨论了使用 Keras 进行神经网络。现在我们将快速了解 NumPy 和 TensorFlow。因为它们是机器学习库的构建块,所以你迟早会遇到它们。如果你是企业级开发人员,你不会仅仅使用这些库来编写完整的解决方案(这需要更长的时间并且更难维护)。这更多是为数据科学家、专门的 AI/ML 工程师以及更高级 ML 库的开发人员准备的。尽管如此,了解底层库是个好主意,看看它们是关于什么的。
在本模块中,我还会简要概述 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])
在这里,我们使用更简洁的 `np` 别名导入 `numpy`,这是一种可接受且非常常见的做法。
此外,`(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 数组可以水平或垂直堆叠(如果维度正确),使用 `hstack` 和 `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)))
NumPy 的一个强大方法是 `reshape`。顾名思义,它会改变数组的形状。下面是一个 `reshape` 示例
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-张量是……只是一个 3-张量。
依此类推。
张量可以包含任何类型的数据:整数、浮点数、字符串等。虽然在使用 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-learn
scikit-learn 是一个广泛的库,提供了许多传统的机器学习方法(粗略地说:除了深度学习之外的所有机器学习)。你可以在 Jupyter Notebook 单元格中使用 pip 安装它
!pip install scikit-learn
考虑到该库的广泛性,我们不会专注于一个特定的代码示例,而是概述你可以从该库中期待的内容。scikit-learn 提供了监督和无监督学习方法。监督学习意味着你的训练集中每个输入都有一个预期的输出;无监督学习意味着你没有,并且将让算法得出自己的结论。其监督学习的主要功能是分类(识别类别)和回归(预测连续值),通过支持向量机、随机森林/决策树、最近邻、朴素贝叶斯等算法实现。无监督学习主要关注聚类(基于特征的自动分组),使用 k-means 和 mean-shift 等算法。除了学习功能本身,scikit-learn 还提供了验证、评估和比较模型的方法以及预处理输入数据的工具。这里省略了很多内容,所以我邀请你查看其用户指南以获得完整的概述。
结论
我们才刚刚触及 NumPy、TensorFlow 和 scikit-learn 的表面,但现在你对它们的功能以及它们在 Python 的机器学习生态系统中的重要性有了一个初步的了解。随着本模块的结束,我们也完成了整个系列的冲刺。你现在已经掌握了利用 Python 中各种 AI/ML 相关库的基本知识。感谢阅读!