最近找到了一个用于线性变化可视化的在线visualization,很好玩,分享给大家:
https://visualize-it.github.io/linear_transformations/simulation.html
大家可以自己去玩玩,然后我也借助这个可视化工具做一期有关特征根和特征向量的教程。我接下来的教程内容,在英文的线性代数教学内容中属于是司空见惯的东西,我可能只是通过我自己的理解整合了多个教程的内容。但是,在中文的线代教程中,还尚未完全普及。
我并不打算系统地做线代教学,但通过这期教程,是想让更多读者看到,线代可以教得十分直观易懂!
1 换一种视角看待矩阵乘法与线性方程组求解
对线代有基本认识的读者都会知道,对于一个如下的线性方程组:
我们可以将其表达为Ax的形式,其中:
我们可以用多种不同的方式来理解Ax这个矩阵和向量的乘法运算,最为大家所熟知的是行*列的算法:
也就是说A中的第一行依次为两个未知数x的系数,所以我们将A中的第一行与两个未知数依次相乘,形成第一个方程的左半部分(结果矩阵的第一行),第二行也类似……这种乘法方式被称为“点积”运算法,具体为何如此命名由于篇幅我们在此不赘述。
我们还可以用一种不同的方式来理解这个乘法运算,如下:
这种运算的结果和上述是一样的,但是运算的过程不一样。它代表了整个方程组的左半部分是通过x1倍的A的第一列和x2倍的A的第二列相加得来的——这个运算也同样十分直观,符合我们对方程组构建方式的认识。通过这种理解视角,我们会发现一个矩阵乘以向量,就是根据向量中的元素大小,来对矩阵中的列进行相应比例的线性组合。
【练习:到这里我们先停一下,请你自己尝试着写一个3*3的矩阵A,与一个3*1的向量x,然后先用“点积”运算法计算一下结果,然后再用新的“列的线性组合”的方式计算一下。希望你和我一样获得了相同的计算结果,但是会觉得,两种计算带给你的感觉是不一样的!】
我自己做矩阵乘法的口算时很少会使用最基础的“点积”算法,因为它需要一个个元素遍历计算,这无疑是对我大脑计算资源的一种浪费(学过“分布式计算”相关编程概念的同学会更理解我在说什么)。
另一方面,“列的线性组合”的乘法算法能提供给我们一种新的视角来理解线性方程组。上述的“列的线性组合”,实际上就是在说一组列向量(通过一列数字表示的向量)的线性组合,它在视觉上意味着什么呢?
我们可以把两条向量先在坐标系中描绘出来:
让我们将这两条向量命名为a1和a2。依据高中学的向量“平行四边形加法法则”,可知我们能够通过对两条向量进行一定比例的“加和”,也就是x1 a1+x2 a2,来获得相对应的任意二维平面上的向量:
现在,再回过头来看我们用来举例的二元一次方程组,我们已经知道它可以被如此简写:
所以这个求解这个线性方程组,实际上在视觉上,就是在求解:我们该如何对a1和a2进行配比加和(找到对应的x1和x2),才能获得目标向量b=(8, 5)。
【练习1:请通过你既有的解二元一次方程组的知识,解出这个线性方程组,然后根据方程组的解x1和x2,在坐标系中画出相应的平行四边形加法的可视化,验证加法结果,也就是平行四边形的对角线,是不是就是方程组中的b】
【练习2(选做):将你在最初一个练习中找的矩阵和向量写成一个三元一次方程组,然后通过“列的线性组合”的方式来理解这个方程组,并在三维坐标系中描绘出对应的列向量。接下来,请你自行求解出该方程组的解,依据解的值,我们可以对刚才可视化出来的三条列向量进行线性加和。请观察,加和得到的目标向量,是否对应于方程组中的b】
2 换一种情境理解Ax
我们刚刚已经介绍了通过“列的线性组合”的方式来理解Ax,在这种视角下,假如A是一个m*n的矩阵,我们可以将其看作一个蕴含了n个m*1向量的矩阵,而Ax这一乘法就是对这n个向量进行线性组合,来获得1个m*1的向量。
需要注意的是,在上述求解线性方程组的情境下,我们其实默认地将A看作某个特定的矩阵,其所包含的列向量也都是给定的。而x是可以变动的,我们尝试将A中的列向量通过任意x中的元素组合,来获得目标向量b。
如果我们从烹调料理的角度来理解这个乘法,我们可以将A理解为某种食材,x理解为不同的调味料,我们尝试向食材中加入的调味料,从而将食材烹调成我们期待的料理。
现在,让我们再来引入另一种情境:假如现在有一个Ax的乘法,其中x是固定的,而A是变动的呢?这时,我们的“烹调方式”有所转换:x变成了某种食材,而A变成了不同的调味料。但这其实只是一种情境上的切换,我们仍旧可以通过“列的线性组合”来理解Ax背后的含义。
我们先来看一种最简单的情况,当A=I,也就是单位矩阵的时候。我们可以把Ax看作:
而它实际上就是x本身(这时候我们就是在对一个长度为1的x轴上的向量和一个长度为1的y轴上的向量进行线性组合,这也是我们构建任意标准二维坐标系中向量的方式)!但是假如我们将A中的第一个元素改为2:
这时,通过“列的线性组合”,Ax现在变成了:
可以看到,x的第一个维度被拉伸了两倍,现在让我们将x想象为一个二维坐标系中的向量,Ax乘法的过程其实可以被可视化为下述的过程:
在有了如此精美的可视化后,让我们再来回忆一下我们刚才做了什么!当A=I的时候,Ax就是x本身,它就好好“躺”在一个标准的二维坐标系上。当A中的第一个元素变换时,整个坐标系也发生了变换,我们可以将其理解为一个空间扭曲的过程,而在这个扭曲的过程中,处于这个空间内的x也被连带着扭曲了!
我们将这个扭曲的过程称为“线性变换”,任何矩阵都可以是一道“扭曲射线”,当它打在x上(也就是Ax)时,x所处的整个空间会产生扭曲,导致x也跟着被扭曲。
我们还可以来做一个更有意思的线性变换,假如这时A为如下矩阵,x为如下向量:
我们来看看这个“空间扭曲”,或者正式地说,线性变换的可视化是怎么样的:
【练习:自己打开文章开头的网址,尝试不同的矩阵A,来观察左乘矩阵A后对整个二维空间的影响】
3 真正理解特征根与特征向量
我们在前面提到,矩阵A可以被理解为某种线性变换,当它左乘x时,可以对x所处的空间施加某种“空间扭曲”,进而促使x产生变化。那么显而易见的是,在这个扭曲的过程中,不仅x变化了,该空间中其他的向量也由于空间的扭曲而产生了变化。
所有线代教材在讲到特征根与特征向量时,都会给出如下的公式:
其中x是特征向量,λ是特征根。结合上述“空间扭曲”/线性变化的知识,这个公式到底意味着什么呢?
这个公式意味着,当A这道“扭曲射线”降临时,存在某条向量x,在整体空间扭曲的情况下,虽然它的长度被改变了,但它的方向没有变化,仍旧能够“保持本色”!
比如,给定如下的矩阵和其特征根与特征向量:
我们可以将Ax可视化为如下的过程:
我们可以看到,在A扭曲整个空间的过程中,x只是被拉伸了(刚好放大了两倍),方向并没有变化。
这条“坚挺”的向量x就被我们称为A的特征向量,特征向量的英文为“eigenvector”,而eigen为德语,对应“自身的”意思。所以x是A的eigenvector,实际上就是说x在经过A的线性变换后,仍旧能够保持自身。而经过变换后缩放的幅度,相对应的就被我们称为“特征根”,也就是eigenvalue。这里中文的翻译实际上也存在一定误导,英文直译应为“特征值”,之所以翻译为“特征根”,大概率是因为我们实际求eigenvalue的过程中会涉及到方程根的求解。
【练习:结合你手头的线代教材,掌握求解一个矩阵A的特征根与特征向量的基本算法。然后自己给定一个矩阵A,求出它的特征向量与特征根,在文章开头给的可视化工具中,尝试可视化出特征向量“保持自身”的过程】
如上,就是用可视化方式真正理解特征根和特征向量的全部内容,以下是我的个人吐槽,你可以选择不读,或是消化完知识以后再读,对我的读者来说,学习是第一的!
4 线代的教学真有那么难吗?
我之前就提过国内高校很多线代课很“拉胯”,实际上只要用心,配上一些教学能力,一个老师完全可以在多年授课经验的帮助下,很清楚地教授很多知识点。本教程就是一个例子,在对比本教程与你所接受的高校线代教育时,应注意如下几点区分:
1) 阅读本教程的读者大多已接受过基本的线代课程,对相关概念已有一定认识,此为本教程较高校线代课程占优;
2) 本教程只能够通过文字和图片,不能够面对面教学,此为本教程占劣;
3) 高校线代课程更加系统,有更充足的时间铺垫,本教程需要通过一篇3000字的文章讲清楚课程行进末段中的重难点,此为本教程占劣;
以上仅仅简单罗列,实际上还有很多本教程的潜在劣势。虽然本教程的劣势在数量上占多,但并不见得实际上就占劣,只是希望读者在对比时能够注意到这些区分。
上篇文章评论区有人提到,线代课程没有我说的那么不堪,很多东西老师都讲了,而是学生第一次学习不理解。我自己曾经是学过线代课,所以在面对这种观点时,不仅不赞同,更感到愤怒。因为我的线代老师讲得就是很烂,花了半个学期讲行列式,讲矩阵以后连坐标系都没画过,叫人怎么理解?而我听说的有的老师可能会提,但并不会通过各种方式来帮助学生更好地理解。
我知道这里有个不能“以偏概全”的问题,而我所知道的永远是“偏”。但是我相信我自己的经历,和我描述的现象是有代表性的——国内很多学生都有过类似的经历,而关注我的粉丝可能绝大多数都遭遇过类似的老师。
所以,我也希望大家能够更多地在评论区理性地交流自己的经历和观点,或许你们的发声不能够改变现实的情况,同时你们说再多,或许也说服不了那些看不清现实的人。但是不管你们支持还是反对我,这至少有两个直接的好处:1)让我知道我用心更新各种教程是有意义的,有一部分人也确实需要用心编排的教程,2)看到有意义的话题被讨论和思考,能够改善我的情绪和精神健康。
最后,我知道我上述的教程也仍有很多可以改进的地方,我也会在未来的时光里不停地去改善,因为教程的修改和我对学科概念理解的深入是同步的。同时,我的教程并不全面,并没有涉及很多计算的细节。但是我一直坚信,传授知识没有必要把所有知识都塞给学生,知识的理解是没有办法硬塞的,这种主动权永远在学生自己身上。而好的教程应该是启发性的,它帮助学习者在抓住最本质最核心的东西的同时,促发学习者对相关议题的兴趣,从而使其能够自行探索和学习一些更简单和机械化的“周边”内容。