线性代数是数学中的一个非常重要科目, 需要研究线性空间, 线性变换和线性方程组. 至于应用就太广泛了, 图像处理, 压缩, 信号处理, 统计分析, 机器学习, 网页排序......
01 向量的概念
现实中工作中, 我们会把几个数值放在一起, 当做一个整体来分析, 这就有了向量(Vector) : 一种有序的数值列表.
为了把向量和点区分开, 惯用的方法是把这对数竖着写, 然后用括号括起来, 比如下面的示例为 2 维向量, 3 维向量和 4 维向量:
注: 或者用方括号来表示向量
决定一个向量是它的长度和方向, 我们可以通过坐标系来更好的理解它. 在二维坐标系下用箭头绘制出来, 且箭头的起点位于原点, 终点就是数值分量对应的点. 这样每一个向量就对应唯一对数, 而坐标系中的一对数也唯一对应一个向量.
只要向量的大小和方向相同, 即视为相等的向量, 如下图所示在二维平面(Two-dimensional)下, 随便移动一个向量, 所留下轨迹上都是相同的向量:
对于三维空间而言, 向量就会有x, y, z三个分量, 我们用 x,y,z 轴来表示出来, 这样每个向量也会与一个有序三元数组(x,y,z)对应:
▌向量的加法
向量加法就是把对应项相加:
从图形来看我们可以平移第二个向量, 使它的起点与第一个向量的重点重合, 然后画一个向量, 它从第一个向量的起点出发, 指向第二个向量的终点. 这个向量就是它们的和; 或者观察动画按照每个向量的分量进行运动最终效果是一样的:
▌向量的数乘
另一个基础的向量运算就是一个数值(标量Scalar)乘以向量的每个分量, 就是将向量中的每个分量与标量相乘. 如选择数值 2, 把它与一个给定向量相乘, 意味着你把这个向量拉长为原向量的 2 倍:
观察下图如果标量为负, 则结果向量反向. 也就是数乘向量其实是对向量的拉伸, 压缩或反向的操作:
向量的加法和数乘非常重要, 将会贯穿线性代数, 我们第一次的内容就到此为止, 不过下面再补充几张动图来加深加法的理解:
▌向量加法三角形法则
其实与上面加法示例相同, 不过这里的向量起点并非原点:
▌平行四边形法则
▌向量的减法
向量的减法其实就是加法的一种特殊情况:
02「基底 / 线性组合 / 线性无关(相关)」
▌基底
在二维线性空间中, 只要用两个特殊的向量就可以来用定位(表示)出任意向量:
空间中的任何向量都是可以通过缩放这两个向量再相加表示出来. 现在想象, 譬如向量 (3,2) 就是沿着 i 的方向拉伸 3 倍, 再沿着 j 方向 拉伸 2 倍的向量相加结果.
这样特殊的向量称之为基(Basis, 或基底), 任何二维向量都可以由这两个向量的线性组合表示出来, 其中 a, b 为标量.
观察下面动图显示, 当 a, b 两个标量自由变化, 通过向量加法与向量数乘这两种基础运算, 就能获得所有二维中可能的向量:
基底的选取有各种各样的方式, 但不同的选取 可能会有 3 种情况, 观察下面动图中选取 i 和 j 作为基底出现:
也可以线性表示出空间中任意的二维向量;
如果两个向量恰好共线时候, 所产生的向量的终点被限制在一条过原点的直线上;
两个向量都是零向量, 其组合向量是零向量.
所有由向量 i 和 j 线性组合而获得所有可能的向量集合, 称之为两个向量张成的空间(Span).
用上面的图形来说明: 对大部分二维向量来说, 两个向量所张成的空间是所有二维向量的集合, 可以称之为基底; 但当共线时, 张成的空间就是一条直线, 不能构成二维线性空间的基底.
▌三维空间的基底
再来看看三维空间中的两个方向不同的向量(蓝色和橘黄色)所张成的空间就是两者所有的线性组合, 其实就张成了一个过原点的平面 .
如果在加上第三个向量, 那么线性组合为下面的形式:
对三个基底向量分别进行缩放, 然后把结果相加, 而这三个向量所有可能的线性组合构成了他们张成的空间:
▌线性相关
考虑 三维中第三个向量已经落在前两个向量所张成的平面之中, 那么就可以被这两个向量线性表示; 或者二维中两个向量共线, 那么可以由另一个线性表示出来. 现在观察二维两个向量共线的情况:
这种情况称之为线性相关(Linearly Dependent), 也就是说存在有向量对张成空间而言上多余的, 即便删除掉也不会对张成的空间有任何影响.
反之称为线性无关, 也就是没有任何向量可以由其他向量经过线性组合表示出来, 每个向量对所张成的空间都做出了"贡献".
03 「线性变换/矩阵及乘法」
线性变换是线性空间中的运动, 而矩阵就是用来描述这种变换的工具. 这样说还是没有直观印象, 所以还是直接看图解的动画吧.
矩阵不仅仅只是数值的表:
其实表示了在该矩阵的作用下, 线性空间是怎样的变化, 观察下图二维平面中水平和垂直方向的伸缩过程:
从上面动画中可以观察到:
垂直方向并没有发生任何变换(A 的第二列没有变化);
水平方向伸展了 2 倍;
浅红色方格在变换后面积变成了原来的 2 倍,这里其实就是行列式的意义 - 面积的扩张倍率 Det(A)=2
再看到更多矩阵变换之前, 先停下来看看下面静态图片的进一步解释:
变换前矩阵的基底向量 i (1,0) 移动到了 (2,0) 的位置, 而 j 基底向量 (0,1) 还是 (0,1) 没发生任何变换(移动) - 也就是基底的变化:
一旦明白了基底的变化, 那么整个线性变换也就清楚了 - 因为所有向量的变化都可以由改变后的基向量线性表出. 观察下面红色向量(1, 1.5) 和 绿色向量(-1, -3) 变换后落脚的位置:
向量 (1, 1.5) 在变换后的位置, 其实就是变换后基向量的线性表示, 也可以看到矩阵的乘法是如何计算的:
类似对于(-1, -3) 变换后的位置 , 也是一样的计算方法:
可以再次观察上面动画来体会, 验证算出的结果.
下面再看其他的变换矩阵
这里矩阵 A 的对角线中(0,2)含有一个 0 的情况, 观察下面动画 :
可以看到:
水平方向变为 0 倍;
垂直方向被拉伸为 2 倍;
面积的变化率为 0 倍, 也就是 Det(A) = 0;
基底的变化如下:
再看看下面这个矩阵 A 的变换:
可以看到:
整个空间向左倾斜转动;
面积放大为原来的 Det(A) = 3.5 倍;
上面在 3 个不同的矩阵作用下(相乘), 整个空间发生不同的变换, 但是原点没有改变, 且直线依然还是直线, 平行的依然保持平行, 这就是线性变换的本质.
类似, 在三维线性空间内, 矩阵也用于这样的线性变换, 需要注意的是这里行列式可以看成经过变换后体积变化的倍率. 观察下图, 经过下面矩阵 A 的变换中, 空间会经过镜像翻转变换(扁平化为线), 所以行列式的值会是负数.
04 「行列式」
这次我们主要做一个回顾, 再进一步将行列式的几何意义用动画展示说明. 我们说矩阵 A 可以视为一种线性变换, 所以
上面的式子意味着一个向量 x 在线性变换 A 后的位置将会和向量 v 重合. 现在看个例子, 整个空间在矩阵 A 的作用下是怎样的变化过程:
观看看到:
原来向量(1, 0.5)在经过变换后是(2, 1.5);
水平方向变成了原来的 2 倍;
纵向变成了原来的 3 倍;
原来的直线变换后依然还是直线, 平行的依然保持平行;
原点没有改变(如果没有原点, 则为仿射空间)
并且注意红色的方块面积扩大了 6 倍, 这样的面积(或体积)增大倍率就是行列式(Determinant)的几何意义, 记作: det(A) 或者 |A|
再看另一个作用矩阵线性变换的动画:
观察看到:
空间发生了倾斜, 但没有扭曲;
直线在变换后依然还是直线, 平行的依然保持平行;
A 的第一列(1.5, -1)的落脚点为(1, 0) - 像, 第二列(-0.5, 2)的落脚点为(0, 1);
单位红色小方块扩大为 2.5 倍, 也就是 det(A) = 2.5
再来看这个线性变换的例子, 注意矩阵 A 中两个列向量是成比例的 - 线性相关:
观察得到:
空间被压缩成一条线;
向量(1, 0.5) 在整个变换过程中完全没有发生改变(这跟特征值与特征向量有关, 我们后文书再说);
面积增大倍率为 0, 也就是 det(A)=0;
这跟上一节中矩阵对角线含有 0 元素情况类似, 在这种情况下意味着不存在逆矩阵, 不过也是以后要介绍的内容了.
行列式的几何意义表示面积(体积)的增大倍率, 如在经过镜像翻转后就为负值, 上一节我们看到三维矩阵的情况, 现在看一看二维中经过镜像翻转后行列式的变化, 请注意最下变换过程中 det(A) 值从正数到负数的变化过程:
05 「矩阵的乘积/复合变换」
矩阵向量的乘积可以理解为将一个特定的线性变换作用在向量上, 本次我们先看几个特殊的矩阵下的变换以及矩阵矩阵的乘积.
▌ 零矩阵
即所有元素都是 0 的矩阵, 记为 O . 可以用下标来表示矩阵的大小:
零矩阵表示的变换是将空间压缩到原点, 可以观察在 2 阶零矩阵的作用下, 空间被压缩到原点的变化过程, 注意行列式的值最后为 0:
▌单位矩阵
是对角元素为 1, 其余都是 0 , 记为 I.
单位矩阵对空间什么都不改变, 保持基向量不变, 也被称为"恒等变换", 可以看下面对应的空间变化过程(尽管没有改变):
▌对角矩阵
除了对角元之外所有元素均为 0 的矩阵称之为对角矩阵.
对角矩阵表示的沿着坐标轴伸缩变换, 其中对角元素就是各轴伸缩的倍率, 并且下例矩阵 A 的对角元素中含有 2 个负数, 可以看做经过了 2 次镜像翻转, x,y 两个方向先是压缩, 然后再被拉伸, 面积扩大为原来的 6 倍, 这样行列式的值为 6.
上面都是进行一次变换的操作, 如果想要再进行一次(甚至更多)变换, 就要矩阵和矩阵相乘了. 譬如下面矩阵 A 相当于将空间旋转, 矩阵 B 是横向拉伸.
如果是 BA 两个矩阵相乘的运算, 就相当于先旋转再拉伸, 这样的复合变换运算顺序是从右往左进行, 可以观察下面的动画:
如果是 AB 两个矩阵相乘的运算, 就相当于先拉伸后旋转, 运算顺序是从右往左, 可以观察下面的动画:
从上面两个变换动画, 可以得出结论矩阵的乘积不满足交换律(可以想象满足结合律):
可以计算出 BA 和 AB 的值:
如何计算矩阵的乘积, 除了课本上给出的方法, 还可以按照列的线性表出来进行, 以 BA 为例:
另外, 如果两个矩阵都不是零矩阵, 但是矩阵的乘积可能会是零矩阵, 比如在下面两个矩阵:
空间中, A 做横向压缩, B 做垂直压缩, 经过 A 然后 B 的变换后, 也会映射到原点.
「矩阵的逆/逆变换」
这次我们来看如何把矩阵 A 经过变换后的向量再还原回去. 观察下面如何从变换后的向量(-1.5, 2) 还原为向量 (1, 0.5) 的过程:
注意观察要点:
变换后线性空间还是完整的二维空间;
变换后的行列式为不等于 0;
还原后仅有一个向量与之对应;
整个还原的变换实际上对应了另一个线性变换, 称为矩阵的逆(Inverse), 记为 A^(-1).
矩阵与它的逆矩阵相乘, 那就是先做了一次变换, 然后在还原回来, 这两个连续的变换作用就是矩阵的乘法, 相当于什么都没有改变, 这个没有进行任何改变的变换, 就是上次说提到的单位矩阵.
利用这个性质, 我们可以通过在 Ax=V 两边同乘 A 的逆矩阵来求出变换前的向量 x:
矩阵的逆是否一定存在?
那么问题在于逆矩阵是否一定能找得到呢? 想象当 det(A) = 0 时候, 也就是代表矩阵的变换将空间压缩到更低的维度上, 此时没有逆矩阵. 在二维平面中变换后空间被压缩到原点以及被压缩为一条直线都是不存在相应的逆矩阵. 或者说没有办法找到对应的映射可以将一个点或一条线还原为平面.
类似地, 对于三维空间中, 如果一个变换将空间压缩为一个平面, 一条直线或原点, 也就是都对应 det(A) = 0 (体积为0)时, 那么也没有逆变换. 请看下面矩阵将三维空间压缩为平面的情况:
▌对角矩阵的情况
对角矩阵对应的变换就是沿着坐标轴伸缩变换, 那么还原就非常简单了, 只需要将各坐标轴伸缩为倒数倍就好了.
但注意即使不存在逆变换, 但对应的 x 仍然可能存在. 当一个变换将空间压缩到一条直线, 但是向量 v 刚刚好就在这条直线上. 如下面矩阵 A 将空间压缩成一条直线, (红色)向量 v (1, 0.5) 因为恰好落在该条线上, 所以相应的 x 为 (0.25,-0.25) .
07【方程组的解/零空间/核】
线性代数在许多领域都被广泛应用的主要原因是能够求解给定的线性方程组(Linear System of Equations). 这一次来看如何用矩阵的语言来构建简单的数学模型来:
有若干只鸡和兔在同个笼子里,从上面数,有三十五个头;从下面数,有九十四只脚。求笼中各有几只鸡和兔?
题目非常简单, 由两个方程和两个未知数构成的方程组便可以求解出:
或以把方程写成矩阵向量相乘的形式 - 常系数矩阵 A , 未知量作为列向量 x, 两者的乘积得到常数列向量 v.
常系数矩阵可以理解为自变量 x 与 因变量中间存在的某种关联, 指定了这个矩阵就能确定了从向量到另外一个向量的映射. 这样用线性变换来理解的话, 求解 Ax = v 意味着我们要找到一个向量 x , 使得它在变换后与 v 完全重合:
这个方程组有解就是矩阵 A 所代表的变换没有将空间进行扁平化的压缩, 即 det(A)≠0. 否则方程组无解.
或者还可以从矩阵的行视图来理解这个线性方程组, 所要求的解就是求两条直线的交点:
对于两个方程组未知数两个的时候, 线性方程组的解有三种情况:
不存在;
唯一(两条直线相交);
有无穷多个;
现在从列视图和行视图两个角度来理解后面两种情况, 比如下面线性方程组无解:
从列视图可以看做向量 (2,1) 没有落在矩阵列所张成的空间内, 从下面动画中看到经过矩阵变换后, 空间最终被压缩为一条灰色直线, 而 v 在直线外, 所以不能被变换后的基向量线性表出:
或者可以从行视图来理解就是空间中两条直线为平行关系:
再来以下面线性方程组为例看无穷解的情况:
如果从行视图来看就是两条直线重合在一起:
观察下面的动图来从列视图的角度理解无穷解的情况:
观察要点:这个矩阵的变换将线性空间压缩到一条灰色直线上;
图形中黑色直线上的所有向量在变换后都被压缩到原点, 成为零向量;
在经过线性变换后那些压缩到原点的向量集合, 称为零空间(Null space)或称为核(Kernel). 上面方程组的通解就是由特解和所有零空间解的线性组合, 下面动图尽管改变中 a 的值, 所有可能 a (-1, 1) 是零空间的解, 所以经过变换都会被压缩到原点; 而 (2, 0) 是特解, 经过变换后会落脚在 (2, 4) 处.
类似, 如果有三个方程式, 三个未知数, 那么每一个方程就代表了三维空间中的一个平面, 而方程组的解集就可能是空间中的一部分: 无解, 一个交点, 一条直线或一个平面;
在很多问题中都能将数学模型归结为 y = Ax . 比如信号处理, 统计分析, 机器学习等, 在工科中会经常用到. 在未来的图解系列中我们会遇到更多这些问题的示例.
08【方程组的解 II】
这次我们来看看三个方程式, 三个未知数的方程组解(即平面方程组)的情况. 其中每一个方程可以看做代表了三维空间中的一个平面, 而方程组的解集就可能是空间中的一部分: 无解, 一个交点, 一条直线或一个平面;
▌方程组唯一解的情况
从行视图来理解就是三个平面相交于一点:
如果从矩阵变换的角度来理解的话, 请观察下图:
观察要点:
经过矩阵变换后, 仍是三维空间;
解向量 x 在变换后, 与向量 v 重合;
向量 v 可以被矩阵 A 的列向量线性表出, 也就是落在列空间内;
▌方程组无解
其中三个平面交线相互平行, 不会有任何共同的交点, 所以无解:
如果从矩阵变换的角度来理解的话, 请观察下图:
观察要点:
经过矩阵变换后, 空间被压缩为平面;
由于向量 v 在平面之外, 所以无法被矩阵的列向量线性表出, 落在列空间之外;
▌方程组有无穷解 - 解集为一条直线
三个平面相交于一条直线:
如果从矩阵变换的角度来理解的话, 请观察下图:
观察要点:空间经过变换被压缩为平面;
行列式为 0, 即逆矩阵不存在, 但解仍然存在, 因为 v 就在该平面上, 即在列空间内 ;
图形中红色细线上的所有向量在变换后都被压缩到原点, 成为零向量;
方程的通解为特解 + 零空间上解所有的线性组合:
▌方程组无穷解 - 解集为一个平面
三个平面实际就是为一个平面:
如果从矩阵变换的角度来理解的话, 请观察下图:
观察要点:
矩阵变换将空间压缩为一条直线;
行列式为 0 , 即逆矩阵不存在, 但解仍然存在, 因为 v 刚好就在这条直线上, 还在列空间内;
图形中浅蓝色平面上的所有向量在变换后都被压缩到原点, 成为零向量;
方程的通解为特解+零空间上解所有的线性组合:
这一次我们从行视图和列视图的几何角度理解线性方程组: 每个方程组都有一个线性变换与之联系; 当逆变换存在时, 就能用逆变换来求解方程组的解;逆变换不存在时, 行列式为 0, 就需要考察向量 v 是否落在列空间内了.
09「秩 / 列空间 / 零空间」
首先让我们来做一个简短的回顾:
矩阵乘法可以理解为一个特定的线性变换, 矩阵的列向量相当基向量 i: (1,0) 和 j: (0,1) 经过变换过后的到达向量.
(原谅我用鼠标进行的标注吧)
空间变换后的任何向量都可以由矩阵 A 的列向量线性表出, 而这些所有可能的结果, 也就是矩阵的列所张成的列空间(Column Space).
原先的空间经过这样2x2 矩阵 A 线性变换后的空间可能会三种情况:
还是平面 -仍是二维空间;
被压缩为一条线 - 变成了一维;
被压缩到原点 - 零维;
在数学专业的词汇来表示线性变换后空间的维数, 称之为矩阵的秩( Rank ) . 换句话说, 列空间就是矩阵的列所张成的空间. 所以矩阵秩的另一种定义可以说是列空间的维数. 经过变换后被压缩到原点的向量集合, 称为矩阵 A 的"零空间"(Null Space)或"核"(Kernel), 记为 Null(A) 或 Ker(A).
对照上面的三种情况, 来分别来观察.
▌第 1 种情况: 变换后仍是平面
观察要点:
如果经过矩阵 A 变换后的结果是一个平面, 则 rank( ) = 2, 空间没有被压缩扁平化, 因此可逆, 称之为非奇异矩阵;
这样秩与列数相等, 称之为满秩(Full Rank)矩阵.
对于满秩矩阵来说, 变换后唯一落在原点的就是零向量本身, 也就是 dim Ker( ) = 0;
▌第 2 中情况: 变换后被压缩为一条直线
当变换的结果是一条直线, 该矩阵是一维的, 称rank(A) = 1, 此时矩阵不可逆, 称为奇异矩阵;
这样非满秩矩阵, 会将空间压缩到更低的一维直线上, 也就是由嫩绿色直线上一系列的向量在变换后成为零向量;
零空间的维度为 1, dim Ker(A) = 1;
▌第 3 种情况: 变换压缩到原点
当变换的结果是压缩到原点, 则该矩阵是零维的, 称 rank(A) = 0;
而零空间维度为 2, dim Ker(A) = 2;
▌维数定理
假设 A 是 mxn 矩阵(非方阵的情况, 下次会介绍), 维数定理就是:
dim Ker(A) + rank(A) = n
相信如果理解透彻 2x2 矩阵的情况, 那更高维的矩阵也就清楚了.
10「矮矩阵 / 长矩阵」
矩阵乘法可以理解为一个特定的线性变换, 比如在 2x2 的可逆矩阵表示就是二维空间的(可逆)变换; 3x3 的可逆矩阵表示三维空间的变换.
这些都是 nxn 型的矩阵, 本节来看看更一般 mxn 矩阵, 也就是非方阵的情况 -- 分两大类:行数小于列数的"矮矩阵"和行数大于列数的"长矩阵".
▌矮矩阵
所谓"矮矩阵"就是 mxn 矩阵 A 的维数 m < n 的情况:
从方程组来说, 就是未知量为 n , 而方程个数 m .
以上面 2x3 矩阵而言, 就是未知量 x 从三维空间被压缩到二维平面的线性变换, 也就是说存在了压缩扁平化的操作, 观察下图:
观察要点:
三维空间被压缩为平面;
属于零空间的向量集合被压缩到零向量, 可以认为在变换过程中丢失了一部分信息;
三维空间的基底在变换后落在平面上, 并且坐标分别为(3,1),(1,5),(4,9);
这样矩阵压缩的行为, 当然可以从二维平面到一维直线, 如看下图的变换矩阵(1,2) 的作用下, 线性空间是怎样的变化过程:
观察要点:
属于零空间的向量集合被压缩到零向量;
二维空间的基底在变换后落在数轴上(直线)上, 并且变换后坐标分别为 1 和 2;
类似这样对空间压缩的操作经常被用于对数据的压缩, 比如原始数据维数太大, 就需要找到某种变换将原始高维属性空间降为更低维的空间, 未来再主成分分析 PCA 时候, 我们再来更详细的图形展示.
▌长矩阵
反过来考虑当矩阵 A 维数 m > n 的长矩阵:
这样未知数要比方程数少的情况, 对应的是变换会从低维到高维空间进行的. 比如下面矩阵就是从二维变换到三维空间的映射:
类似, 如果从一维到三维空间的变换矩阵也一定属于长矩阵形状的.
无论是矮矩阵, 还是长矩阵, 这样的非方阵和方阵的一个明显不同是, 对于方阵我们可以计算它的行列式, 如果不是方阵的话,就不行列式这个概念了.
11「特征值 / 特征向量」
“特征”一词译自德语的eigen, 意味着“自身的”,“有特征的” — 这强调了特征值对于定义特定的线性变换上是很重要的.
▌特征值 / 特征向量
我们来观察在矩阵 A 的作用下空间发生的线性变换, 注意下图中红色向量和绿色向量的变化:
观察要点:
空间发生了倾斜, 但(黑色虚线)直线还是直线, 依然保持平行(线性性质);
变换过程中发生了镜像翻转, 所以行列式为负值 -2;
基向量 i 变换到 (-2,-2) 处, 基向量 j 变换到 (2,3) 处;
红绿两个向量都随之发生了旋转;
是不是空间中所有的向量都会进行旋转呢? 还是这个矩阵变换为例, 再来观察下面这 3 个向量.
观察要点:
红绿 3 个向量的长度发生了伸缩变换, 但仍在原来的直线方向上, 并未发生旋转;
两条直线上的任何其他向量都只是被拉伸为原来的 2 倍和 -1 倍, 如红色两个向量都伸长为 2 倍;
除了这两条直线外, 空间中的其他向量在变换过程中都有旋转(见上图);
这里只有长度伸缩起了变化, 而方向仍在原直线上的向量就是矩阵 A 的特征向量(Eigenvectors. 伸缩的倍数, 就是特征值(Eigenvalues), 红色向量 (1,2) 伸长了 2 倍, 特征值为 2; 绿色向量 (2,1) 伸缩倍率为 -1, 相应特征值为 -1.
一般而言, 对于 nxn 方阵 A , 当存在向量 v 不是零向量, 且满足
等号左边是矩阵向量的乘积, 而右边是数乘向量.
▌特征值的计算
如何求解出特征值呢, 考虑将上面等式右边项移项:
我们知道只有当 (A-λ I) 这个矩阵所代表的变换是压缩扁平化操作的时候才会将向量 v 压缩至原点处, 而压缩扁平化的矩阵的行列式应该等于 0 , 这样只需要求解出相应的特征方程即可得到 λ 的结果.
一旦求出了矩阵的特征值, 之后要做的就是带入定义式子, 求出满足定义的特征向量了.