线性代数

机器学习、深度学习的基础除了编程语言外,还有一个就是应用数学。它一般包括线性代数、概率与信息论、概率图、数值计算与最优化等。其中线性代数又是基础的基础。线性代数是数学的一个重要分支,广泛应用于科学和工程领域。大数据、人工智能的源数据在模型训练前,都需要转换为向量或矩阵,而这些运算正是线性代数的主要内容。
如在深度学习的图像处理中,如果1张图由28*28像素点构成,那这28*28就是一个矩阵。在深度学习的神经网络中,权重一般都是矩阵,我们经常把权重矩阵W与输入X相乘,输入X一般是向量,这就涉及矩阵与向量相乘的问题。诸如此类,向量或矩阵之间的运算在深度学习中非常普遍,也非常重要。
本章主要介绍如下内容:
- 自动求解线性方程组
- 标量、向量、矩阵和张量
- 矩阵和向量运算
- 特殊矩阵与向量
- 特征值分解
- 奇异值分解
- 迹运算
- 实例

第1章 线性代数基础

1.1自动求解线性方程组

假设有如下线性方程组:
\begin{cases} x+y+z=6 \\ 2y+5z=-4 \\ 2x+5y-z=27 \end{cases}\tag{2.1}
这个线性方程组,如果用高中知识,手工很快能求得结果。如何用Python实现该方程组的自动求解呢?要实现Python求解,先要解决哪些问题?
要用Python处理这个问题,首先,需要用Python的方式表示这个方程组。
用矩阵、向量的方式表示这个线性方程组,如图2-1所示:
图2-1 用矩阵表示方程组
要使用Python实现式(2.1)的求解,首先需要把式(2.1)用矩阵和向量的方式表示,然后利用相关线性代数相关知识进行求解。具体步骤如下:
1)用矩阵、向量表示式(2.1)或图2-1中关系。
假设系数矩阵为A,变量构成的向量为X,右边的值构成的向量为B,则他们之间的关系,可用下式表示:
AX=B (2.2)
其中A与X是点积(dot)的关系。
2)用NumPy表示矩阵、向量。

3) 因行列式|A|≠0(可计算:np.linalg.det(A) ≠0),由此可知,矩阵A可逆,
即存在A的可逆矩阵A^{-1} ,使得A^{-1}A=E (单位矩阵),对式(2.2)两边同时乘以矩阵A^{-1} ,可得:
A^{-1}AX=A^{-1}B
EX=A^{-1}B
由此可得:X=A^{-1}B
4)求线性方程组的解
A的逆矩阵(用A1表示)可表示为:

所以

可得线性方程组的解为:
array([ 5., 3., -2.])

1.2标量、向量、矩阵和张量

在机器学习、深度学习中,首先遇到的就是数据,如果按类别来划分,我们通常会遇到以下4种类型的数据。

1.2.1 标量(scalar)

一个标量就是一个单独的数,一般用小写的变量名称表示,如a,x等。

1.2.2 向量(vector)

向量就是一列数或一个一维数组,这些数是有序排列的。通过次序中的索引,我们可以确定向量中每个单独的数。通常我们赋予向量粗体的小写变量名称,如x、y等。一个向量一般有很多元素,这些元素如何表示?我们一般通过带脚标的斜体表示,如x_1 表示向量x中的第一个元素,x_2 表示第二元素,依次类推。向量元素的个数称为向量的维数。
当需要明确表示向量中的元素时,我们一般将元素排列成一个方括号包围的一行,如下式:
X=[ x_1,x_2,\ldots,x_n] \tag {2.3}
X称为行向量。
X也可表示为列向量:
\left[\begin{matrix} x_1\cr x_2 \cr\vdots \cr x_n\end{matrix}\right]\tag{2.4}
我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。
向量可以这样表示,那我们如何用编程语言如python来实现呢?如何表示一个向量?如何获取向量中每个元素呢?请看如下实例:

打印结果如下:
5
1 2 4 8

这说明向量元素个数为5,向量中索引一般从0开始,如a[0]表示第一个元素1,a[1]
表示第二个元素2,a[2]表示第三个元素4,依次类推。这是从左到右的排列顺序,如果从右到左,我们可用负数来表示,如a[-1]表示第1个元素(注:从右到左),a[-2]表示第2个元素,依次类推。

1.2.3 矩阵(matrix)

矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。如果一个实数矩阵高度为m,宽度为n,那么我们说 A\in R^{m\times n}
与向量类似,可以通过给定行和列的下标表示矩阵中元素,下标用逗号分隔,如A_{1,1}表示A左上的元素,A_{1,2}表示第一行第二列对应的元素,依次类推;这是表示单个元素,如果我们想表示1列或1行,该如何表示呢?我们可以引入冒号":"来表示,如第1行,可用A1,:表示,第2行,用A2,:表示,第1列用A:,1表示,第n列用A:,n表示。
如何用Python来表示或创建矩阵呢?如果希望获取其中某个元素,该如何实现呢?请看如下实例:

打印结果:
[[1 2 3]
[4 5 6]]
6
(2, 3)
1 2 5
[4 5 6]

矩阵可以用嵌套向量生成,和向量一样,在Numpy中,矩阵元素的下标索引也是从0开始的。

1.2.4张量(tensor)

几何代数中定义的张量是向量和矩阵的推广或更通用的称呼,我们可以将标量视为零阶张量,向量视为一阶张量,那么矩阵就是二阶张量,三阶的就称为三阶张量,以此类推。在机器学习、深度学习中经常遇到多维矩阵,如一张彩色图片就是一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。
张量(tensor)也是深度学习框架TensorFlow、PyTorch的重要概念。TensorFlow由tensor(张量)+flow(流)构成。
同样我们可以用Python来生成张量及获取其中某个元素或部分元素,请看实例:

打印结果如下:
[[[ 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]