线性代数势必要从几何层面理解,否则难以捕捉其妙处。
这一部分的内容参考了3B1B的「线性代数的本质」一作品,加入了很多笔者自己的想法。
向量究竟是什么?
Takeaway:
- 向量可以看作数字的有序组合,但是过于武断。
- 向量可以看作一种指明长度和方向的运动,向量之和相当于运动的接续,向量的数乘相当于运动长度的变化。
笔者曾经使用C语言写过一个简单的机器学习库,在实现中,我把标量、向量和张量都看作一个一维数组,它们的形状也就是说,它们是且仅是数字的组合方式而已,在代码中,一个张量的定义方法如下所示:
typedef struct Tensor {
double* data;
int* shape;
int n_dim;
} Tensor;其中data表示实际存储的数字,shape是一个一维数组,表示data的形状,n_dim实际上则是shape的长度,代表着维度。
实际上这样一种表示方法是纯粹的计算机视角——直接了当,甚至有些武断。落在几何中又是什么样子呢?假设我们有一个标准的二维直角坐标系xOy,那么向量就用一个二元元组来表示,比如(1,2),它表示一个从原点指向(1,2)这个点的向量。
在这个基础上,我们细细考虑一下,这个向量中的数字1和数字2分别代表什么呢?不难发现,实际上1代表x轴方向的分量是1,2代表y轴的分量是2。也就是说,我们沿着x轴正方向走1个单位长度的距离,再沿y轴的正方向走2个单位长度的距离,就得到了我们的(1,2)向量。这里我们得到了一个很有趣的看待向量的方法——向量是一种指明方向和长度的运动。
我们知道向量是满足加法和数乘运算的。加法相当于运动的接续,比如(1,2)向量和(2,1)向量相加,就相当于在(1,2)向量移动的基础上,再进行(2,1)的向量所代表的移动,最终得到了(3,3)。数乘就相当于把向量移动的长度进行缩放,比如(2,4)向量,就是(1,2)向量数乘以2得到的,这个向量x轴方向的分量是2,y轴的分量是4,每个方向,总的移动长度也从$\sqrt{5}$变为了$2\sqrt{5}$。
我们会发现一个规律,就是不论是向量的加法和数乘,都是在向量的每个元素上进行处理的。向量相加,就是向量对应位置彼此相加;向量数乘,就是向量每个位置都乘以乘数。
坐标、线性组合、张成的空间、线性相关和基
Takeaway:
- 向量的线性组合,是$a\vec{x}+b\vec{y}$,其中$a,b$是任意两个常数。
- 向量张成的空间可以理解为,向量线性组合得到的全部向量的集合。
- 向量线性相关代表向量对于维度的贡献是一致的。
- 向量空间基就是张成该空间的一个线性无关的向量集合。
我们在第一节中,把(1,2)向量分解成了x轴方向的分量和y轴方向的分量。这就相当于我们有两个向量(0,1)和(1,0),它们分别代表x轴和y轴方向上的单位向量(单位向量就是长度为1的向量)。那么标准xOy坐标系下的向量(1,2),就可以变成$2\times (0,1)+1\times (1,0)$,那么它在这两个向量上的坐标也就是(2,1)。向量自身数乘,和其他向量的数乘相加,这种组合方式就叫做向量的线性组合,形式一点的表达就是$a\vec{x}+b\vec{y}$,其中$a,b$是任意两个常数,常数排列起来,就叫做向量在某些向量上的坐标。
那么固定这两个向量,遍历所有的常数,我们就得到了这两个向量可以形成的所有的向量。向量代表运动,那么这些向量就形成了一个范围——这些向量可以移动到的区域范围,这个范围就叫做这两个向量张成的空间,可以记作$\text{span}(\vec{x},\vec{y})$。
那么这样的空间长什么样子?我们可以随便选一些向量,比如$(0,1)$和$(0,2)$,这里有意思了,我们发现,张成的空间是$(0,b)$,$b$是任意常数,这个空间是一条线!我们选择两个零向量,也就是(0,0)和(0,0),这样我们就只有一个点(0,0)了,张成的空间是一个点!
这告诉我们,两个向量张成的空间长成什么样子,和这两个向量本身的一些性质有关!那么这两个向量满足什么样的性质,才能让获得到的向量最多,也就是张成的空间尽可能大呢?我们回头看看共线的时候,发生了什么,也就是对于(0,1)和(0,2),它们的线性组合是$(0,a\times 1)+(0,b\times 2)=(0,(a+2b)\times 1) + (0,0\times 2)$,也就是说,两个向量的作用只相当于单个向量!为什么?因为两个向量都没有贡献x轴方向的分量。不仅如此,第二个向量可以由第一个向量来表示,这种彼此之间可以表示的关系,就叫做线性相关。如果两个向量线性相关,就表明两个向量其实是在同一个维度进行贡献的。对于零向量的例子则更激进了,两个向量都没有贡献两个轴的分量,那么就只有一个点可走。
那么基是什么?对于一个向量空间来说,这个空间的基就是张成该空间的一个线性无关的向量集合,比如(0,1)和(1,0),二者没法通过线性组合表达彼此,所以就是二维平面的一组基。当然,(1,1)和(2,3)、(0,1)和(1,1)同样是该空间的基。我们常说的二维坐标,实际上隐含了基这个信息,我们一直以来都在使用(1,0)和(0,1)这组基。对于不同的基,坐标通常也是不一样的。对于(1,2)这个xOy平面的向量,它在(1,1)和(2,3)基下的坐标就是(-1,1)。
当然,画到图上,如果我们一直以xOy的角度看,那么选择不同基就相当于将整个坐标的网格进行了变换,比如选择(1,0)和(1,1)做基,就相当于把y轴倾斜了45度,并且y轴每一个刻度的实际长度从1变成了$\sqrt{2}$。
线性变换与矩阵
Takeaway:
- 线性变换就是一种保持原点不动,保持网格线的平行与均匀分布的变换。
- 矩阵实际上是对标准基的操作。
- 矩阵乘法是在矩阵的新基上,进行线性组合,求原向量变换结果在标准基下的坐标的语法糖。
在计算机视觉和其他领域,我们的需求经常会涉及向量的变换,比如旋转、缩放、对称、拉伸等等,这一类变换通常满足这样一个性质,即保持原点不动,保持网格线的平行与均匀分布。我们通常需要求这样一个东西——某向量在经过一系列变换后,其坐标在标准坐标系下变成了什么样子?矩阵在一定程度上,就是为了解决这样的问题,其代表了对标准基的操作。
我们首先拿缩放举例子,依旧是二维空间,我们知道二维空间的标准基是(1,0)和(0,1),那么我们通常就把它们按列写在一起$\begin{bmatrix}1& 0\\ 0& 1\end{bmatrix}$。我们要缩放向量——其实就是做数乘操作——那么我们需要保持这两个标准基的方向不变,但是改变它们的跨度。比如,如果我们要缩放两倍——即数乘2——那么我们就把基变成(2,0)和(0,2),然后和原向量相乘:
$$ \begin{bmatrix} 2&0\\0&2 \end{bmatrix} \times \begin{bmatrix}1\\2\end{bmatrix}=\begin{bmatrix} 2\\4 \end{bmatrix} $$
那么新向量在标准坐标系下的坐标就是(2,4)了。这里的相乘其实表示的就是,一份(2,0)加上两份(0,2)。为了好运算,我们就把这样的看待矩阵乘法的方法拆开:结果的第一行第一列,就是左矩阵第一行乘右矩阵第一列。
如果我们要旋转呢?假设我们要把所有的向量顺时针旋转90°,从几何直观上来讲,顺时针旋转90°之后,y轴正方向变作了x轴正方向,而x轴正方向变作了y轴负方向,那么基向量就很好求了,分别是(0,-1)和(1,0),亦即:
$$ \begin{bmatrix}0&1\\-1&0\end{bmatrix}\times \begin{bmatrix}1\\2\end{bmatrix}=\begin{bmatrix}2\\-1\end{bmatrix} $$
也就是说,(1,2)在新基下,变换为了标准基下的(2,-1),读者可以画画图,后者是前者顺时针旋转90°的产物。
通用一点来讲,如果新基变成了(a,c)和(b,d),那么原向量(e,f),变成了:
$$ \begin{bmatrix}a&b\\c&d\end{bmatrix}\times\begin{bmatrix}e\\f\end{bmatrix}=\begin{bmatrix}ae+bf \\ ce+df\end{bmatrix} $$
这便是我们熟悉的矩阵乘法的定义,其本质是,如果新基变成了$\vec{x}'$和$\vec{y}'$,那么原基下的向量(e,f),就变成了:
$$ e\vec{x}'+f\vec{y}' $$
行列式
Takeaway:
- 行列式衡量线性变换对空间中的形状的有向面积(三维便是有向体积)的影响。
- 叉乘用来计算两个向量形成平行四边形的有向面积。
我们知道,不同的变换会对空间中的形状的面积(三维便是体积)造成不同的变化。我们想要衡量变换前后,面积(以下只考虑二维情况了,便统一称作面积)的变化倍数,就引入了行列式的概念。比如矩阵$\begin{bmatrix}
2&0\0&2
\end{bmatrix}$,很显然我们将每个维度都放大了2倍,那么最终的面积就变成了原来的4倍,这也是其行列式的值。到这里,便是很多博客、文章讨论的终点,但是读者是否可想过,行列式也可以是负值啊!难道变换之后,面积变成了负值?这显然不合理啊!
没错,这里的负值是因为,两个向量的相对位置变了。这里我们要引入一个有向面积的概念。二维空间中,两个不共线的向量$\vec{a}$与$\vec{b}$之间,可以形成一个平行四边形,设夹角为$\theta$,那么这个平行四边形的面积便是:
$$ S_{undirected}=\mid\vec{a}\mid\mid\vec{b}\mid\sin{\theta} $$
这里我们规定,如果从$\vec{a}$转到$\vec{b}$是逆时针,就为正数,否则就为负数,可以用右手定则判断。这样,我们就给面积带上了一个方向。数理基础好的小伙伴可能已经看出来了,这就是向量叉乘的定义。到这里我们就明白了,行列式是用来衡量线性变换前后,有向面积的影响的工具。举个例子,比如我们有两个向量(1,0)和(0,1),对应的变换是$\begin{bmatrix}1&0\\0&-1\end{bmatrix}$,这个矩阵行列式很明显是负值,是-1。我们的两个向量,从(1,0)转到(0,1),是逆时针,所以变换之前有向面积是+1,当变换之后,向量变成了(1,0)和(0,-1),从前者转到后者是顺时针,所以变换之后有向面积是-1。
3B1B在这一节的视频末尾说,拉普拉斯展开方法是代数的内容,不属于线性代数的几何本质,这一点我是不认可的,因为拉普拉斯展开代表面积一个极其漂亮的性质:平行四边形的有向面积对每一条边向量都是线性的。
我们先不管这句话的具体含义,我们先来看这样一个情况:

这里我们展示了一个平行四边形,它是由(2,2)和(4,-2)张成的,我们把(2,2)向量分解为x轴和y轴的两个向量,围出了两个新的平行四边形,不难发现,这两个平行四边形的有向面积和,就是整个大平行四边形的有向面积,而这也就是拉普拉斯展开的原理:
$$ \det(\vec{v_1},\vec{v_2})=\det(a\vec{x}+b\vec{y},\vec{v_2})=a\det(\vec{x},\vec{v_2})+b\det(\vec{y},\vec{v_2}) $$
严谨的推导可以通过叉乘的定义来推导,留给读者自证(逃……