资讯详情

资讯详情

行列式深入理解:从几何意义到矩阵可逆与深度学习应用

1. 行列式到底在解答什么问题先说个我自己的体会李宏毅老师的线性代数课一开始讲行列式Determinant缩写det的时候很多同学其实是懵的。前面刚学完向量、矩阵、线性组合、线性方程组的几何意义怎么突然跳到一长串看起来很像从天上掉下来的展开公式了学完一遍会算二阶三阶能应付考试但要问一句行列式到底是什么十有八九说不清楚。所以我这篇笔记想换个角度来梳理先不急着背公式而是先把行列式放在整个线性代数的问题链条里看搞清楚它到底在帮我们解决什么问题。行列式解决的第一类问题是判断一个方阵是否可逆。一个方阵A如果存在逆矩阵A⁻¹那么它对应的线性变换就是可逆的——换句话说这个变换没有把高维信息压扁没有造成不可逆的信息丢失。怎么判断最直接的办法就是看det(A)是否等于0。det(A)≠0方阵可逆det(A)0方阵不可逆也叫奇异矩阵。为什么行列式能承担这个任务这里必须回头看线代里最核心的视角——矩阵是线性变换。一个矩阵左乘一个向量实际上就是把那个向量做了伸缩、旋转、反射这类操作。而行列式的绝对值恰好就是这个变换对空间的体积缩放比例。比如二阶行列式的几何意义是面积缩放三阶行列式的几何意义是体积缩放。如果一个变换把二维的整个平面压到一条线或者把三维空间压到一个平面上那面积或体积就变成了0这个变换自然是不可逆的——你没法从一条线或一个平面还原出原来的二维、三维信息。所以det0对应的就是矩阵把空间压扁了压扁了就没法还原也就是不可逆。行列式解决的第二类问题是给线性方程组的存在性和唯一性一个判别式。我们在学克拉默法则Cramers Rule的时候会看到对于n元线性方程组如果系数矩阵的行列式不等于0那么方程组有唯一解。这本质上跟可逆性是同一个问题Axb如果A可逆那xA⁻¹b就是唯一解。所以行列式其实是把方程组有没有唯一解这个问题转化成了一个具体可计算的量。第三类问题就更贴近实际应用了特征值的计算。n阶方阵的特征值本质上就是特征方程det(A−λI)0的根。虽然实际工程里计算大型矩阵特征值不会用行列式展开去硬算但行列式这个概念本身是理解特征值、特征向量、矩阵对角化这些进阶内容的逻辑前提。这块逻辑想清楚了再看后面这些看起来像是规则堆砌的计算方法、性质就不会觉得是死记硬背了——行列式的所有展开公式、所有性质本质上都是围绕如何有效计算这个体积缩放比例展开的。2. 行列式的几何直觉是怎么竖起来的2.1 二阶行列式与平行四边形的面积大多数教材在引入行列式时都会从二阶行列式开始det(A) |a b; c d| ad − bc然后告诉你它是面积。但这个面积是怎么对应的我当时一直没搞明白为什么偏偏是ad−bc这个表达式。直到我把矩阵的两行或者两列分别看作两个向量。以第1行(a, b)和第2行(c, d)为例这两个向量从原点出发会张成一个平行四边形。这个平行四边形的有向面积恰好就是ad−bc。我建议你自己动手验一下这个结论。取两个向量u(1, 2)v(3, 1)按照公式det 1×1 − 2×3 1 − 6 −5算出来是负数但面积应该是正的5。这个负号是有含义的它告诉我们u到v的旋转方向是顺时针还是逆时针。如果det0说明从u到v的旋转方向是逆时针右手系如果det0则是顺时针左手系。所以绝对值代表大小符号代表方向这就是为什么叫有向面积。说实话李宏毅老师把这部分讲得很快但我觉得这个几何直觉是所有后续理解的基石。因为三阶行列式的体积缩放、雅可比行列式的换元比例、特征值分解里的特征向量的拉伸比——所有这些高级概念源头都是这个最简单、可视化的平行四边形的面积。2.2 三阶行列式与平行六面体的体积到了三阶行列式直观上更复杂一些但逻辑是二阶的顺延。三阶行列式的三个行向量或列向量在三维空间里张成一个平行六面体行列式的值就是这个平行六面体的有向体积。这个理解在实际解题中很有用。比如有些题目会直接问判断三个向量是否共面。三个向量共面意味着它们张成的平行六面体体积是0也就是三阶行列式等于0。这其实是三维空间中判断向量共面最干净利落的方法比硬凑线性组合要省事得多。我在自学这部分的时候也刻意画了个三维坐标系来辅助理解。平行六面体的底面由两个向量张成第三个向量的垂直分量决定高度。行列式的值就是底面积×高。如果第三个向量恰好躺在底面所在的平面里高度就是0体积也是0行列式也就是0。这个几何图像比记住det0则三向量共面这句话要深刻得多。但别忘了行列式还有一个更宏大的视角它度量的是线性变换前后体积的缩放比例。A是某个线性变换矩阵区域S经过变换后的体积等于原来S的体积乘以|det(A)|。这个结论在多元积分的变量替换、概率密度变换、深度学习里的标准化流模型中反复出现是所有应用背后统一的那条线。3. 行列式的展开法则从拉普拉斯展开到消元策略3.1 用逆序数严格定义行列式在学行列式的时候教材里会引入逆序数的概念然后把行列式写成一大串排列求和的形式。我最初觉得这纯粹是数学家的自嗨跟实际计算毫无关系。但后来看李宏毅老师的推导加上自己做题的经验才发现如果没有这个严格定义后面所有关于行列式性质的理解都站不住脚。n阶行列式的定义是所有取自不同行不同列的n个元素的乘积按照行指标的自然顺序排列列指标构成一个排列然后乘以(−1)的逆序数次幂最后求和。这个定义翻译成人话就是你从矩阵里每行选一个、每列选一个凑一个不冲突的乘积然后把所有这样的乘积加起来。每一项前面的正负号由这个选择的列排列的逆序数决定。逆序数是偶数则取正号奇数则取负号。这个定义一开始非常劝退但它其实只回答了一个问题那么多项每一项该加还是该减逆序数就是那个决定正负的裁判。记住这一点后面学习行列式的性质时很多奇怪规则就有了推导的根基。3.2 三阶行列式对角线法则到底为什么有效三阶行列式的展开很多人直接记对角线法则也叫萨鲁斯法则主对角线方向三条线加副对角线方向三条线减。这个法则非常好用但要提醒一句它只对二阶、三阶成立到了四阶以上就完全失效了。原因很简单——萨鲁斯法则本质上是把三阶的6个展开项按照几何位置硬凑成三加三减的模式但四阶行列式有24个展开项根本不可能用几条对角线装下。那我个人是怎么处理三阶行列式计算的说实话我考试做题时也直接用对角线法则因为它快。但我会在心里清楚这个法则背后的严格依据是拉普拉斯展开不是某种神奇的对角线规律。这样万一题目是四阶的我就不会因为惯性思维把对角线法则硬套上去。三阶的具体展开式这里默写一遍便于没有课本的读者直接对照| a11 a12 a13; a21 a22 a23; a31 a32 a33 | a11a22a33 a12a23a31 a13a21a32 − a13a22a31 − a12a21a33 − a11a23a32对角线法则的三加三减就是这六个项在矩阵位置上的直观投影。我建议你亲手按逆序数定义把这三项的符号验一遍不求全验证两三项就知道这个规则完全自洽了。3.3 拉普拉斯展开是通用的计算策略四阶及以上的行列式最通用的手工计算方法是拉普拉斯展开也常称为按行/列展开。拉普拉斯展开的本质是降维打击n阶行列式可以拆成n个(n−1)阶行列式的代数和。具体地选定第i行行列式等于第i行每个元素乘以它对应的代数余子式再求和。代数余子式Aij的定义是去掉第i行第j列后剩下矩阵的行列式再乘以(−1)^(ij)。举个例子。计算下面这个3阶行列式| 1 2 3 | | 4 5 6 | | 7 8 9 |按第1行展开det 1×(−1)^(11)×det|5 6; 8 9| 2×(−1)^(12)×det|4 6; 7 9| 3×(−1)^(13)×det|4 5; 7 8| 1×(45−48) − 2×(36−42) 3×(32−35) 1×(−3) − 2×(−6) 3×(−3) −3 12 − 9 0这个矩阵的行列式为0说明它的三个行向量线性相关。实际上这个矩阵第三行是前两行的线性组合第三行第二行×2−第一行所以行列式为0是符合预期的。拉普拉斯展开选哪一行或者哪一列是有策略的。最优先的选择是挑0最多的行或列展开因为0元素对应的项直接就是0不用算。如果某一行有3个零那本来要算4个三阶子行列式现在只需要算1个计算量立刻降下来。3.4 先化简再展开实用套路不过拉普拉斯展开本身的计算量还是很大。四阶行列式直接展开要算4个三阶五阶要算5个四阶每一个四阶又拆4个三阶总共20个三阶行列式。这个计算量在考试中是不现实的。所以实际解题一定是以性质化简为主拉普拉斯展开为辅。具体套路很简单用行变换或列变换把某一行或列化成只有一个非零元素对这一行做拉普拉斯展开得到低一阶的行列式重复以上过程直到变成二阶或三阶这个套路的前提是理解初等行变换对行列式值的影响。这一步很多人会出错我单独拿出来说。4. 行列式的性质它们是用来化简的不是用来背的4.1 三条初等变换的核心规则要化简行列式就必须知道三类初等变换会怎样改变行列式的值。这块儿的学习我强烈建议不要死记结论而是用二阶行列式把每条性质验一遍一旦知道怎么回事就不容易忘了。性质一交换两行或两列行列式变号。这个对应到二阶就是|a b; c d|ad−bc交换两行变成|c d; a b|cb−da−(ad−bc)。换两行相当于改变了有向面积的方向所以符号翻转。实际操作中每做一次换行或换列要在草稿纸上记住行列式前面多了一个负号。性质二某一行或列乘以一个常数k行列式变成原来的k倍。注意这里和矩阵不同矩阵某行乘k这个矩阵本身变了但那个缩放比例也变了。这从几何上也很好理解把平行四边形的一条边拉长k倍面积自然变成原来的k倍。性质三把某一行列的k倍加到另一行列行列式不变。这就是所谓的倍加行变换不改变行列式。这个性质在化简时用得最多因为它可以帮助我们在不改变行列式值的前提下把某个位置下面的元素全部消成0从而化简。很多教材会直接用这一条完成高斯消元。上述三条规则对应的实际意义是倍加操作是最安全的因为它完全不改变行列式的值数乘要注意把倍数提到行列式外面记得最后乘回去换行则一定要记得变号。把这三点刻在脑子里化简行列式基本就不会出错了。4.2 上三角化求行列式行列式一个非常常用的结论是上三角矩阵的行列式等于主对角线元素的乘积。这个结论的本质是上三角矩阵左下角全是0按第1列展开一路滚下去最后只剩对角线元素的乘积。实际计算时我一般会先把任意方阵经过倍加行变换化成上三角形式然后把对角线相乘再处理之前换行引入的符号问题。整个过程可以用一个例子来巩固。求下面这个矩阵的行列式| 1 2 3 | | 4 5 6 | | 7 8 9 |第1行乘以−4加到第2行得到新的第2行(0, −3, −6)。第1行乘以−7加到第3行得到新的第3行(0, −6, −12)。现在矩阵变成| 1 2 3 | | 0 −3 −6 | | 0 −6 −12 |再对第2行做操作第2行乘以−2加到第3行得到新的第3行(0, 0, 0)。矩阵变为上三角| 1 2 3 | | 0 −3 −6 | | 0 0 0 |行列式 1×(−3)×0 0。这与前面拉普拉斯展开结果一致。这个例子其实是故意选了一个行列式为0的矩阵因为它能直观说明一个点如果通过倍加行变换某一行被消成全0那行列式一定是0对应矩阵不可逆、行向量线性相关。4.3 性质背后的本质把行列式的性质放在一起看你会发现它们其实是围绕体积这个几何概念的。交换行是改变了空间的定向所以符号变号某行乘k是拉伸了某条边所以体积按k倍变化倍加行变换是剪切变换它不改变面积和体积所以行列式不变。我学这一节的时候最大的感受是当你能用几何直觉去解释这些性质时行列式的性质就不需要背了。反而那些只记住了公式、没有建立几何图像的人做题时很容易把性质搞混。5. 行列式的两大出圈应用可逆性判定与伴随矩阵5.1 用行列式快速判断方阵是否可逆行列式最直接的应用就是判定方阵的可逆性。我之前在学矩阵逆的时候第一次看到det(A)≠0则A可逆这个结论时觉得这是在兜圈子——我先要算行列式才能判断能不能用公式求逆那为什么不直接把矩阵塞进高斯消元法里试一下后来我才意识到行列式判断可逆性和高斯消元法判断可逆性应用场景完全不同。如果你只是要求一个具体的逆矩阵高斯消元对增广矩阵[A|I]做行变换是首选。但如果需要判断的是带有参数的矩阵的逆是否存在或者需要在理论上证明某个结论行列式就方便得多。举个例子。判断矩阵| λ 1 | | 2 λ |是否可逆。直接算行列式λ² − 2。要让它不可逆就得让λ² − 2 0也就是λ ±√2。整个问题变成一个简单的带参行列式计算。如果强行用高斯消元法讨论λ的取值步骤繁琐不说还容易漏掉边界情况。5.2 伴随矩阵法求逆行列式还提供了另一种求逆矩阵的方法——伴随矩阵法。公式是A⁻¹ (1/det(A)) × adj(A)其中adj(A)是A的伴随矩阵其第(i, j)个元素等于A的第(j, i)个元素的代数余子式。注意这里下标是反过来的先算代数余子式再转置。这个方法在理论上非常优雅但实际用于三阶以上的数字矩阵求解时远不如高斯消元方便因为要计算很多个代数余子式。不过在理论推导中伴随矩阵法必不可少尤其是在证明矩阵可逆性与行列式关系的时候。我个人对伴随矩阵法的定位是作为一个概念工具理解而不是一个计算工具使用。考试时如果遇到三阶求逆我会先用高斯消元但如果题目明确要求使用伴随矩阵法就需要老老实实按步骤来这时候特别容易在代数余子式下标上出错我的经验是先写出代数余子式矩阵再统一转置最后除以行列式这样能避免多次回头纠正。5.3 秩、行列式与满秩的关系在线性代数里矩阵的秩也是判断很多性质的关键。有一个很干净利落的结论一个n阶方阵的秩等于n当且仅当它的行列式不为0。秩为n也就是满秩意味着行向量和列向量都线性无关也意味着矩阵可逆。所以行列式、秩、线性无关、可逆、唯一解这几个概念在n阶方阵的场景下是彻底打通的。我把等价关系列在这里方便自查条件方阵An阶 | 等价说法 判定 | 结论 det(A) ≠ 0 | A可逆A是满秩的行列向量线性无关Axb有唯一解 det(A) 0 | A不可逆A是奇异矩阵行列向量线性相关Axb无解或有无穷多解有一个可以配套加深认识的是det(A) 0时线性方程组Axb理论上可能存在无穷多解也可能无解具体要看b是否在A的列空间里。行列式本身只管系数矩阵不管b所以它只能告诉我们没有唯一解具体是哪种情况还要进一步分析。6. 雅可比行列式行列式概念在算法世界里的延伸6.1 变量替换时为什么需要雅可比行列式这块内容在传统线性代数课程里往往作为选学但李宏毅课程的受众很多是机器学习方向的学生所以我单列一节来梳理雅可比行列式因为它在深度学习的标准化流Normalizing Flow、流模型等领域里很关键。先看雅可比行列式是怎么出现的。二元函数做变量替换时比如u和v是x和y的函数dxdy变成dudv需要乘以一个修正因子这个因子就是雅可比行列式的绝对值。为什么需要修正因为变量替换之后坐标网格不再是原来的等距正方形面积微元被伸缩了。伸缩的比例正是雅可比矩阵的行列式。雅可比矩阵的定义是把u, v对x, y的四个偏导数排成一个2×2矩阵这个矩阵的行列式就是雅可比行列式。举个例子极坐标变换。x r cosθy r sinθ那么雅可比矩阵是| ∂x/∂r ∂x/∂θ | | ∂y/∂r ∂y/∂θ | | cosθ −r sinθ | | sinθ r cosθ |行列式 r cos²θ r sin²θ r。这就是二重积分在极坐标下为什么会有多一个r的原因。如果你学过高等数学里的极坐标积分现在回头看那个r根本不是什么巧合而是面积微元被拉伸的比例。6.2 深度学习里的雅可比行列式在生成模型里特别是标准化流模型中核心问题是已知一个简单分布比如高斯分布中的z经过可逆变换得到x怎么求x的分布答案就是简单分布密度乘以雅可比行列式的绝对值。因为变量的分布密度本质上跟体积挂钩区间被拉大密度就应该被摊薄。这个逻辑跟多重积分换元一模一样。所以当你学的时候如果能看到行列式在这里的出场方式就会明白李宏毅老师在前面反复强调几何直觉和行列式体积变化比例这个含义的深意了——所有深度学习里的高级模型本质上还是在玩线代那套线性变换体积伸缩的基本框架。6.3 雅可比行列式等于0的意义跟普通行列式一样雅可比行列式为0时说明这个从(x, y)到(u, v)的变换在某一点处把面积压成了0即在该点附近不是一一对应的变换。这时候变量替换公式同样不成立。通俗地说这个映射把多个点映射到同一个点了反向回推就变得不确定。这也是为什么标准化流模型要求变换必须是可逆的而且每个变换点的雅可比行列式都不能为0。很多初学者只记住了可逆变换这个要求而不知道底层就是雅可比行列式不能为0。现在这两块知识打通了以后看生成模型的论文遇到雅可比行列式相关的推导会从容很多。7. 我在学习和做题中踩过的坑7.1 换了行忘记变号我在化简三阶、四阶行列式时犯过最多次的低级错误就是交换两行或两列后忘记写负号。尤其在高斯消元过程中当需要把主元位置下方消成0免不了要做若干次换行。每一次换行行列式都要变好一次号。我后来自己总结了一个办法所有换行操作我都在草稿纸上用一个额外符号−开头做标记最后计算完上三角矩阵对角线乘积之后数一下标记个数统一处理正负号。这个办法看着很蠢但真的很管用避免了做题做到一半符号混乱。7.2 倍加行操作记错符号倍加行变换不改变行列式这是最安全的操作。但很多人会在执行时弄混方向比如把第2行加到第1行和第1行加到第2行搞混或者按成加上k倍之后还要提取k倍出来纯粹是自己加戏。只要明白倍加操作在几何上是剪切变换不改变体积就不会犯这个错。简单说行列式中某行加上另一行的任意倍数结果不变不用做任何额外操作。7.3 三阶对角线法则套用到了四阶这大概是我见过初学者最容易跳进去的坑。到了四阶行列式很多同学因为三阶对角线法则用习惯了忍不住想用主对角线加减副对角线来算结果错得离谱。四阶行列式有24项每条对角线上只有4个位置怎么可能用几条对角线就覆盖全部24项遇到四阶的题正确策略是先用行变换消元化成上三角或者想办法消出一行多零再拉普拉斯展开。直接展开四阶再硬算也不是不可以但效率极低考试时尤其不划算。7.4 行列式试算与验证的小技巧如果你是在电脑上做练习或者研究我强烈建议用Python里的SymPy库来验证手算结果。SymPy是符号计算库做行列式非常方便。import sympy as sp A sp.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(A.det()) # 输出0这个例子就是前文那个三阶矩阵用SymPy算出来是0。如果手算结果不一致一定是哪一步的符号或化简出错了。如果你不想装第三方库Python标准库本身没有直接的行列式函数可以自己写一个基于递归拉普拉斯展开的简化版。我用到了一个很常见的递归实现思路当矩阵规模为1时直接返回值为2时用ad−bc直接算更大规模就选一行展开。import copy def simple_det(mat): n len(mat) if n 1: return mat[0][0] if n 2: return mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0] res 0 for j in range(n): sub [] for i in range(1, n): row mat[i][:j] mat[i][j1:] sub.append(row) res ((-1) ** j) * mat[0][j] * simple_det(sub) return res M [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(simple_det(M)) # 输出0能写出这个递归其实也就说明你理解了拉普拉斯展开的本质。很多教科书在讲行列式时一上来就直接摆公式学得人头晕。如果自己能动手实现一遍行列式的结构会记得非常牢固。7.5 学习路线建议给刚开始学行列式的同学一个建议不要一上来就陷入四阶五阶的硬算。先把二阶、三阶的几何意义彻底搞懂确认自己能够徒手解释行列式的值为什么是面积/体积再用拉普拉斯展开验证三阶展开式然后做几个行变换化简的题最后再去碰带参数的行列式讨论。这样一层一层往上走比直接刷题要扎实得多。至于李宏毅老师的课它的一个特点是会跟机器学习应用结合着讲所以学的时候最好抱有这个数学工具将来在算法里会以什么形式重新出现的好奇心。比如学到雅可比行列式时如果你恰好知道生成模型里的变量变换那种原来这个知识点在这里等着我的打通感是非常值得体验的。行列式这个知识点表面上是线代教材里中规中矩的一章但它的底层逻辑和延展性远超大多数人的预期。从解方程组到判断矩阵可逆从特征值计算到Jaccobian矩阵再到深度学习中的分布变换你都能看到行列式的影子。把这一章学透后面很多内容学起来都会顺畅很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →