当我们为机器学习表示数据时,这通常需要以数值形式进行。特别是在神经网络数据表示方面,这通过被称为张量的数据存储库来实现。
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT 需求
那么张量的意义是什么呢?张量是一个可以容纳多维数据的容器。张量经常被错误地与矩阵(具体来说是二维张量)混用,实际上张量是矩阵在N维空间中的推广。
从数学上讲,张量不仅仅是一个数据容器。除了保存数值数据,张量还包括对张量之间有效线性变换的描述。这些变换或关系的示例包括 叉积 和 点积。从计算机科学的角度来看,将张量视为面向对象的对象可能会更有帮助,而不仅仅是一个数据结构。
虽然上述内容都是正确的,但张量的技术定义和我们在机器学习实践中所称的张量之间存在细微差别。如果我们暂时将张量简单地看作数据结构,下面是张量与标量、向量和矩阵的关系概述,以及一些简单的代码演示如何使用 Numpy 创建这些数据类型。我们将在后续帖子中讨论一些张量变换。
一个单一的数字就是标量。标量是一个 0 维(0D)张量。因此,它具有 0 个轴,且秩为 0(张量术语中的“轴数”)。
这就是细微之处:虽然一个单一的数字可以表示为张量,但这并不意味着它应该这样做,或通常如此。能够将它们视为张量是有充分理由的(这将在我们讨论张量操作时变得明显),但作为存储机制,这种能力可能会让人困惑。
Numpy 的多维数组 ndarray
用于创建讨论中的示例结构。请记住,多维数组的 ndim
属性返回数组的维度数。
import numpy as np
x = np.array(42)
print(x)
print('A scalar is of rank %d' %(x.ndim))
42
A scalar is of rank 0
向量是一个单维(1D)张量,在计算机科学中通常被称为数组。一个向量由一系列数字组成,具有 1 个轴,秩为 1。
x = np.array([1, 1, 2, 3, 5, 8])
print(x)
print('A vector is of rank %d' %(x.ndim))
[1 1 2 3 5 8]
A vector is of rank 1
矩阵是秩为 2 的张量,意味着它有 2 个轴。你从各种地方都很熟悉这些,特别是你用来整理数据集并输入到你的 Scikit-learn 机器学习模型中的数据 :) 矩阵被安排为数字网格(想象一下行和列),技术上是一个二维(2D)张量。
x = np.array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
print(x)
print('A matrix is of rank %d' %(x.ndim))
[[1 4 7]
[2 5 8]
[3 6 9]]
A matrix is of rank 2
虽然从技术上讲,上述所有结构都是有效的张量,但在口语中,当我们谈论张量时,通常指的是矩阵概念的 N ≥ 3 维度的推广。为了避免混淆,我们通常只将 3 维或更高维的张量称为张量(通常将标量 '42' 称为张量既不有益也不清晰)。
下面的代码创建了一个 3D 张量。如果我们将一系列这些张量打包到一个更高阶的张量容器中,它将被称为 4D 张量;如果将这些打包到更高的阶数,即 5D 张量,以此类推。
x = np.array([[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]],
[[10, 40, 70],
[20, 50, 80],
[30, 60, 90]],
[[100, 400, 700],
[200, 500, 800],
[300, 600, 900]]])
print(x)
print('This tensor is of rank %d' %(x.ndim))
[[[ 1 4 7]
[ 2 5 8]
[ 3 6 9]]
[[ 10 40 70]
[ 20 50 80]
[ 30 60 90]]
[[100 400 700]
[200 500 800]
[300 600 900]]]
This tensor is of rank 3
你如何使用张量是你的事,不过理解张量是什么及其与相关数值容器结构的关系现在应该清晰了。
Matthew Mayo (@mattmayo13) 是一位数据科学家,同时也是 KDnuggets 的总编辑,KDnuggets 是开创性的在线数据科学和机器学习资源。他的兴趣包括自然语言处理、算法设计与优化、无监督学习、神经网络以及自动化机器学习方法。Matthew 拥有计算机科学硕士学位和数据挖掘研究生文凭。他可以通过 editor1 at kdnuggets[dot]com 联系。