在机器学习、深度学习中,首先遇到的就是数据,如果按类别来划分,我们通常会遇到以下几种类型的数据。
一个标量就是一个单独的数,一般用小写的变量名称表示,如a、x等。
向量就是一列数或一个一维数组,这些数是有序排列的。通过次序中的索引,我们可以确定向量中每个单独的数。通常我们赋予向量粗体的小写变量名称,如x、y等。一个向量一般有很多元素,这些元素如何表示?我们一般通过带脚标的斜体表示,如x 1 表示向量x中的第一个元素,x 2 表示第二元素,依次类推。
当需要明确表示向量中的元素时,我们一般将元素排列成一个方括号包围的纵列:
我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
向量可以这样表示,那我们如何用编程语言(如Python)来实现呢?如何表示一个向量?如何获取向量中每个元素呢?请看如下实例:
import numpy as np a=np.array([1,2,4,3,8]) print(a.size) print(a[0],a[1],a[2],a[-1])
打印结果如下:
5 1 2 4 8
这说明向量元素个数为5,向量中索引一般从0开始,如a[0]表示第一个元素1,a[1]表示第二个元素2,a[2]表示第三个元素4,依次类推。这是从左到右的排列顺序,如果从右到左,我们可用负数来表示,如a[-1]表示第1个元素(注:从右到左),a[-2]表示第2个元素,依次类推。
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。如果一个实数矩阵高度为m,宽度为n,那么我们说A∈R m×n 。
与向量类似,可以通过给定行和列的下标表示矩阵中的单个元素,下标用逗号分隔,如A 1,1 表示A左上的元素,A 1,2 表示第一行第二列对应的元素,依次类推。如果我们想表示1列或1行,该如何表示呢?我们可以引入冒号":"来表示,如第1行,可用A1,:表示,第2行用A2,:表示,第1列用A:,1表示,第n列用A:,n表示。
如何用Python来表示或创建矩阵呢?如果希望获取其中某个元素,该如何实现呢?请看如下实例:
import numpy as np A=np.array([[1,2,3],[4,5,6]]) print(A) print(A.size) #显示矩阵元素总个数 print(A.shape) #显示矩阵现状,即行行和列数 print(A[0,0],A[0,1],A[1,1]) print(A[1,:]) #打印矩阵第2行
打印结果:
[[1 2 3] [4 5 6]] 6 (2, 3) 1 2 5 [4 5 6]
矩阵可以用嵌套向量生成,和向量一样,在NumPy中,矩阵元素的下标索引也是从0开始的。
几何代数中定义的张量是向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,向量视为一阶张量,那么矩阵就是二阶张量,三阶就称为三阶张量,以此类推。在机器学习、深度学习中经常遇到多维矩阵,如一张彩色图片就是一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。
张量(tensor)也是深度学习框架TensorFlow的重要概念。TensorFlow由tensor(张量)+flow(流)构成。
同样我们可以用Python来生成张量及获取其中某个元素或部分元素,请看实例:
B=np.arange(16).reshape((2, 2, 4)) #生成一个3阶矩阵 print(B) print(B.size) #显示矩阵元素总数 print(B.shape) #显示矩阵的维度 print(B[0,0,0],B[0,0,1],B[0,1,1]) print(B[0,1,:])
打印结果如下:
[[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]] 16 (2, 2, 4) 0 1 5 [4 5 6 7]
转置以主对角线(左上到右下)为轴进行镜像操作,通俗一点来说就是行列互换。将矩阵A转置表示为A T ,定义如下:
如:
向量可以看作只有一列的矩阵,把(3.1)式中向量x进行转置,得到下式。
用NumPy如何实现张量的转置呢?很简单,利用张量的T属性即可,示例如下:
C=np.array([[1,2,3],[4,5,6]]) D=C.T #利用张量的T属性(即转置属性) print(C) print(D)
打印结果如下:
[[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]]