利用矩阵表示空间映射
回顾上一讲中所讲的内容,在默认基底 构成的 Rn 空间中,矩阵 A 与列向量 x 的乘法 Ax 的本质就是变换向量的基底。将默认基底中的各基向量
分别对应的变换为矩阵 A 的各列,由矩阵 A 的各列充当新的“基向量”,再结合原向量的坐标,得到目标向量在目标空间中的新位置。
总结概况一下:由于矩阵乘法的作用,原始向量的空间位置甚至其所在空间的维度和形态都发生了改变,这便是矩阵乘法的空间映射作用。
我们要着重强调一下:在第一段中,我们将基向量打了引号,原因是这种说法并不完全准确。因为我们在上一讲的结尾曾经提到:矩阵 A 的各列向量作为向量 x 默认基底经过转换后的目标向量,由于其在维度和线性相关性方面存在各种不同的情况,因此这组目标向量的张成空间和原始向量所在的空间之间,就会存在多种不同的对应关系。
那么,这一讲里,我们就围绕下面的乘法式子,来重点讨论这个问题:
矮胖矩阵对空间的降维压缩
空间降维的原理
当 m
映射前的原始向量是:。原始向量 x 是 R3空间中的一个三维向量,它采用的是默认的基底:
向量 x 就是基底的任意线性组合中的具体一种。
依照我们介绍的基变换思想,经过矩阵 A 的基变换后,这组默认的基底被映射为了三个目标向量:
映射后的目标向量就相应的变成了:
映射前的向量 x,它的三个成分 (x1,x2,x3) 可以取任意值,因此向量 x 的分布为整个 R3 空间。那么我们关心的就是映射后的目标向量的整体分布情况,换句话说就是映射后的空间。
这就回到了张成空间的问题,3 个二维向量必然是线性相关的,但是仍然分两种情况。
情况一:
如果这 3 个二维目标向量共面但不共线,那么其所有的线性组合结果就构成二维平面 R2,经过矩阵 A 的映射,整个向量空间就被压缩成了二维,我们看看下面这个例子:
我们按照共面不共线的要求设定一个映射矩阵:
并在左侧的 R3 空间中任取三个向量:
在矩阵 A 的作用下,向量 u 映射的结果是:
向量 v 的映射结果是:
向量 w 的映射结果是:
我们在下面的图 1 中直观地将其标出,让这个三维空间到二维空间的压缩映射看上去更直观。
情况二:
如果这 3 个二维向量共线,那么其线性组合就只能分布在二维平面 R2 中的一条过原点 (0,0) 的直线上,经过矩阵的映射,整个向量空间被压缩成了一维,我们还是通过举例来看一下。
我们选取一个三个列向量全部共线的矩阵 A’:
仍然取上个例子中的三个三维向量:
向量 u 映射的结果是:
向量 v映射的结果是:
向量 w 的映射结果仍然是:
我们将其标注在图 2 中,就很清楚地展现出了这种空间压缩的情况。
高瘦矩阵无法覆盖目标空间
原理:向量信息不增加
现在我们来看看另一种形态的矩阵,即 m×n 矩阵中的 m>n 这种情况,我们称之为“高瘦”矩阵。
x 的 n 个基向量 ei 分别被矩阵 A 映射成了 n 个 m 维向量,由于 m>n,看上去 x 映射后的目标向量的维数提高了,变成了 m 维。那我们能不能说:经过矩阵 A 的映射,原始向量 x 构成的空间 Rn变成了维数更高的空间 Rm 呢?答案是否定的,哲学点说,一个事物无中生有,那是不可能的,平白无故地一个向量携带的信息怎么能增加呢?
实际举例
当然,这说得有点玄,我们用一个实际的 3×2 矩阵来举例:
映射前的原始向量是二维空间中的 映射的过程是:
由于映射前的向量 x 是二维空间 R2中的任意向量,类比一下,x1 和 x2取任意数,因此在矩阵 A 的作用下,整个二维空间的映射结果就是这两个向量的张成空间。是不是同样熟悉?又回到老问题上来了,我们对于
这两个三维向量,同样是分两种情况。
情况一:
两个向量线性无关,那么张成空间就是一个二维平面,这里需要注意一下,这个二维平面不是一个前面见过的由 x 轴和 y 轴构成的 R2 平面,而是一个“斜搭”在三维空间中的二维平面,构成平面的每一个点都是三维的,而这个二维平面的具体形态,则和这两个三维向量的具体值选取密切相关。
我们仍然举一个实际的例子:我们还是在原空间 R2 内选取三个向量进行映射:
映射后的结果分别是:,
,
我们通过图像来展示一下:
情况二:
如果两个向量线性相关,那么张成空间就是一条直线,那么同样地,这个直线是经过零点,并“斜穿”过三维空间 R3 的一条直线。
我们举一个实例:我们仍然选取上文中的三个向量进行映射:
映射后的结果分别是:,
,
我们仍然通过图像来展示一下:
分多种情况的方阵映射
至于说如果矩阵 A 是一个 n 阶方阵,分析方法也是一样的,核心问题仍然是分析 A 的各列向量的线性相关性,我们很容易发现,RnRn 空间中的向量经过矩阵 A 的映射,其目标空间的维度就是这 n 个 n 维列向量的张成空间的维度,其映射空间的维度必然小于等于 n。
我们简单地举 3 阶方阵 A 来举例:
当矩阵 A 的三个列向量线性无关的时候,意味着原始向量 x 的基经过映射后的目标向量仍然可以构成三维空间 R3的一组基。这是非常好的一种情况,意味着原始空间 R3 经过矩阵 A 的映射,其映射后得到的空间仍然是等维的 R3 空间。原始向量空间在这个过程中没有被压缩,并且映射后空间内的每一个向量也都能找到对应的原始向量。这种一一映射的关系我们在后面讲逆映射、逆矩阵的时候还会反复讨论,这里先有一个整体印象就好。
我们举实际的例子:原始向量:
映射后的结果:,
,
我们再来看看空间图形上的变换:
而当 A 的三个列向量线性相关的时候,其实就退化成“高瘦”矩阵里所讨论的情况了,由于之前详细用图分析过具体情形,我们这里就只需要简单的说明结论,相信大家很容易理解。
- 情况一:当这三个列向量共面但不共线的时候,R3空间中的向量经过映射,最后分布在“搭”在三维空间 R3 中的一个平面上。
- 情况二:当这三个列向量共线的时候,R3 空间中的向量经过映射,最后分布在“穿”过三维空间 R3 中的一条直线上。
空间映射形态的决定因素
矩阵的秩
这一讲里,我们举了这么多例子,画了这么多的图,是时候来提炼一些东西了,我们把一个空间经过矩阵映射后得到的新空间称之为它的像空间。我们发现,一个原始空间,经过几个形状相同的矩阵进行映射,像空间的维数可能不同;经过几个不同形状的矩阵进行映射,又有可能得到维数相同的像空间。那么决定因素是什么?
决定因素就是空间映射矩阵的列向量,列向量张成空间的维数就是原始空间映射后的像空间维数。我们给矩阵列向量的张成空间维数取了一个名字,就叫作:矩阵的秩。从另一方面看,秩也可以说是该矩阵线性无关的列的个数。
用 Python 求解矩阵的秩
道理懂了这么多,在这一讲的最后我们动手解决一下实际的问题,如何用 Python 求解矩阵的秩?
我们一边回顾这一节出现的 5 个典型矩阵,一边来求它们的秩。,矩阵 A1的列的张成空间维数是 2,因此矩阵 A1的秩是 2。
,矩阵 A2的列的张成空间维数是 1,因此矩阵 A2 的秩是 1。
,矩阵 A3的列的张成空间维数是 2,因此矩阵 A3的秩是 2。
,矩阵 A4 的列的张成空间维数是 1,因此矩阵 A4 的秩是 1。
,矩阵 A5 的列的张成空间维数是 3,因此矩阵 A4 的秩是 3。
判断矩阵的列向量是否存在线性相关
如何判断一个矩阵它的列向量是否存在线性相关的情况呢?我们可以通过求出该矩阵的秩,然后通过矩阵的秩和列数相比较,如果矩阵的秩=列数,那么该矩阵的列向量就不存在线性相关。反之,如果秩≠列数,那么该矩阵的列向量就存在线性相关。
我们用代码验证一下。
代码片段:
import numpy as np
A_1 = np.array([[1, 1, 0],
[1, 0, 1]])
A_2 = np.array([[1, 2, -1],
[2, 4, -2]])
A_3 = np.array([[1, 0],
[0, 1],
[0, -1]])
A_4 = np.array([[1, 2],
[1, 2],
[-1, -2]])
A_5 = np.array([[1, 1, 1],
[1, 1, 2],
[1, 2, 3]])
print(np.linalg.matrix_rank(A_1))
print(np.linalg.matrix_rank(A_2))
print(np.linalg.matrix_rank(A_3))
print(np.linalg.matrix_rank(A_4))
print(np.linalg.matrix_rank(A_5))
经过验证,程序结果和我们的分析一致。在这一讲里,我们通过大量细致的举例,展现了空间在不同秩的矩阵映射下得到的不同形态,并分析了其决定因素。这部分的基础非常重要,建立好了这个概念将非常有助于我们加深对逆矩阵、线性方程组和投影相关内容的本质理解。