强撸MIT18.06灰飞烟灭(一)
第一讲:方程组的几何解释
我们从求解线性方程组来开始这门课,从一个普通的例子讲起:方程组有个未知数,一共有个方程,分别来看方程组的“行图像”和“列图像”。
有方程组,写作矩阵形式有,通常我们把第一个矩阵称为系数矩阵,将第二个矩阵称为向量,将第三个矩阵称为向量,于是线性方程组可以表示为。
我们来看行图像,即直角坐标系中的图像:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
x = [-2, 2, -2, 2]
y = [-4, 4, 0.5, 2.5]
fig = plt.figure()
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
plt.plot(x[:2], y[:2], x[2:], y[2:])
plt.draw()
plt.close(fig)
上图是我们都很熟悉的直角坐标系中两直线相交的情况,接下来我们按列观察方程组(我们把第一个向量称作,第二个向量称作,以表示第一列向量和第二列向量),要使得式子成立,需要第一个向量加上两倍的第二个向量,即。
现在来看列图像,在二维平面上画出上面的列向量:
from functools import partial
fig = plt.figure()
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
ax = plt.gca()
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-3, 4)
arrow_vector = partial(plt.arrow, width=0.01, head_width=0.1, head_length=0.2, length_includes_head=True)
arrow_vector(0, 0, 2, -1, color='g')
arrow_vector(0, 0, -1, 2, color='c')
arrow_vector(2, -1, -2, 4, color='b')
arrow_vector(0, 0, 0, 3, width=0.05, color='r')
plt.draw()
plt.close(fig)
如图,绿向量与蓝向量(两倍的蓝绿向量)合成红向量。
接着,我们继续观察,的某种线性组合得到了向量,那么的所有线性组合能够得到什么结果?它们将铺满整个平面。
下面进入三个未知数的方程组:,写作矩阵形式。
在三维直角坐标系中,每一个方程将确定一个平面,而例子中的三个平面会相交于一点,这个点就是方程组的解。
同样的,将方程组写成列向量的线性组合,观察列图像:。易知教授特意安排的例子中最后一个列向量恰巧等于等式右边的向量,所以我们需要的线性组合为。假设我们令,则需要的线性组合为。
我们并不能总是这么轻易的求出正确的线性组合,所以下一讲将介绍消元法——一种线性方程组的系统性解法。
现在,我们需要考虑,对于任意的,是否都能求解?用列向量线性组合的观点阐述就是,列向量的线性组合能否覆盖整个三维向量空间?对上面这个例子,答案是肯定的,这个例子中的是我们喜欢的矩阵类型,但是对另一些矩阵,答案是否定的。那么在什么情况下,三个向量的线性组合得不到?
——如果三个向量在同一个平面上,问题就出现了——那么他们的线性组合也一定都在这个平面上。举个例子,比如,那么不管怎么组合,这三个向量的结果都逃不出这个平面,因此当在平面内,方程组有解,而当不在平面内,这三个列向量就无法构造出。在后面的课程中,我们会了解到这种情形称为奇异、矩阵不可逆。
下面我们推广到九维空间,每个方程有九个未知数,共九个方程,此时已经无法从坐标图像中描述问题了,但是我们依然可以从求九维列向量线性组合的角度解决问题,仍然是上面的问题,是否总能得到?当然这仍取决于这九个向量,如果我们取一些并不相互独立的向量,则答案是否定的,比如取了九列但其实只相当于八列,有一列毫无贡献(这一列是前面列的某种线性组合),则会有一部分无法求得。
接下来介绍方程的矩阵形式,这是一种乘法运算,举个例子,取,来看如何计算矩阵乘以向量:
- 我们依然使用列向量线性组合的方式,一次计算一列,
- 另一种方法,使用向量内积,矩阵第一行向量点乘向量。
教授建议使用第一种方法,将看做列向量的线性组合。
第二讲:矩阵消元
这个方法最早由高斯提出,我们以前解方程组的时候都会使用,现在来看如何使用矩阵实现消元法。
消元法
有三元方程组,对应的矩阵形式为。
按照我们以前做消元法的思路:
-
第一步,我们希望在第二个方程中消去项,来操作系数矩阵,下划线的元素为第一步的主元(pivot):
这里我们先不管向量,等做完的消元可以再做的消元。(这是MATLAB等工具经常使用的算法。)
-
第二步,我们希望在第三个方程中消去项,现在第二行第一个非零元素成为了第二个主元:
注意到第三行消元过后仅剩一个非零元素,所以它就成为第三个主元。做到这里就算消元完成了。
再来讨论一下消元失效的情形:首先,主元不能为零;其次,如果在消元时遇到主元位置为零,则需要交换行,使主元不为零;最后提一下,如果我们把第三个方程前的系数改成,会导致第二步消元时最后一行全部为零,则第三个主元就不存在了,至此消元不能继续进行了,这就是下一讲中涉及的不可逆情况。
-
接下来就该回代(back substitution)了,这时我们在矩阵后面加上向量写成增广矩阵(augmented matrix)的形式:
不难看出,的解已经出现了,此时方程组变为,从第三个方程求出,代入第二个方程求出,再代入第一个方程求出。
消元矩阵
上一讲我们学习了矩阵乘以向量的方法,有三个列向量的矩阵乘以另一个向量,按列的线性组合可以写作。
但现在我们希望用矩阵乘法表示行操作,则有。易看出这里是一个行向量从左边乘以矩阵,这个行向量按行操作矩阵的行向量,并将其合成为一个矩阵行向量的线性组合。
介绍到这里,我们就可以将消元法所做的行操作写成向量乘以矩阵的形式了。
-
消元法第一步操作为将第二行改成,其余两行不变,则有(另外,如果三行都不变,消元矩阵就是单位矩阵,之于矩阵运算相当于之于四则运算。)这个消元矩阵我们记作,即将第二行第一个元素变为零。
-
接下来就是求消元矩阵了,即将第三行第二个元素变为零,则。这就是消元所用的两个初等矩阵(elementary matrix)。
-
最后,我们将这两步综合起来,即,也就是说如果我们想从矩阵直接得到矩阵的话,只需要即可。注意,矩阵乘法虽然不能随意变动相乘次序,但是可以变动括号位置,也就是满足结合律(associative law),而结合律在矩阵运算中非常重要,很多定理的证明都需要巧妙的使用结合律。
既然提到了消元用的初等矩阵,那我们再介绍一种用于置换两行的矩阵:置换矩阵(permutation matrix):例如,置换矩阵将原矩阵的两行做了互换。顺便提一下,如果我们希望交换两列,则有。
我们现在能够将通过行变换写成,那么如何从再变回,也就是求消元的逆运算。对某些“坏”矩阵,并没有逆,而本讲的例子都是“好”矩阵。
逆
现在,我们以为例,,什么矩阵可以取消这次行变换?这次变换是从第二行中减去三倍的第一行,那么其逆变换就是给第二行加上三倍的第一行,所以逆矩阵就是。
我们把矩阵的逆记作,所以有。
第三讲:乘法和逆矩阵
上一讲大概介绍了矩阵乘法和逆矩阵,本讲就来做进一步说明。
矩阵乘法
-
行列内积:有矩阵和矩阵(的总列数必须与的总行数相等),两矩阵相乘有,是一个矩阵,对于矩阵中的第行第列元素,有:
其中是矩阵的第行第列元素,是矩阵的第行第列元素。
可以看出其实是矩阵第行点乘矩阵第列
-
整列相乘:上一讲我们知道了如何计算矩阵乘以向量,而整列相乘就是使用这种线性组合的思想:
上面的运算为的第个列向量右乘矩阵,求得的结果就是矩阵的第列,即的第列是的列向量以的第列作为系数所求得的线性组合,。
-
整行相乘:同样的,也是利用行向量线性组合的思想:
上面的运算为的第个行向量左乘矩阵,求得的结果就是矩阵的第行,即的第行是的行向量以的第行作为系数所求的的线性组合,。
-
列乘以行:用矩阵的列乘以矩阵的行,得到的矩阵相加即可:
注意,是一个向量乘以一个向量,其结果是一个矩阵,而所有的矩阵之和就是计算结果。
-
分块乘法:
在分块合适的情况下,可以简化运算。
逆(方阵)
首先,并不是所有的方阵都有逆;而如果逆存在,则有。教授这里提前剧透,对于方阵,左逆和右逆是相等的,但是对于非方阵(长方形矩阵),其左逆不等于右逆。
对于这些有逆的矩阵,我们称其为可逆的或非奇异的。我们先来看看奇异矩阵(不可逆的):,在后面将要学习的行列式中,会发现这个矩阵的行列式为。
观察这个方阵,我们如果用另一个矩阵乘,则得到的结果矩阵中的每一列应该都是的倍数,所以我们不可能从的乘积中得到单位矩阵。
另一种判定方法,如果存在非零向量,使得,则矩阵不可逆。我们来用上面的矩阵为例:。
证明:如果对于非零的仍有,而有逆,则,即,与题设矛盾,得证。
现在来看看什么矩阵有逆,设,我们来求。,使用列向量线性组合的思想,我们可以说乘以的第列,能够得到的第列,这时我会得到一个关于列的方程组。
接下来介绍高斯-若尔当(Gauss-Jordan)方法,该方法可以一次处理所有的方程:
-
这个方程组为,我们想要同时解这两个方程;
-
构造这样一个矩阵,接下来用消元法将左侧变为单位矩阵;
-
-
于是,我们就将矩阵从变为
而高斯-若尔当法的本质是使用消元矩阵,对进行操作,,利用一步步消元有,进而得到,其实这个消元矩阵就是,而高斯-若尔当法中的只是负责记录消元的每一步操作,待消元完成,逆矩阵就自然出现了。
第四讲: 的 分解
的逆矩阵:
的逆矩阵:
将一个 阶方阵 变换为 需要的计算量估计:
- 第一步,将作为主元,需要的运算量约为
-
以此类推,接下来每一步计算量约为。
-
则将 变换为 的总运算量应为,即。
置换矩阵(Permutation Matrix):
3阶方阵的置换矩阵有6个:
阶方阵的置换矩阵有个。
第五讲:转换、置换、向量空间R
置换矩阵(Permutation Matrix)
为置换矩阵,对任意可逆矩阵有:
阶方阵的置换矩阵有个
对置换矩阵,有
即$P^T = P^{-1}
转置矩阵(Transpose Matrix)
对称矩阵(Symmetric Matrix)
=
对任意矩阵有为对称矩阵:
向量空间(Vector Space)
所有向量空间都必须包含原点(Origin);
向量空间中任意向量的数乘、求和运算得到的向量也在该空间中。
即向量空间要满足加法封闭和数乘封闭。
第六讲:列空间和零空间
对向量子空间和,有也是向量子空间。
对矩阵,矩阵,矩阵,运算:
由的列向量生成的子空间为的列空间;
有非零解当且仅当属于的列空间
A的零空间是中的解组成的集合。
第七讲:求解,主变量,特解
举例:矩阵
,求的特解:
找出主变量(pivot variable):
主变量(pivot variable,下划线元素)的个数为2,即矩阵的秩(rank)为2,即。
主变量所在的列为主列(pivot column),其余列为自由列(free column)。
自由列中的变量为自由变量(free variable),自由变量的个数为。
通常,给自由列变量赋值,去求主列变量的值。如,令求得特解
;
再令求得特解
。
该例还能进一步简化,即将矩阵化简为矩阵(Reduced row echelon form),即简化行阶梯形式。
在简化行阶梯形式中,主元上下的元素都是:
将矩阵中的主变量放在一起,自由变量放在一起(列交换),得到
计算零空间矩阵(nullspace matrix),其列为特解,有。
在本例中
,与上面求得的两个特解一致。
另一个例子,矩阵
矩阵的秩仍为,有个主变量,个自由变量。
同上一例,取自由变量为,求得特解
第八讲:求解:可解性和解的结构
举例,同上一讲:矩阵
,求的特解:
写出其增广矩阵(augmented matrix):
显然,有解的必要条件为。
讨论满足什么条件才能让方程有解(solvability condition on b):当且仅当属于的列空间时。另一种描述:如果的各行线性组合得到行,则端分量做同样的线性组合,结果也为时,方程才有解。
解法:令所有自由变量取,则有
,解得
,代入求得特解
。
令成立的所有解:
即的解集为其特解加上零空间,对本例有:
对于矩阵,有矩阵的秩
列满秩情况:
,,要使有非零解,必须取中各列的线性组合,此时A的零空间中只有向量。
行满秩情况:
,,,因为此时的列空间为,恒成立,组成的零空间的自由变量有n-r个。
行列满秩情况:,如
,则最终可以化简为,其零空间只包含向量。
总结:
第九讲:线性相关性、基、维数
是矩阵的列向量:
如果零空间中有且仅有向量,则各向量线性无关,。
如果存在非零向量使得,则存在线性相关向量,。
向量空间中的一组基(basis),具有两个性质:
- 他们线性无关;
- 他们可以生成。
对于向量空间,如果个向量组成的矩阵为可逆矩阵,则这个向量为该空间的一组基,而数字就是该空间的维数(dimension)。
举例:
,A的列向量线性相关,其零空间中有非零向量,所以。
可以很容易的求得的两个解,如
,根据前几讲,我们知道特解的个数就是自由变量的个数,所以
我们得到:列空间维数,零空间维数
第十讲 四个基本子空间
对于矩阵,有:
-
行空间,基见例1。
-
零空间,自由元所在的列即可组成零空间的一组基。
-
列空间,主元所在的列即可组成列空间的一组基。
-
左零空间,基见例2。
例1,对于行空间
由于我们做了行变换,所以A的列空间受到影响,,而行变换并不影响行空间,所以可以在中看出前两行就是行空间的一组基。
所以,可以得出无论对于矩阵还是,其行空间的一组基,可以由矩阵的前行向量组成(这里的就是第七讲提到的简化行阶梯形式)。
例2,对于左零空间,有,因此得名。
采用Gauss-Jordan消元,将增广矩阵中的部分划为简化行阶梯形式,此时矩阵会将所有的行变换记录下来。
则,而在前几讲中,有当是阶可逆方阵时,即是,所以就是。
本例中
则
很明显,式中的最后一行对的行做线性组合后,得到的最后一行,即向量,也就是。
最后,引入矩阵空间的概念,矩阵可以同向量一样,做求和、数乘。
举例,设所有矩阵组成的矩阵空间为。则上三角矩阵、对称矩阵、对角矩阵(前两者的交集)。
观察一下对角矩阵,如果取
,可以发现,任何三阶对角矩阵均可用这三个矩阵的线性组合生成,因此,他们生成了三阶对角矩阵空间,即这三个矩阵是三阶对角矩阵空间的一组基。
第十一讲:矩阵空间、秩1矩阵和小世界图
矩阵空间
接上一讲,使用矩阵举例,其矩阵空间记为。
则的一组基为:
易得,。
所以可以得出,对上讲中的三阶对称矩阵空间有、上三角矩阵空间有、对角矩阵空间有
求并(intersect):;
求交(sum):;
可以看出:。
另一个例子来自微分方程:
,即
方程的解有:等等()
而该方程的所有解:。
所以,该方程的零空间的一组基为,零空间的维数为。同理可以作为另一组基。
秩一矩阵
矩阵。
且,所有的秩一矩阵都可以划为的形式,这里的均为列向量。
秩一矩阵类似“积木”,可以搭建任何矩阵,如对于一个秩为的矩阵,只需要个秩一矩阵就可以组合出来。
令代表所有,中所有秩矩阵组成的集合并不是一个子空间,通常两个秩四矩阵相加,其结果并不是秩四矩阵。
现在,在空间中有向量,取中满足的所有向量组成一个向量空间,则是一个向量子空间。
易看出,不论是使用系数乘以该向量,或是用两个满足条件的向量相加,其结果仍然落在分量和为零的向量空间中。
求的维数:
从另一个角度看,等价于,则就是的零空间。
,则对其零空间有,则的维数是。
顺便看一下矩阵的四个基本子空间:
行空间:,其中的一组基是;
零空间:,其中的一组基是
列空间:,其中一组基是,可以看出列空间就是整个空间。
左零空间:,因为转置后没有非零的可以使成立,就是。
综上,
小世界图
图(graph)由节点(node)与边(edge)组成。
假设,每个人是图中的一个节点,如果两个人为朋友关系,则在这两个人的节点间添加一条边,通常来说,从一个节点到另一个节点只需要不超过步(即六条边)即可到达。
第十二讲:图和网络
图和网络
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline
dg = nx.DiGraph()
dg.add_edges_from([(1,2), (2,3), (1,3), (1,4), (3,4)])
edge_labels = {(1, 2): 1, (1, 3): 3, (1, 4): 4, (2, 3): 2, (3, 4): 5}
pos = nx.spring_layout(dg)
nx.draw_networkx_edge_labels(dg,pos,edge_labels=edge_labels, font_size=16)
nx.draw_networkx_labels(dg, pos, font_size=20, font_color='w')
nx.draw(dg, pos, node_size=1500, node_color="gray")
该图由4个节点与5条边组成,
我们可以建立矩阵
观察前三行,易看出这三个行向量线性相关,也就是这三个向量可以形成回路(loop)。
现在,解:
。
展开得到:
引入矩阵的实际意义:将设为各节点电势(Potential at the Nodes)。
则式子中的诸如的元素,可以看做该边上的电势差(Potential Differences)。
容易看出其中一个解,即等电势情况,此时电势差为。
化简易得,所以其零空间维数应为,即就是其零空间的一组基。
其零空间的物理意义为,当电位相等时,不存在电势差,图中无电流。
当我们把图中节点接地后,节点上的电势为,此时的
,各列线性无关,。
现在看看(这是应用数学里最常用的式子):
,对于转置矩阵有。
接着说上文提到的的电势差,矩阵将电势差与电流联系起来,电流与电势差的关系服从欧姆定律:边上的电流值是电势差的倍数,这个倍数就是边的电导(conductance)即电阻(resistance)的倒数。
,而的另一个名字叫做“基尔霍夫电流定律”(Kirchoff's Law, 简称KCL)。
再把图拿下来观察:
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline
dg = nx.DiGraph()
dg.add_edges_from([(1,2), (2,3), (1,3), (1,4), (3,4)])
edge_labels = {(1, 2): 1, (1, 3): 3, (1, 4): 4, (2, 3): 2, (3, 4): 5}
pos = nx.spring_layout(dg)
nx.draw_networkx_edge_labels(dg,pos,edge_labels=edge_labels, font_size=16)
nx.draw_networkx_labels(dg, pos, font_size=20, font_color='w')
nx.draw(dg, pos, node_size=1500, node_color="gray")
将中的方程列出来:
对比看的第一个方程,,可以看出这个方程是关于节点上的电流的,方程指出节点上的电流和为零,基尔霍夫定律是一个平衡方程、守恒定律,它说明了流入等于流出,电荷不会在节点上累积。
对于,有上文得出其零空间的维数是,则零空间的基应该有两个向量。
- 现在假设,也就是令安培的电流在边上流动;
- 由图看出也应该为;
- 再令,也就是让安培的电流流回节点;
- 令;
得到一个符合KCL的向量,代回方程组发现此向量即为一个解,这个解发生在节点组成的回路中,该解即为零空间的一个基。
根据上一个基的经验,可以利用组成的节点求另一个基:
- 令;
- 令;
- 由图得;
- 令;
得到令一个符合KCL的向量,代回方程可知此为另一个解。
则的一组基为。
看图,利用节点组成的大回路(即边):
- 令;
- 令;
- 则由图得;
得到符合KCL的向量,易看出此向量为求得的两个基之和。
接下来观察的行空间,即的列空间,方便起见我们直接计算
的列空间。
易从基的第一个向量看出前三列的线性相关,则的主列为第列,对应在图中就是边,可以发现这三条边没有组成回路,则在这里可以说线性无关等价于没有回路。由个节点与条边组成的图没有回路,就表明的对应列向量线性无关,也就是节点数减一()条边线性无关。另外,没有回路的图也叫作树(Tree)。
再看左零空间的维数公式:,左零空间的维数就是相互无关的回路的数量,于是得到,整理得:
此等式对任何图均有效,任何图都有此拓扑性质,这就是著名的欧拉公式(Euler's Formula)。便于记忆。
总结:
- 将电势记为,则在引入电势的第一步中,有;
- 电势差导致电流产生,;
- 电流满足基尔霍夫定律方程,;
这些是在无电源情况下的方程。
电源可以通过:在边上加电池(电压源),或在节点上加外部电流 两种方式接入。
如果在边上加电池,会体现在中;如果在节点上加电流,会体现在中,向量就是外部电流。
将以上三个等式连起来得到。另外,最后一个方程是一个平衡方程,还需要注意的是,方程仅描述平衡状态,方程并不考虑时间。最后,是一个对称矩阵。
第十三讲:复习一
-
令是空间内的非零向量:则生成的向量空间可能是维的。
-
有一个矩阵,该矩阵为阶梯矩阵(echelon form),有个主元:则能够得到该矩阵的秩为,即三列向量线性无关,不存在非零向量使得三列的线性组合为零向量,所以该矩阵的零空间应为。
-
接上一问,有一个矩阵,则化为最简形式(阶梯矩阵)应为,。
-
接上一问,有一个矩阵型为,则化为最简形式应为,。矩阵为矩阵,。
-
有,并且,则等号右侧向量的列数应为的行数,且解的列数应为的列数,所以是一个矩阵。从解的结构可知自由元有两个,则。从解的第一个向量得出,矩阵的第一列是;解的第二个向量在零空间中,说明第二列与第一列符号相反,所以矩阵第二列是;解的第三个向量在零空间中,说明第三列为零向量;综上,。
-
接上一问,如何使得有解?即使在矩阵的列空间中。易知的列空间型为,所以使为向量的倍数即可。
-
有一方阵的零空间中只有零向量,则其左零空间也只有零向量。
-
由矩阵组成的矩阵空间,其中的可逆矩阵能否构成子空间?两个可逆矩阵相加的结果并不一定可逆,况且零矩阵本身并不包含在可逆矩阵中。其中的奇异矩阵(singular matrix,非可逆矩阵)也不能组成子空间,因为其相加的结果并不一定能够保持不可逆。
-
如果,并不能得出,反例:,这个矩阵经常会被用作反例。
-
矩阵的列向量线性无关,则是否有解?是的,因为方阵各列线性无关,所以方阵满秩,它是可逆矩阵,肯定有解。
-
有
,在不解出的情况下,求的零空间。可以观察得出前一个矩阵是可逆矩阵,设,则求零空间,而是可逆矩阵,则等式两侧同时乘以有,所以当为可逆矩阵时,有,即左乘逆矩阵不会改变零空间。本题转化为求的零空间,的基为
,也就是 -
接上题,求的通解。观察,易得矩阵的第一列为,恰好与等式右边一样,所以可以作为通解中的特解部分,再利用上一问中求得的零空间的基,得到通解
-
对于任意方阵,其行空间等于列空间?不成立,可以使用作为反例,其行空间是向量的任意倍数,而列空间是向量的任意倍数。但是如果该方阵是对称矩阵,则成立。
-
与的四个基本子空间相同。
-
如果的四个基本子空间相同,则互为倍数关系。不成立,如任意两个阶可逆矩阵,他们的列空间、行空间均为,他们的零空间、左零空间都只有零向量,所以他们的四个基本子空间相同,但是并不一定具有倍数关系。
-
如果交换矩阵的某两行,则其行空间与零空间保持不变,而列空间与左零空间均已改变。
-
为什么向量不能同时出现在矩阵的行空间与零空间中?令,很明显矩阵中不能出现值为的行向量,否则无法形成等式右侧的零向量。这里引入正交(perpendicular)的概念,矩阵的行空间与零空间正交,它们仅共享零向量。
第十四讲:正交向量与子空间
在四个基本子空间中,提到对于秩为r的矩阵,其行空间()与零空间()同属于空间,其列空间()与左零空间(=m-r)同属于空间。
对于向量,当即时,有向量正交(vector orthogonal)。
毕达哥拉斯定理(Pythagorean theorem)中提到,直角三角形的三条边满足:
由此得出,两正交向量的点积为。另外,可以为向量,由于向量与任意向量的点积均为零,所以向量与任意向量正交。
举个例子:
,有,而。
向量与向量正交,则意味着中的每一个向量都与中的每一个向量正交。若两个子空间正交,则它们一定不会相交于某个非零向量。
现在观察行空间与零空间,零空间是的解,即若在零空间,则为零向量;
而对于行空间,有 ,可以看出:
所以这个等式告诉我们,同中的所有行正交;
接下来还验证是否与中各行的线性组合正交,
,各式相加得,得证。
我们可以说,行空间与零空间将分割为两个正交的子空间,同样的,列空间与左零空间将分割为两个正交的子空间。
举例,,则可知。
有,解得零空间的一组基。
而行空间的一组基为,零空间与行空间正交,在本例中行空间也是零空间的法向量。
补充一点,我们把行空间与零空间称为维空间里的正交补(orthogonal complement),即零空间包含了所有与行空间正交的向量;同理列空间与左零空间为维空间里的正交补,即左零空间包含了所有与零空间正交的向量。
接下来看长方矩阵,。对于这种矩阵,中经常混入一些包含“坏数据”的方程,虽然可以通过筛选的方法去掉一些我们不希望看到的方程,但是这并不是一个稳妥的方法。
于是,我们引入一个重要的矩阵:。这是一个矩阵点乘矩阵,其结果是一个矩阵,应该注意的是,这也是一个对称矩阵,证明如下:
这一章节的核心就是,这个变换可以将“坏方程组”变为“好方程组”。
举例,有,只有当在矩阵的列空间时,方程才有解。
现在来看,可以看出此例中是可逆的。然而并非所有都是可逆的,如(注意到这是两个秩一矩阵相乘,其结果秩不会大于一)
先给出结论:
下一讲涉及投影,很重要。
第十五讲:子空间投影
从空间讲起,有向量,做在上的投影,如图:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use("seaborn-dark-palette")
fig = plt.figure()
plt.axis('equal')
plt.axis([-7, 7, -6, 6])
plt.arrow(-4, -1, 8, 2, head_width=0.3, head_length=0.5, color='r', length_includes_head=True)
plt.arrow(0, 0, 2, 4, head_width=0.3, head_length=0.5, color='b', length_includes_head=True)
plt.arrow(0, 0, 48/17, 12/17, head_width=0.3, head_length=0.5, color='gray', length_includes_head=True)
plt.arrow(48/17, 12/17, 2-48/17, 4-12/17, head_width=0.3, head_length=0.5, color='g', length_includes_head=True)
# plt.plot([48/17], [12/17], 'o')
# y=1/4x
# y=-4x+12
# x=48/17
# y=12/17
plt.annotate('b', xy=(1, 2), xytext=(-30, 15), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->"))
plt.annotate('a', xy=(-1, -0.25), xytext=(15, -30), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->"))
plt.annotate('e=b-p', xy=(2.5, 2), xytext=(30, 0), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->"))
plt.annotate('p=xa', xy=(2, 0.5), xytext=(-20, -40), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->"))
plt.grid()
plt.close(fig)
从图中我们知道,向量就像是向量之间的误差,。在上,有。
所以有。关于正交的最重要的方程:
从上面的式子可以看出,如果将变为则也会翻倍,如果将变为则不变。
设投影矩阵为,则可以说投影矩阵作用与某个向量后,得到其投影向量,。
易看出,若是维列向量,则是一个矩阵。
观察投影矩阵的列空间,是一条通过的直线,而(一列乘以一行:,而这一列向量是该矩阵的基)。
投影矩阵的性质:
- ,投影矩阵是一个对称矩阵。
- 如果对一个向量做两次投影,即,则其结果仍然与相同,也就是。
为什么我们需要投影?因为就像上一讲中提到的,有些时候无解,我们只能求出最接近的那个解。
总是在的列空间中,而却不一定,这是问题所在,所以我们可以将变为的列空间中最接近的那个向量,即将无解的变为求有解的(是在的列空间中的投影,不再是那个不存在的,而是最接近的解)。
现在来看中的情形,将向量投影在平面上。同样的,是向量在平面上的投影,是垂直于平面的向量,即在平面法方向的分量。
设平面的一组基为,则投影向量,我们更倾向于写作,这里如果我们求出,则该解就是无解方程组最近似的解。
现在问题的关键在于找,使它垂直于平面,因此我们得到两个方程
,将方程组写成矩阵形式
,即。
比较该方程与中的投影方程,发现只是向量变为矩阵而已,本质上就是。所以,在的零空间中(),从前面几讲我们知道,左零空间列空间,则有,与我们设想的一致。
再化简方程得,比较在中的情形,是一个数字而是一个阶方阵,而解出的可以看做两个数字的比值。现在在中,我们需要再次考虑:什么是?投影是什么?投影矩阵又是什么?
- 第一个问题:;
- 第二个问题:,回忆在中的情形,下划线部分就是原来的;
- 第三个问题:易看出投影矩阵就是下划线部分。
这里还需要注意一个问题,是不能继续化简为的,因为这里的并不是一个可逆方阵。
也可以换一种思路,如果是一个阶可逆方阵,则的列空间是整个空间,于是在上的投影矩阵确实变为了,因为已经在空间中了,其投影不再改变。
再来看投影矩阵的性质:
- :有
,而是对称的,所以其逆也是对称的,所以有,得证。 - :有
,得证。
最小二乘法
接下看看投影的经典应用案例:最小二乘法拟合直线(least squares fitting by a line)。
我们需要找到距离图中三个点 偏差最小的直线:。
plt.style.use("seaborn-dark-palette")
fig = plt.figure()
plt.axis('equal')
plt.axis([-1, 4, -1, 3])
plt.axhline(y=0, c='black', lw='2')
plt.axvline(x=0, c='black', lw='2')
plt.plot(1, 1, 'o', c='r')
plt.plot(2, 2, 'o', c='r')
plt.plot(3, 2, 'o', c='r')
plt.annotate('(1, 1)', xy=(1, 1), xytext=(-40, 20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('(2, 2)', xy=(2, 2), xytext=(-60, -5), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('(3, 2)', xy=(3, 2), xytext=(-18, 20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.grid()
plt.close(fig)
根据条件可以得到方程组
,写作矩阵形式
,也就是我们的,很明显方程组无解。但是有解,于是我们将原是两边同时乘以后得到的新方程组是有解的,也是最小二乘法的核心方程。
下一讲将进行最小二乘法的验算。
第十六讲:投影矩阵和最小二乘
上一讲中,我们知道了投影矩阵,将会把向量投影在的列空间中。
举两个极端的例子:
- 如果,则;
- 如果,则。
一般情况下,将会有一个垂直于的分量,有一个在列空间中的分量,投影的作用就是去掉垂直分量而保留列空间中的分量。
在第一个极端情况中,如果则有。带入投影矩阵,得证。
在第二个极端情况中,如果则有,即。则,得证。
向量投影后,有,这里的是在中的分量,而是在中的分量。
回到上一讲最后提到的例题:
我们需要找到距离图中三个点 偏差最小的直线:。
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn import linear_model
import numpy as np
import pandas as pd
import seaborn as sns
x = np.array([1, 2, 3]).reshape((-1,1))
y = np.array([1, 2, 2]).reshape((-1,1))
predict_line = np.array([-1, 4]).reshape((-1,1))
regr = linear_model.LinearRegression()
regr.fit(x, y)
ey = regr.predict(x)
fig = plt.figure()
plt.axis('equal')
plt.axhline(y=0, c='black')
plt.axvline(x=0, c='black')
plt.scatter(x, y, c='r')
plt.scatter(x, regr.predict(x), s=20, c='b')
plt.plot(predict_line, regr.predict(predict_line), c='g', lw='1')
[ plt.plot([x[i], x[i]], [y[i], ey[i]], 'r', lw='1') for i in range(len(x))]
plt.annotate('(1, 1)', xy=(1, 1), xytext=(-15, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('(2, 2)', xy=(2, 2), xytext=(-60, -5), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('(3, 2)', xy=(3, 2), xytext=(-15, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('$e_1$', color='r', xy=(1, 1), xytext=(0, 2), textcoords='offset points', size=20)
plt.annotate('$e_2$', color='r', xy=(2, 2), xytext=(0, -15), textcoords='offset points', size=20)
plt.annotate('$e_3$', color='r', xy=(3, 2), xytext=(0, 1), textcoords='offset points', size=20)
plt.annotate('$p_1$', xy=(1, 7/6), color='b', xytext=(-7, 30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('$p_2$', xy=(2, 5/3), color='b', xytext=(-7, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.annotate('$p_3$', xy=(3, 13/6), color='b', xytext=(-7, 30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->"))
plt.draw()
plt.close(fig)
根据条件可以得到方程组
,写作矩阵形式
,也就是我们的,很明显方程组无解。
我们需要在的三个分量上都增加某个误差,使得三点能够共线,同时使得最小,找到拥有最小平方和的解(即最小二乘),即最小。此时向量变为向量(在方程组有解的情况下,,即在的列空间中,误差为零。)我们现在做的运算也称作线性回归(linear regression),使用误差的平方和作为测量总误差的标准。
注:如果有另一个点,如,在本例中该点明显距离别的点很远,最小二乘将很容易被离群的点影响,通常使用最小二乘时会去掉明显离群的点。
现在我们尝试解出与。
写作方程形式为,也称作正规方程组(normal equations)。
回顾前面提到的“使得误差最小”的条件,,使该式取最小值,如果使用微积分方法,则需要对该式的两个变量分别求偏导数,再令求得的偏导式为零即可,正是我们刚才求得的正规方程组。(正规方程组中的第一个方程是对求偏导的结果,第二个方程式对求偏导的结果,无论使用哪一种方法都会得到这个方程组。)
解方程得,则“最佳直线”为,带回原方程组解得,即
于是我们得到,易看出,同时我们发现即。
误差向量不仅垂直于投影向量,它同时垂直于列空间,如 。
接下来我们观察,如果的各列线性无关,求证是可逆矩阵。
先假设,两边同时乘以有,即。一个矩阵乘其转置结果为零,则这个矩阵也必须为零(相当于长度的平方)。则,结合题设中的“的各列线性无关”,可知,也就是的零空间中有且只有零向量,得证。
我们再来看一种线性无关的特殊情况:互相垂直的单位向量一定是线性无关的。
- 比如,这三个正交单位向量也称作标准正交向量组(orthonormal vectors)。
- 另一个例子
下一讲研究标准正交向量组。
第十七讲:正交矩阵和Gram-Schmidt正交化法
标准正交矩阵
定义标准正交向量(orthonormal):
我们将标准正交向量放入矩阵中,有。
上一讲我们研究了的特性,现在来观察
根据标准正交向量的定义,计算,我们也把成为标准正交矩阵(orthonormal matrix)。
特别的,当恰好是方阵时,由于正交性,易得是可逆的,又,所以。
- 举个置换矩阵的例子:,则,易得。
- 使用上一讲的例子,列向量长度为,且列向量相互正交。
- 其他例子,列向量长度为,且列向量相互正交。
- 使用上一个例子的矩阵,令,取合适的另列向量长度为也可以构造标准正交矩阵:,这种构造方法以阿德玛(Adhemar)命名,对阶矩阵有效。
- 再来看一个例子,,列向量长度为,且列向量相互正交。格拉姆-施密特正交化法的缺点在于,由于要求得单位向量,所以我们总是除以向量的长度,这导致标准正交矩阵中总是带有根号,而上面几个例子很少有根号。
再来看标准正交化有什么好处,假设要做投影,将向量投影在标准正交矩阵的列空间中,根据上一讲的公式得,易得。我们断言,当列向量为标准正交基时,是投影矩阵。极端情况,假设矩阵是方阵,而其列向量是标准正交的,则其列空间就是整个向量空间,而投影整个空间的投影矩阵就是单位矩阵,此时。可以验证一下投影矩阵的两个性质:,得证;,得证。
我们计算的,现在变为,也就是,分解开来看就是 ,这个式子在很多数学领域都有重要作用。当我们知道标准正交基,则解向量第个分量为基的第个分量乘以,在第个基方向上的投影就等于。
Gram-Schmidt正交化法
我们有两个线性无关的向量,先把它们化为正交向量,再将它们单位化,变为单位正交向量:
- 我们取定向量的方向,;
- 接下来将投影在的法方向上得到,也就是求子空间投影一讲中,我们提到的误差向量,即。检验一下,。(就是。)
如果我们有三个线性无关的向量,则我们现需要求它们的正交向量,再将它们单位化,变为单位正交向量:
- 前两个向量我们已经得到了,我们现在需要求第三个向量同时正交于;
- 我们依然沿用上面的方法,从中减去其在上的分量,得到正交与的:。
现在我们试验一下推导出来的公式,:
- 则;
- 根据公式有,是比值,则。验证一下正交性有。
- 单位化,,则标准正交矩阵为,对比原来的矩阵,有的列空间是相同的,我们只是将原来的基标准正交化了。
我们曾经用矩阵的眼光审视消元法,有。同样的,我们也用矩阵表达标准正交化,。设矩阵有两个列向量,则标准正交化后有,而左下角的始终为,因为Gram-Schmidt正交化总是使得,后来构造的向量总是正交于先前的向量。所以这个矩阵是一个上三角矩阵。
第十八讲:行列式及其性质
本讲我们讨论出行列式(determinant)的性质:
-
,单位矩阵行列式值为一。
-
交换行行列式变号。
在给出第三个性质之前,先由前两个性质可知,对置换矩阵有。
举例:,于是我们猜想,对于二阶方阵,行列式的计算公式为。
-
a. 。
b. 。
注意:
这里并不是指,方阵相加会使每一行相加,这里仅是针对某一行的线性变换。 -
如果两行相等,则行列式为零。使用性质2交换两行易证。
-
从第行中减去第行的倍,行列式不变。这条性质是针对消元的,我们可以先消元,将方阵变为上三角形式后再计算行列式。
举例:
-
如果方阵的某一行为零,则其行列式值为零。使用性质3.a对为零行乘以不为零系数,使即可证明;或使用性质5将某行加到为零行,使存在两行相等后使用性质4即可证明。
-
有上三角行列式,则。使用性质5,从最后一行开始,将对角元素上方的元素依次变为零,可以得到型为的对角行列式,再使用性质3将对角元素提出得到,得证。
-
当矩阵为奇异矩阵时,;当且仅当可逆时,有。如果矩阵可逆,则化简为上三角形式后各行都含有主元,行列式即为主元乘积;如果矩阵奇异,则化简为上三角形式时会出现全零行,行列式为零。
再回顾二阶情况:,前面的猜想得到证实。
-
。使用这一性质,,所以。
同时还可以得到:,以及,这个式子就像是求体积,对三维物体有每边翻倍则体积变为原来的八倍。
-
,前面一直在关注行的属性给行列式带来的变化,有了这条性质,行的属性同样适用于列,比如对性质2就有“交换列行列式变号”。
证明:,值得注意的是,的行列式并不因为转置而改变,得证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!