在机器学习和人工智能的领域中,经常会遇到一些基础的库,它们是构建更高级机器学习库的基石。如果是一名企业开发者,可能会使用这些库来构建完整的解决方案,但这通常需要更长的时间并且更难维护。这些工作更多地由数据科学家、专业的人工智能/机器学习工程师以及更高级机器学习库的开发者来完成。尽管如此,了解这些底层库的工作原理仍然是一个好主意。
在本模块中,还将简要介绍scikit-learn库,因为它是Python生态系统中最完整的机器学习库(不包括深度学习)。
如果已经完成了之前的模块,那么所需要的一切都已经安装好了!
正如在模块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数组具有切片功能,允许获取一行或一列:
# 返回第一行作为一维向量
print(arr[0, :])
# 返回第一列作为一维向量
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文档以了解更多关于索引顺序的信息。
在处理高级神经网络时,在“Keras入门”中看到了Keras。TensorFlow的核心是一个用于张量计算的库。
张量是向量和多维矩阵的泛化:
等等。
张量可以包含任何类型的数据:整数、浮点数、字符串等。尽管在使用像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)
# 一个NumPy数组
操作不会立即执行。只有在创建并运行会话时,结果才会被计算。在会话创建之前,上述代码构建了一个操作图,然后进行评估。
scikit-learn是一个广泛的库,提供了许多传统的机器学习方法(非常粗略地说:除了机器学习之外的一切)。可以在Jupyter Notebook单元格中使用pip安装它:
!pip install scikit-learn