矩阵的零空间和零度
摘要
这篇短文中将介绍矩阵零空间与矩阵零度的概念,以及矩阵秩-零度定理。
矩阵的零空间 (nullspace)
给定矩阵 A ∈ R m × n A \in \mathbb{R}^{m \times n} A∈Rm×n,那么矩阵的零空间定义为:
如果 X ∈ R n × 1 X \in \mathbb{R}^{n \times 1} X∈Rn×1,且有 A X = 0 AX = \mathbf{0} AX=0,那么所有这样的 X X X 组成的线性空间就是矩阵 A A A 的零空间。
首先我们须要验证所有满足 A X = 0 AX = \mathbf{0} AX=0 的 X X X 组成一个线性空间。
为了方便,我们记 n u l l s p a c e ( A ) = { X : A X = 0 } nullspace(A) = \{X: AX = \mathbf{0} \} nullspace(A)={X:AX=0}。
- 首先, A 0 = 0 A \mathbf{0} = \mathbf{0} A0=0,所以零向量属于这个空间。于是 n u l l s p a c e ( A ) ≠ ∅ nullspace(A) \neq \emptyset nullspace(A)=∅;
- 另外,如果 X ∈ n u l l s p a c e ( A ) X \in nullspace(A) X∈nullspace(A), 则 A ( λ X ) = λ A X = 0 A (\lambda X) = \lambda AX = \mathbf{0} A(λX)=λAX=0,所以 λ X ∈ n u l l s p a c e ( A ) \lambda X \in nullspace(A) λX∈nullspace(A);
- 还有,如果 X ∈ n u l l s p a c e ( A ) X \in nullspace(A) X∈nullspace(A), Y ∈ n u l l s p a c e ( A ) Y \in nullspace(A) Y∈nullspace(A),那么 A ( X + Y ) = A X + A Y = 0 + 0 = 0 A(X + Y) = AX + AY = \mathbf{0} + \mathbf{0} = \mathbf{0} A(X+Y)=AX+AY=0+0=0。所以 X + Y ∈ n u l l s p a c e ( A ) X + Y \in nullspace(A) X+Y∈nullspace(A)。
于是我们就证明了 n u l l s p a c e ( A ) nullspace(A) nullspace(A) 是一个线性空间。值得指出的是,虽然 n u l l s p a c e ( A ) = { X : A X = 0 } nullspace(A) = \{X: AX = \mathbf{0} \} nullspace(A)={X:AX=0} 构成一个线性空间,但是集合 Ω = { X : A X ≠ 0 } \Omega = \{X: AX \neq \mathbf{0} \} Ω={X:AX=0} 却不是一个线性空间。
矩阵的零度 (nullity)
矩阵零空间的维度 (dimension) 称为矩阵的零度 (nullity)。对于线性空间的维度,我们回忆起其定义为线性空间中向量个数最多的线性无关组所包含的向量的个数。我们记矩阵 A A A 的零度为 n u l l i t y ( A ) nullity(A) nullity(A)。
秩-零度定理 (The Rank-Nullity Theorem)
给定矩阵
A
∈
R
m
×
n
A \in \mathbb{R}^{m \times n}
A∈Rm×n,我们有
r
a
n
k
(
A
)
+
n
u
l
l
i
t
y
(
A
)
=
n
rank(A) + nullity(A) = n
rank(A)+nullity(A)=n
这成为秩-零度定理 (The Rank-Nullity Theorem)。
我们知道可以通过对矩阵进行初等行变换,得到行阶梯形矩阵 (row-echelon form)。那么对于得到的行阶梯形矩阵的,所有某一行的第一个非零的元素 (有的线性代数书中称为 number of leading variables) 对应的列所构成的集合的元素个数就是这个矩阵的秩。
这看起来有些复杂,我们来举一个例子。
A
=
(
1
1
2
3
3
4
−
1
2
−
1
−
2
5
4
)
A = \begin{pmatrix} 1 & 1 & 2 & 3 \\ 3 & 4 & -1 & 2 \\ -1 & -2 & 5 & 4 \\ \end{pmatrix}
A=
13−114−22−15324
对
A
A
A 进行初等行变换之后,我们得到
A
∼
(
1
1
2
3
0
1
−
7
−
7
0
−
1
7
7
)
∼
(
1
1
2
3
0
1
−
7
−
7
0
0
0
0
)
A \sim \begin{pmatrix} 1 & 1 & 2 & 3 \\ 0 & 1 & -7 & -7 \\ 0 & -1 & 7 & 7 \\ \end{pmatrix} \sim \begin{pmatrix} 1 & 1 & 2 & 3 \\ 0 & 1 & -7 & -7 \\ 0 & 0 & 0 & 0 \\ \end{pmatrix}
A∼
10011−12−773−77
∼
1001102−703−70
对于行阶梯形矩阵 ( 1 1 2 3 0 1 − 7 − 7 0 0 0 0 ) \begin{pmatrix} 1 & 1 & 2 & 3 \\ 0 & 1 & -7 & -7 \\ 0 & 0 & 0 & 0 \\ \end{pmatrix} 1001102−703−70 ,它的行的第一个非零元素所在的列是第一列和第二列,一共有两列。从而 A A A 的秩为 2。
而 Rank-Nullity 定理是说, r a n k ( A ) + n u l l i t y ( A ) = 4 rank(A) + nullity(A) = 4 rank(A)+nullity(A)=4。即 A A A 的零空间的维度是 2。
如何证明 Rank-Nullity 定理呢?我们考虑方程 A X = 0 AX = \mathbf{0} AX=0。因为对于矩阵进行初等行变换,并不影响方程 A X = 0 AX = \mathbf{0} AX=0 的解。我们可以对 A A A 进行初等行变换。如果 r a n k ( A ) = n rank(A) = n rank(A)=n ,那么 A A A 经过初等行变换得到的矩阵每一列都会有一个某一行中第一个非零的元素。于是可以想见,这时 A X = 0 AX = \mathbf{0} AX=0 的解只有 X = 0 X = \mathbf{0} X=0。从而, n u l l i t y ( A ) = 0 nullity(A) = 0 nullity(A)=0。Rank-Nullity 定理成立。
如果 r a n k ( A ) = r < n rank(A) = r < n rank(A)=r<n,那么有 n − r n - r n−r 列,其中的元素都不是某一行的第一个非零元素 (称为 free variables,自由变量)。那么如果确定了这 n − r n - r n−r 个 free variables,我们就能够确定 A X = 0 AX = \mathbf{0} AX=0 的解。
还是上面的例子,对于行阶梯形矩阵
(
1
1
2
3
0
1
−
7
−
7
0
0
0
0
)
\begin{pmatrix} 1 & 1 & 2 & 3 \\ 0 & 1 & -7 & -7 \\ 0 & 0 & 0 & 0 \\ \end{pmatrix}
1001102−703−70
,它的 free variables 在第三列和第四列。因为第一列中第一个元素 (
A
11
A_{11}
A11) 是第一行的第一个非零元素,第二列中第二个元素 (
A
22
A_{22}
A22) 是第二行的第一个非零元素,所以第一列和第二列中不存在 free variables。我们记第三列中的非零元素为
x
1
x_1
x1,第四列中的非零元素为
x
2
x_2
x2。那么如果确定了
t
1
t_1
t1 和
t
2
t_2
t2,每一个
A
X
=
0
AX = \mathbf{0}
AX=0 的解
(
x
1
x
2
x
3
x
4
)
\begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ \end{pmatrix}
x1x2x3x4
都可以写成
x
1
=
−
9
t
1
−
10
t
2
x
2
=
7
t
1
+
7
t
2
x
3
=
t
1
x
4
=
t
2
(*)
\begin{aligned} x_1 &= -9 t_1 - 10 t_2 \\ x_2 &= 7t_1 + 7 t_2 \\ x_3 &= t_1 \\ x_4 &= t_2 \\ \end{aligned} \tag{*}
x1x2x3x4=−9t1−10t2=7t1+7t2=t1=t2(*)
对于 n − r n - r n−r 个 free variables,我们依次将其中一个取为 1,剩余的取 0,那么可以得到 n − r n - r n−r 个向量。那么这 n − r n - r n−r 个向量就构成了 n u l l s p a c e ( A ) nullspace(A) nullspace(A) 的一组基。于是 n u l l i t y ( A ) = d i m ( n u l l s p a c e ( A ) ) = n − r nullity(A) = dim(nullspace(A)) = n - r nullity(A)=dim(nullspace(A))=n−r。
为什么这 n − r n - r n−r 个向量就构成了 n u l l s p a c e ( A ) nullspace(A) nullspace(A) 的一组基呢?
首先这
n
−
r
n - r
n−r 个向量是线性无关的。因为每一个向量都有那么一个位置,这个向量在这个位置上的元素为1,而其余的向量对应位置上为 0。还是上面的例子,我们分别取
t
1
=
1
,
t
2
=
0
t_1 = 1, \, t_2 = 0
t1=1,t2=0 和
t
1
=
0
,
t
2
=
1
t_1 = 0, \, t_2 = 1
t1=0,t2=1,得到的两个向量是
(
−
9
7
1
0
)
a
n
d
(
−
10
7
0
1
)
\begin{pmatrix} -9 \\ 7 \\ 1 \\ 0 \\ \end{pmatrix} and \begin{pmatrix} -10 \\ 7 \\ 0 \\ 1 \\ \end{pmatrix}
−9710
and
−10701
。
这两个向量线性无关。
另外,每一个
n
u
l
l
s
p
a
c
e
(
A
)
nullspace(A)
nullspace(A) 的元素均可由这
n
−
r
n - r
n−r 个向量线性表示。对于上面的例子,我们可以将 (*) 式写成
(
x
1
x
2
x
3
x
4
)
=
(
−
9
t
1
−
10
t
2
7
t
1
+
7
t
2
t
1
t
2
)
=
t
1
(
−
9
7
1
0
)
+
t
2
(
−
10
7
0
1
)
\begin{pmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ \end{pmatrix} = \begin{pmatrix} -9 t_1 - 10 t_2 \\ 7t_1 + 7 t_2 \\ t_1 \\ t_2 \\ \end{pmatrix} = t_1 \begin{pmatrix} -9 \\ 7 \\ 1 \\ 0 \\ \end{pmatrix} + t_2 \begin{pmatrix} -10 \\ 7 \\ 0 \\ 1 \\ \end{pmatrix}
x1x2x3x4
=
−9t1−10t27t1+7t2t1t2
=t1
−9710
+t2
−10701
。
综上,我们就证明了 n u l l s p a c e ( A ) nullspace(A) nullspace(A) 的维度是 n − r n - r n−r,从而证明了 rank-nullity theorem。
numpy 与 scipy 中求矩阵的秩与零空间
我们可以通过 python 中的 numpy.linalg.matrix_rank
和 scipy.null_space
来求一个矩阵的秩和零空间。
还是上面的例子,
import numpy as np
from numpy import linalg
from scipy.linalg import null_space
A = np.array([[1, 1, 2, 3], [3, 4, -1, 2], [-1, -2, 5, 4]])
A
array([[ 1, 1, 2, 3],
[ 3, 4, -1, 2],
[-1, -2, 5, 4]])
linalg.matrix_rank(A)
2
null_space(A)
array([[-0.82823574, 0.11451508],
[ 0.41571976, -0.52343633],
[-0.23435036, -0.6332511 ],
[ 0.2937389 , 0.55847448]])
这里 null_space(A)
返回值的类型是 numpy.ndarray
。如果 A.shape = (m, n)
,那么 null_space(A)
返回值的 shape 是
n
×
(
n
−
r
)
n \times (n - r)
n×(n−r)。即 null_space(A)
的每一个列向量是一个归一化的
n
u
l
l
s
p
a
c
e
(
A
)
nullspace(A)
nullspace(A) 的一个基。
我们可以验证,np.matmul(A, null_space(A)[:,0])
与 np.matmul(A, null_space(A)[:,1])
是零向量。
np.matmul(A, null_space(A))
array([[-5.55111512e-16, -4.44089210e-16],
[-2.66453526e-15, -4.44089210e-16],
[ 1.77635684e-15, -4.44089210e-16]])