Skip to main content

线代基础知识

标量、向量、矩阵、张量

理论知识

  1. 标量 (Scalar): 表示一个单独的数,通常用斜体小写字母表示,如 sR,nNs \in \mathbb{R}, n \in \mathbb{N}
  2. 向量 (Vector): 表示一列数,这些数有序排列的,可以通过下标获取对应值,通常用粗体小写字母表示: xRn\boldsymbol{x} \in \mathbb{R}_n ,它表示元素取实数,且有 n个元素,第一个元素表示为:x1 。将向量写成列向量的形式:
    x=[x1x2xn]\boldsymbol{x}=\left[\begin{array}{l} x_{1} \\ x_{2} \\ \cdots \\ x_{n} \end{array}\right]

有时需要向量的子集,例如第1,3,6个元素,那么我们可以令集合S={1,3,6}S = \{1,3,6\} , 然后 xsx_s 来表示这个集合,另外我们用符号 - 来表示集合的补集:x1x_{-1} 表示除 x1 外 x 中的所有元素,xSx_{-S}表示除 x1, x3, x6 外 x 中的所有元素。 3. 矩阵 (Matrix): 表示一个二维数组, 每个元素的下标由两个数字确定,通常用大写粗体字母表示:ARm×n\boldsymbol{A} \in \mathbb{R}^{m \times n} ,它表示元素取实数的 m 行 n 列矩阵,其元素可以表示为:A1,1\boldsymbol{A}_{1,1}, Am,n\boldsymbol{A}_{m,n}。我们用 : 表示矩阵的一行或者一列 Ai,:\boldsymbol{A}_{i,:} 为第 i 行,A:,j\boldsymbol{A}_{:,j} 为第 j 列。 4. 张量 (Tensor): 超过二维的数组,我们用 A\boldsymbol{A} 表示张量,Ai,j,k\boldsymbol{A}_{i,j,k} 表示其元素(三维张量情况下)。

tip

张量和矩阵的区别?

从代数的角度出发,向量可以看做一维的表格,矩阵是二维的表格,那么n阶的张量就是一个n维的表格。

代码示例

import numpy as np

# 标量
s = 5
# 向量
v = np.array([1,2]) # 矩阵, 2维的

m = np.array([[1,2], [3,4]]) # 张量,大于二维的
t = np.array([

[[1,2,3],[4,5,6],[7,8,9]],
[[11,12,13],[14,15,16],[17,18,19]],
[[21,22,23],[24,25,26],[27,28,29]],
])

print("标量: " + str(s))
print("向量: " + str(v))
print("矩阵: " + str(m))
print("张量: " + str(t))

Out:

矩阵转置

矩阵转置 (Transpose) 相当于沿着对角线翻转,定义如下:

Ai,j=Ai,jA_{i, j}^{\top}=A_{i, j}

矩阵转置的转置等于矩阵本身:

(A)=A\left(\boldsymbol{A}^{\top}\right)^{\top}=\boldsymbol{A}

转置将矩阵的形状从 m×n 变成了 n×m 。

向量可以看成是只有一列的矩阵,为了方便,我们可以使用行向量加转置的操作,如: x=[x1,x2,x3]Tx = [x1, x2, x3]^T

标量也可以看成是一行一列的矩阵,其转置等于它自身: aT=aa^T = a

In [3]: import numpy as np                                                      
In [4]: A = np.array([[1.0,2.0],[1.0,0.0],[2.0,3.0]])
In [5]: A_t = A.transpose()
In [6]: print("A:", A)
A: [[1. 2.]
[1. 0.]
[2. 3.]]
In [7]: print("A 的转置:", A_t)
A 的转置: [[1. 1. 2.]
[2. 0. 3.]]

矩阵加法

加法即对应元素相加,要求两个矩阵的形状一样:

C=A+B,Ci,j=Ai,j+Bi,j\boldsymbol{C}=\boldsymbol{A}+\boldsymbol{B}, C_{i, j}=A_{i, j}+B_{i, j}

数乘即一个标量与矩阵每个元素相乘:

D=aB+c,Di,j=aBi,j+c\boldsymbol{D}=a \cdot \boldsymbol{B}+c, D_{i, j}=a \cdot B_{i, j}+c

有时我们允许矩阵和向量相加的,得到一个矩阵,把 b 加到了 A 的每一行上,本质上是构造了一个将 b 按行复制的一个新矩阵,这种机制叫做广播 (Broadcasting):

C=A+b,Ci,j=Ai,j+bj\boldsymbol{C}=\boldsymbol{A}+\boldsymbol{b}, C_{i, j}=A_{i, j}+b_{j}

矩阵乘法

两个矩阵相乘得到第三个矩阵,我们需要 A 的形状为 m × n,B 的形状为 n × p,得到的矩阵为 C 的形状为 m × p:

C=ABC=A B

具体定义为:

Ci,j=kAi,kBk,jC_{i, j}=\sum_{k} A_{i, k} B_{k, j}

注意矩阵乘法不是元素对应相乘,元素对应相乘又叫 Hadamard 乘积,记作 A ⊙ B。

向量可以看作是列为 1 的矩阵,两个相同维数的向量 x 和 y 的点乘(Dot Product)或者内积,可以表示为xTyx^Ty

我们也可以把矩阵乘法理解为:Ci,jC_{i,j} 表示 A\boldsymbol{A} 的第 i 行与 B 的第 j 列的点积。

单位矩阵

为了引入矩阵的逆,我们需要先定义单位矩阵 (Identity Matrix):单位矩阵乘以任意一个向量等于这个向量本身。记 In 为保持 n 维向量不变的 单位矩阵,即:

InRn×n,xRn,Inx=x\boldsymbol{I}_{n} \in \mathbb{R}^{n \times n}, \forall \boldsymbol{x} \in \mathbb{R}^{n}, \boldsymbol{I}_{n} \boldsymbol{x}=\boldsymbol{x}

单位矩阵的结构十分简单,所有的对角元素都为 1 ,其他元素都为 0,如:

I3=[100010001]\boldsymbol{I}_{3}=\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right]
In [8]: np.identity(3)                                                            
Out[8]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
tip

如何笔算矩阵乘法?

矩阵的逆

矩阵 A 的逆 (Inversion) 记作 A1A^{-1},定义为一个矩阵使得:

A1A=In\boldsymbol{A}^{-1} \boldsymbol{A}=\boldsymbol{I}_{n}

如果 A1A^{-1} 存在,那么线性方程组 Ax = b 的解为:

A1Ax=Inx=x=A1b\boldsymbol{A}^{-1} \boldsymbol{A} \boldsymbol{x}=\boldsymbol{I}_{n} \boldsymbol{x}=\boldsymbol{x}=\boldsymbol{A}^{-1} \boldsymbol{b}
In [10]: A = [[1.0,2.0],[3.0,4.0]]                                                
In [11]: A_inv = np.linalg.inv(A)
In [12]: print("A 的逆矩阵", A_inv)
A 的逆矩阵 [[-2. 1. ]
[ 1.5 -0.5]]
tip

如何计算矩阵的逆元?

范数

:::tip 你可以简单地将范数理解为矩阵的“模长” ::: 通常我们用范数 (norm) 来衡量向量,向量的 Lp 范数定义为:

xp=(ixip)1p,pR,p1\|\boldsymbol{x}\|_{p}=\left(\sum_{i}\left|x_{i}\right|^{p}\right)^{\frac{1}{p}}, p \in \mathbb{R}, p \geq 1

L2L^{2} 范数, 也称欧几里得范数 (Euclidean norm), 是向量 x\boldsymbol{x} 到原点的欧几里得距离。有时也用 L2L^{2} 范数的平方来衡量向量: xx\boldsymbol{x}^{\top} \boldsymbol{x} 。事实上, 平方 L2L^{2} 范数在计算上更为便利, 例如它的对 x\boldsymbol{x} 梯度的各个分量只依赖于 x\boldsymbol{x} 的对应的各个分量, 而 L2L^{2} 范数对 x\boldsymbol{x} 梯度的各个分量要依赖于整个 x\boldsymbol{x} 向量。

L1L^{1} 范数: L2L^{2} 范数并不一定适用于所有的情况, 它在原点附近的增长就十分缓慢, 因此不适用于需要区别 0 和非常小但是非 0 值的情况L1L^{1} 范数 就是一个比较好的选择, 它在所有方向上的增长速率都是一样的, 定义为:

x1=ixi\|\boldsymbol{x}\|_{1}=\sum_{i}\left|x_{i}\right|

经常使用在需要区分 0 和非 0 元素的情形中

L0L^{0} 范数:如果需要衡量向量中非 0 元素的个数, 但它并不是一个范数 (不满足三角不等式和数乘), 此时 L1L^{1} 范数可以作为它的一个替代。

LL^{\infty} 范数:它在数学上是向量元素绝对值的最大值, 因此也被叫做 (Max norm):

x=maxixi\|\boldsymbol{x}\|_{\infty}=\max _{i}\left|x_{i}\right|

有时我们想衡量一个矩阵, 机器学习中通常使用的是 F\mathrm{F} 范数 (Frobenius norm), 其定义为:

AF=i,jAi,j2\|\boldsymbol{A}\|_{F}=\sqrt{\sum_{i, j} A_{i, j}^{2}}
tip

F范数实际上就是衡量这个矩阵和对应的零矩阵的距离,就像二维平面上的一个点,和原点的距离就是它的F范数

a = np.array([1,2,3,4])
# 二范数
np.linalg.norm(a,ord=2)
# 一范数
np.linalg.norm(a,ord=1)
# 无穷范数
np.linalg.norm(a,ord=np.inf)
# F范数
np.linalg.norm(a,ord="fro")
tip

说出常用的矩阵范数,并说出它们的区别

常用的矩阵范数有L0范数、L1范数和F范数。

L0范数可以计算矩阵中的非零元素的个数,L0范数越小0元素越多,也就是越稀疏。

L1范数表示矩阵中每个元素绝对值之和,它是L0范数的最优凸近似,它也可以表示稀疏

F范数是各个元素之和再开平方根,它通常也叫做矩阵的L2范数,也是机器学习中最长使用的范数,因为它是一个凸函数,可以求导求解,易于计算

特征值分解

如果一个 n×nn \times n 方阵注意只能是方阵A\boldsymbol{A}nn线性无关单位特征向量 {v(1),,v(n)}\left\{\boldsymbol{v}^{(1)}, \ldots, \boldsymbol{v}^{(n)}\right\}, 以及对应的特征值 λ1,,λn\lambda_{1}, \ldots, \lambda_{n} 。将这些特征向量按列拼接成一个矩阵: V=[v(1),,v(n)]\boldsymbol{V}=\left[\boldsymbol{v}^{(1)}, \ldots, \boldsymbol{v}^{(n)}\right], 并将对应的特征值拼接成一个向量: λ=[λ1,,λn]\boldsymbol{\lambda}=\left[\lambda_{1}, \ldots, \lambda_{n}\right]

A\boldsymbol{A} 的特征值分解 (Eigendecomposition) 为:

A=Vdiag(λ)V1\boldsymbol{A}=\boldsymbol{V} \operatorname{diag}(\boldsymbol{\lambda}) \boldsymbol{V}^{-1}

使用代码对矩阵进行特征值分解非常的简单:

A = np.array([[1.0,2.0,3.0],
[4.0,5.0,6.0],
[7.0,8.0,9.0]])
# 计算特征值
np.linalg.eigvals(A)
# 计算特征值的特征向量
eigvals, eigvectors = np.linalg.eig(A)
print("特征值:", eigvals)
print("特征向量:", eigvectors)

奇异值分解

tip

特征分解只能对方阵进行处理,奇异值分解则可以对任意矩阵进行分解

奇异值分解 (Singular Value Decomposition, SVD) 提供了另一种分解矩阵的方式, 将其分解为奇异向量和奇异值。

与特征值分解相比, 奇异值分解更加通用, 所有的实矩阵都可以进行奇异值分解, 而特征值分解只对某些方阵可以。 奇异值分解的形式为:

A=UΣV\boldsymbol{A}=\boldsymbol{U} \boldsymbol{\Sigma} \boldsymbol{V}^{\top}

A\boldsymbol{A}m×nm \times n 的, 那么 U\boldsymbol{U}m×mm \times m 的, 其列向量称为左奇异向量, 而 V\boldsymbol{V}n×nn \times n 的, 其列向量称为右奇异向量, 而 Σ\boldsymbol{\Sigma}m×nm \times n 的一个对角矩阵, 其对角元素称为矩阵 A\boldsymbol{A} 的奇异值。

事实上, 左奇异向量是 AA\boldsymbol{A} \boldsymbol{A}^{\top} 的特征向量, 而右奇异向量是 AA\boldsymbol{A}^{\top} \boldsymbol{A} 的特征向量, 非 0 奇异值的平方是 AA\boldsymbol{A}^{\top} \boldsymbol{A} 的非 0 特征值。

一些面试问题

1、矩阵的秩,满秩代表什么?不满秩呢?★

矩阵的秩就是线性无关行的最大数量,满秩代表着该矩阵可以经过初等变换转换为单位矩阵,不满秩则不行,但是可以通过变换将矩阵的秩数行转换为全0

2、什么是线性相关?什么是线性无关?★

以二维矩阵进行说明,线性相关的意思是矩阵中某一个行或列可以用其他列经过变换后表示。也就是说这个行或列在经过初等变换之后可以被消为零。线性无关的改变与线性相关相反,该行/列再经过初等变换之后不能被消为0.

3、什么是向量空间?线性空间?

向量空间是指多个向量乘以一个标量之后相加组成的集合

线性空间是一个装着很多向量的集合,特点是任意取一个向量来伸缩,或者任意取两个向量来求和,结果得到的新的向量一定还是在这个空间里面的 · 4、什么是向量的基?

单位长度为1,方向与向量相同的向量,乘以一个标量可以变换为这个向量

5、什么是向量正交?什么是矩阵正交?

如果两个向量是垂直的,夹角为0,那就将称这两个向量正交, 或者或两个向量的乘积为0就说明这两个向量正交

两个矩阵的乘积为1就说明这两个矩阵是正交的

6、什么相似矩阵?什么是正定矩阵?★

将一个向量根据不同的基进行线性映射得到的两个矩阵是相似矩阵,从数学定义的角度上来说,对于两个矩阵A和B,如果存在一个可逆矩阵PP使得B=P1APB = P^{-1}AP, 则说明这两个矩阵是相似的

给定一个大小为 n×nn \times n 的对称矩阵 AA, 若对于任意长度为 nn 的非零向量 x\boldsymbol{x}, 有 xTAx>0\boldsymbol{x}^{T} A \boldsymbol{x}>0 恒成立, 则矩阵 AA 是一个正定矩阵。

7、矩阵范数(一阶二阶范数)★

常见的矩阵范数有1范数和2范数,1范数是列向量绝对值之和的最大值。2范数为A的转置和A相乘得到的矩阵的最大特征值开方。2范数也叫做谱范数。

8、矩阵的特征值与特征向量有什么关系?特征值特征向量的含义和作用?★

特征向量表示矩阵的一个特征,特征值表示这个特征有多重要。一个矩阵所有的特征值和特征向量可以完整地还原出这个矩阵。

参考

[1][https://github.com/MingchaoZhu/DeepLearning](https://github.com/MingchaoZhu/DeepLearning)