
1. 行列式到底在解答什么問題先說個我自己的體會李宏毅老師的線性代數(shù)課一開始講行列式Determinant縮寫det的時候很多同學其實是懵的。前面剛學完向量、矩陣、線性組合、線性方程組的幾何意義怎么突然跳到一長串看起來很像從天上掉下來的展開公式了學完一遍會算二階三階能應付考試但要問一句行列式到底是什么十有八九說不清楚。所以我這篇筆記想換個角度來梳理先不急著背公式而是先把行列式放在整個線性代數(shù)的問題鏈條里看搞清楚它到底在幫我們解決什么問題。行列式解決的第一類問題是判斷一個方陣是否可逆。一個方陣A如果存在逆矩陣A?1那么它對應的線性變換就是可逆的——換句話說這個變換沒有把高維信息壓扁沒有造成不可逆的信息丟失。怎么判斷最直接的辦法就是看det(A)是否等于0。det(A)≠0方陣可逆det(A)0方陣不可逆也叫奇異矩陣。為什么行列式能承擔這個任務這里必須回頭看線代里最核心的視角——矩陣是線性變換。一個矩陣左乘一個向量實際上就是把那個向量做了伸縮、旋轉(zhuǎn)、反射這類操作。而行列式的絕對值恰好就是這個變換對空間的體積縮放比例。比如二階行列式的幾何意義是面積縮放三階行列式的幾何意義是體積縮放。如果一個變換把二維的整個平面壓到一條線或者把三維空間壓到一個平面上那面積或體積就變成了0這個變換自然是不可逆的——你沒法從一條線或一個平面還原出原來的二維、三維信息。所以det0對應的就是矩陣把空間壓扁了壓扁了就沒法還原也就是不可逆。行列式解決的第二類問題是給線性方程組的存在性和唯一性一個判別式。我們在學克拉默法則Cramers Rule的時候會看到對于n元線性方程組如果系數(shù)矩陣的行列式不等于0那么方程組有唯一解。這本質(zhì)上跟可逆性是同一個問題Axb如果A可逆那xA?1b就是唯一解。所以行列式其實是把方程組有沒有唯一解這個問題轉(zhuǎn)化成了一個具體可計算的量。第三類問題就更貼近實際應用了特征值的計算。n階方陣的特征值本質(zhì)上就是特征方程det(A?λI)0的根。雖然實際工程里計算大型矩陣特征值不會用行列式展開去硬算但行列式這個概念本身是理解特征值、特征向量、矩陣對角化這些進階內(nèi)容的邏輯前提。這塊邏輯想清楚了再看后面這些看起來像是規(guī)則堆砌的計算方法、性質(zhì)就不會覺得是死記硬背了——行列式的所有展開公式、所有性質(zhì)本質(zhì)上都是圍繞如何有效計算這個體積縮放比例展開的。2. 行列式的幾何直覺是怎么豎起來的2.1 二階行列式與平行四邊形的面積大多數(shù)教材在引入行列式時都會從二階行列式開始det(A) |a b; c d| ad ? bc然后告訴你它是面積。但這個面積是怎么對應的我當時一直沒搞明白為什么偏偏是ad?bc這個表達式。直到我把矩陣的兩行或者兩列分別看作兩個向量。以第1行(a, b)和第2行(c, d)為例這兩個向量從原點出發(fā)會張成一個平行四邊形。這個平行四邊形的有向面積恰好就是ad?bc。我建議你自己動手驗一下這個結(jié)論。取兩個向量u(1, 2)v(3, 1)按照公式det 1×1 ? 2×3 1 ? 6 ?5算出來是負數(shù)但面積應該是正的5。這個負號是有含義的它告訴我們u到v的旋轉(zhuǎn)方向是順時針還是逆時針。如果det0說明從u到v的旋轉(zhuǎn)方向是逆時針右手系如果det0則是順時針左手系。所以絕對值代表大小符號代表方向這就是為什么叫有向面積。說實話李宏毅老師把這部分講得很快但我覺得這個幾何直覺是所有后續(xù)理解的基石。因為三階行列式的體積縮放、雅可比行列式的換元比例、特征值分解里的特征向量的拉伸比——所有這些高級概念源頭都是這個最簡單、可視化的平行四邊形的面積。2.2 三階行列式與平行六面體的體積到了三階行列式直觀上更復雜一些但邏輯是二階的順延。三階行列式的三個行向量或列向量在三維空間里張成一個平行六面體行列式的值就是這個平行六面體的有向體積。這個理解在實際解題中很有用。比如有些題目會直接問判斷三個向量是否共面。三個向量共面意味著它們張成的平行六面體體積是0也就是三階行列式等于0。這其實是三維空間中判斷向量共面最干凈利落的方法比硬湊線性組合要省事得多。我在自學這部分的時候也刻意畫了個三維坐標系來輔助理解。平行六面體的底面由兩個向量張成第三個向量的垂直分量決定高度。行列式的值就是底面積×高。如果第三個向量恰好躺在底面所在的平面里高度就是0體積也是0行列式也就是0。這個幾何圖像比記住det0則三向量共面這句話要深刻得多。但別忘了行列式還有一個更宏大的視角它度量的是線性變換前后體積的縮放比例。A是某個線性變換矩陣區(qū)域S經(jīng)過變換后的體積等于原來S的體積乘以|det(A)|。這個結(jié)論在多元積分的變量替換、概率密度變換、深度學習里的標準化流模型中反復出現(xiàn)是所有應用背后統(tǒng)一的那條線。3. 行列式的展開法則從拉普拉斯展開到消元策略3.1 用逆序數(shù)嚴格定義行列式在學行列式的時候教材里會引入逆序數(shù)的概念然后把行列式寫成一大串排列求和的形式。我最初覺得這純粹是數(shù)學家的自嗨跟實際計算毫無關系。但后來看李宏毅老師的推導加上自己做題的經(jīng)驗才發(fā)現(xiàn)如果沒有這個嚴格定義后面所有關于行列式性質(zhì)的理解都站不住腳。n階行列式的定義是所有取自不同行不同列的n個元素的乘積按照行指標的自然順序排列列指標構(gòu)成一個排列然后乘以(?1)的逆序數(shù)次冪最后求和。這個定義翻譯成人話就是你從矩陣里每行選一個、每列選一個湊一個不沖突的乘積然后把所有這樣的乘積加起來。每一項前面的正負號由這個選擇的列排列的逆序數(shù)決定。逆序數(shù)是偶數(shù)則取正號奇數(shù)則取負號。這個定義一開始非常勸退但它其實只回答了一個問題那么多項每一項該加還是該減逆序數(shù)就是那個決定正負的裁判。記住這一點后面學習行列式的性質(zhì)時很多奇怪規(guī)則就有了推導的根基。3.2 三階行列式對角線法則到底為什么有效三階行列式的展開很多人直接記對角線法則也叫薩魯斯法則主對角線方向三條線加副對角線方向三條線減。這個法則非常好用但要提醒一句它只對二階、三階成立到了四階以上就完全失效了。原因很簡單——薩魯斯法則本質(zhì)上是把三階的6個展開項按照幾何位置硬湊成三加三減的模式但四階行列式有24個展開項根本不可能用幾條對角線裝下。那我個人是怎么處理三階行列式計算的說實話我考試做題時也直接用對角線法則因為它快。但我會在心里清楚這個法則背后的嚴格依據(jù)是拉普拉斯展開不是某種神奇的對角線規(guī)律。這樣萬一題目是四階的我就不會因為慣性思維把對角線法則硬套上去。三階的具體展開式這里默寫一遍便于沒有課本的讀者直接對照| a11 a12 a13; a21 a22 a23; a31 a32 a33 | a11a22a33 a12a23a31 a13a21a32 ? a13a22a31 ? a12a21a33 ? a11a23a32對角線法則的三加三減就是這六個項在矩陣位置上的直觀投影。我建議你親手按逆序數(shù)定義把這三項的符號驗一遍不求全驗證兩三項就知道這個規(guī)則完全自洽了。3.3 拉普拉斯展開是通用的計算策略四階及以上的行列式最通用的手工計算方法是拉普拉斯展開也常稱為按行/列展開。拉普拉斯展開的本質(zhì)是降維打擊n階行列式可以拆成n個(n?1)階行列式的代數(shù)和。具體地選定第i行行列式等于第i行每個元素乘以它對應的代數(shù)余子式再求和。代數(shù)余子式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是符合預期的。拉普拉斯展開選哪一行或者哪一列是有策略的。最優(yōu)先的選擇是挑0最多的行或列展開因為0元素對應的項直接就是0不用算。如果某一行有3個零那本來要算4個三階子行列式現(xiàn)在只需要算1個計算量立刻降下來。3.4 先化簡再展開實用套路不過拉普拉斯展開本身的計算量還是很大。四階行列式直接展開要算4個三階五階要算5個四階每一個四階又拆4個三階總共20個三階行列式。這個計算量在考試中是不現(xiàn)實的。所以實際解題一定是以性質(zhì)化簡為主拉普拉斯展開為輔。具體套路很簡單用行變換或列變換把某一行或列化成只有一個非零元素對這一行做拉普拉斯展開得到低一階的行列式重復以上過程直到變成二階或三階這個套路的前提是理解初等行變換對行列式值的影響。這一步很多人會出錯我單獨拿出來說。4. 行列式的性質(zhì)它們是用來化簡的不是用來背的4.1 三條初等變換的核心規(guī)則要化簡行列式就必須知道三類初等變換會怎樣改變行列式的值。這塊兒的學習我強烈建議不要死記結(jié)論而是用二階行列式把每條性質(zhì)驗一遍一旦知道怎么回事就不容易忘了。性質(zhì)一交換兩行或兩列行列式變號。這個對應到二階就是|a b; c d|ad?bc交換兩行變成|c d; a b|cb?da?(ad?bc)。換兩行相當于改變了有向面積的方向所以符號翻轉(zhuǎn)。實際操作中每做一次換行或換列要在草稿紙上記住行列式前面多了一個負號。性質(zhì)二某一行或列乘以一個常數(shù)k行列式變成原來的k倍。注意這里和矩陣不同矩陣某行乘k這個矩陣本身變了但那個縮放比例也變了。這從幾何上也很好理解把平行四邊形的一條邊拉長k倍面積自然變成原來的k倍。性質(zhì)三把某一行列的k倍加到另一行列行列式不變。這就是所謂的倍加行變換不改變行列式。這個性質(zhì)在化簡時用得最多因為它可以幫助我們在不改變行列式值的前提下把某個位置下面的元素全部消成0從而化簡。很多教材會直接用這一條完成高斯消元。上述三條規(guī)則對應的實際意義是倍加操作是最安全的因為它完全不改變行列式的值數(shù)乘要注意把倍數(shù)提到行列式外面記得最后乘回去換行則一定要記得變號。把這三點刻在腦子里化簡行列式基本就不會出錯了。4.2 上三角化求行列式行列式一個非常常用的結(jié)論是上三角矩陣的行列式等于主對角線元素的乘積。這個結(jié)論的本質(zhì)是上三角矩陣左下角全是0按第1列展開一路滾下去最后只剩對角線元素的乘積。實際計算時我一般會先把任意方陣經(jīng)過倍加行變換化成上三角形式然后把對角線相乘再處理之前換行引入的符號問題。整個過程可以用一個例子來鞏固。求下面這個矩陣的行列式| 1 2 3 | | 4 5 6 | | 7 8 9 |第1行乘以?4加到第2行得到新的第2行(0, ?3, ?6)。第1行乘以?7加到第3行得到新的第3行(0, ?6, ?12)。現(xiàn)在矩陣變成| 1 2 3 | | 0 ?3 ?6 | | 0 ?6 ?12 |再對第2行做操作第2行乘以?2加到第3行得到新的第3行(0, 0, 0)。矩陣變?yōu)樯先莬 1 2 3 | | 0 ?3 ?6 | | 0 0 0 |行列式 1×(?3)×0 0。這與前面拉普拉斯展開結(jié)果一致。這個例子其實是故意選了一個行列式為0的矩陣因為它能直觀說明一個點如果通過倍加行變換某一行被消成全0那行列式一定是0對應矩陣不可逆、行向量線性相關。4.3 性質(zhì)背后的本質(zhì)把行列式的性質(zhì)放在一起看你會發(fā)現(xiàn)它們其實是圍繞體積這個幾何概念的。交換行是改變了空間的定向所以符號變號某行乘k是拉伸了某條邊所以體積按k倍變化倍加行變換是剪切變換它不改變面積和體積所以行列式不變。我學這一節(jié)的時候最大的感受是當你能用幾何直覺去解釋這些性質(zhì)時行列式的性質(zhì)就不需要背了。反而那些只記住了公式、沒有建立幾何圖像的人做題時很容易把性質(zhì)搞混。5. 行列式的兩大出圈應用可逆性判定與伴隨矩陣5.1 用行列式快速判斷方陣是否可逆行列式最直接的應用就是判定方陣的可逆性。我之前在學矩陣逆的時候第一次看到det(A)≠0則A可逆這個結(jié)論時覺得這是在兜圈子——我先要算行列式才能判斷能不能用公式求逆那為什么不直接把矩陣塞進高斯消元法里試一下后來我才意識到行列式判斷可逆性和高斯消元法判斷可逆性應用場景完全不同。如果你只是要求一個具體的逆矩陣高斯消元對增廣矩陣[A|I]做行變換是首選。但如果需要判斷的是帶有參數(shù)的矩陣的逆是否存在或者需要在理論上證明某個結(jié)論行列式就方便得多。舉個例子。判斷矩陣| λ 1 | | 2 λ |是否可逆。直接算行列式λ2 ? 2。要讓它不可逆就得讓λ2 ? 2 0也就是λ ±√2。整個問題變成一個簡單的帶參行列式計算。如果強行用高斯消元法討論λ的取值步驟繁瑣不說還容易漏掉邊界情況。5.2 伴隨矩陣法求逆行列式還提供了另一種求逆矩陣的方法——伴隨矩陣法。公式是A?1 (1/det(A)) × adj(A)其中adj(A)是A的伴隨矩陣其第(i, j)個元素等于A的第(j, i)個元素的代數(shù)余子式。注意這里下標是反過來的先算代數(shù)余子式再轉(zhuǎn)置。這個方法在理論上非常優(yōu)雅但實際用于三階以上的數(shù)字矩陣求解時遠不如高斯消元方便因為要計算很多個代數(shù)余子式。不過在理論推導中伴隨矩陣法必不可少尤其是在證明矩陣可逆性與行列式關系的時候。我個人對伴隨矩陣法的定位是作為一個概念工具理解而不是一個計算工具使用??荚嚂r如果遇到三階求逆我會先用高斯消元但如果題目明確要求使用伴隨矩陣法就需要老老實實按步驟來這時候特別容易在代數(shù)余子式下標上出錯我的經(jīng)驗是先寫出代數(shù)余子式矩陣再統(tǒng)一轉(zhuǎn)置最后除以行列式這樣能避免多次回頭糾正。5.3 秩、行列式與滿秩的關系在線性代數(shù)里矩陣的秩也是判斷很多性質(zhì)的關鍵。有一個很干凈利落的結(jié)論一個n階方陣的秩等于n當且僅當它的行列式不為0。秩為n也就是滿秩意味著行向量和列向量都線性無關也意味著矩陣可逆。所以行列式、秩、線性無關、可逆、唯一解這幾個概念在n階方陣的場景下是徹底打通的。我把等價關系列在這里方便自查條件方陣An階 | 等價說法 判定 | 結(jié)論 det(A) ≠ 0 | A可逆A是滿秩的行列向量線性無關Axb有唯一解 det(A) 0 | A不可逆A是奇異矩陣行列向量線性相關Axb無解或有無窮多解有一個可以配套加深認識的是det(A) 0時線性方程組Axb理論上可能存在無窮多解也可能無解具體要看b是否在A的列空間里。行列式本身只管系數(shù)矩陣不管b所以它只能告訴我們沒有唯一解具體是哪種情況還要進一步分析。6. 雅可比行列式行列式概念在算法世界里的延伸6.1 變量替換時為什么需要雅可比行列式這塊內(nèi)容在傳統(tǒng)線性代數(shù)課程里往往作為選學但李宏毅課程的受眾很多是機器學習方向的學生所以我單列一節(jié)來梳理雅可比行列式因為它在深度學習的標準化流Normalizing Flow、流模型等領域里很關鍵。先看雅可比行列式是怎么出現(xiàn)的。二元函數(shù)做變量替換時比如u和v是x和y的函數(shù)dxdy變成dudv需要乘以一個修正因子這個因子就是雅可比行列式的絕對值。為什么需要修正因為變量替換之后坐標網(wǎng)格不再是原來的等距正方形面積微元被伸縮了。伸縮的比例正是雅可比矩陣的行列式。雅可比矩陣的定義是把u, v對x, y的四個偏導數(shù)排成一個2×2矩陣這個矩陣的行列式就是雅可比行列式。舉個例子極坐標變換。x r cosθy r sinθ那么雅可比矩陣是| ?x/?r ?x/?θ | | ?y/?r ?y/?θ | | cosθ ?r sinθ | | sinθ r cosθ |行列式 r cos2θ r sin2θ r。這就是二重積分在極坐標下為什么會有多一個r的原因。如果你學過高等數(shù)學里的極坐標積分現(xiàn)在回頭看那個r根本不是什么巧合而是面積微元被拉伸的比例。6.2 深度學習里的雅可比行列式在生成模型里特別是標準化流模型中核心問題是已知一個簡單分布比如高斯分布中的z經(jīng)過可逆變換得到x怎么求x的分布答案就是簡單分布密度乘以雅可比行列式的絕對值。因為變量的分布密度本質(zhì)上跟體積掛鉤區(qū)間被拉大密度就應該被攤薄。這個邏輯跟多重積分換元一模一樣。所以當你學的時候如果能看到行列式在這里的出場方式就會明白李宏毅老師在前面反復強調(diào)幾何直覺和行列式體積變化比例這個含義的深意了——所有深度學習里的高級模型本質(zhì)上還是在玩線代那套線性變換體積伸縮的基本框架。6.3 雅可比行列式等于0的意義跟普通行列式一樣雅可比行列式為0時說明這個從(x, y)到(u, v)的變換在某一點處把面積壓成了0即在該點附近不是一一對應的變換。這時候變量替換公式同樣不成立。通俗地說這個映射把多個點映射到同一個點了反向回推就變得不確定。這也是為什么標準化流模型要求變換必須是可逆的而且每個變換點的雅可比行列式都不能為0。很多初學者只記住了可逆變換這個要求而不知道底層就是雅可比行列式不能為0。現(xiàn)在這兩塊知識打通了以后看生成模型的論文遇到雅可比行列式相關的推導會從容很多。7. 我在學習和做題中踩過的坑7.1 換了行忘記變號我在化簡三階、四階行列式時犯過最多次的低級錯誤就是交換兩行或兩列后忘記寫負號。尤其在高斯消元過程中當需要把主元位置下方消成0免不了要做若干次換行。每一次換行行列式都要變好一次號。我后來自己總結(jié)了一個辦法所有換行操作我都在草稿紙上用一個額外符號?開頭做標記最后計算完上三角矩陣對角線乘積之后數(shù)一下標記個數(shù)統(tǒng)一處理正負號。這個辦法看著很蠢但真的很管用避免了做題做到一半符號混亂。7.2 倍加行操作記錯符號倍加行變換不改變行列式這是最安全的操作。但很多人會在執(zhí)行時弄混方向比如把第2行加到第1行和第1行加到第2行搞混或者按成加上k倍之后還要提取k倍出來純粹是自己加戲。只要明白倍加操作在幾何上是剪切變換不改變體積就不會犯這個錯。簡單說行列式中某行加上另一行的任意倍數(shù)結(jié)果不變不用做任何額外操作。7.3 三階對角線法則套用到了四階這大概是我見過初學者最容易跳進去的坑。到了四階行列式很多同學因為三階對角線法則用習慣了忍不住想用主對角線加減副對角線來算結(jié)果錯得離譜。四階行列式有24項每條對角線上只有4個位置怎么可能用幾條對角線就覆蓋全部24項遇到四階的題正確策略是先用行變換消元化成上三角或者想辦法消出一行多零再拉普拉斯展開。直接展開四階再硬算也不是不可以但效率極低考試時尤其不劃算。7.4 行列式試算與驗證的小技巧如果你是在電腦上做練習或者研究我強烈建議用Python里的SymPy庫來驗證手算結(jié)果。SymPy是符號計算庫做行列式非常方便。import sympy as sp A sp.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(A.det()) # 輸出0這個例子就是前文那個三階矩陣用SymPy算出來是0。如果手算結(jié)果不一致一定是哪一步的符號或化簡出錯了。如果你不想裝第三方庫Python標準庫本身沒有直接的行列式函數(shù)可以自己寫一個基于遞歸拉普拉斯展開的簡化版。我用到了一個很常見的遞歸實現(xiàn)思路當矩陣規(guī)模為1時直接返回值為2時用ad?bc直接算更大規(guī)模就選一行展開。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能寫出這個遞歸其實也就說明你理解了拉普拉斯展開的本質(zhì)。很多教科書在講行列式時一上來就直接擺公式學得人頭暈。如果自己能動手實現(xiàn)一遍行列式的結(jié)構(gòu)會記得非常牢固。7.5 學習路線建議給剛開始學行列式的同學一個建議不要一上來就陷入四階五階的硬算。先把二階、三階的幾何意義徹底搞懂確認自己能夠徒手解釋行列式的值為什么是面積/體積再用拉普拉斯展開驗證三階展開式然后做幾個行變換化簡的題最后再去碰帶參數(shù)的行列式討論。這樣一層一層往上走比直接刷題要扎實得多。至于李宏毅老師的課它的一個特點是會跟機器學習應用結(jié)合著講所以學的時候最好抱有這個數(shù)學工具將來在算法里會以什么形式重新出現(xiàn)的好奇心。比如學到雅可比行列式時如果你恰好知道生成模型里的變量變換那種原來這個知識點在這里等著我的打通感是非常值得體驗的。行列式這個知識點表面上是線代教材里中規(guī)中矩的一章但它的底層邏輯和延展性遠超大多數(shù)人的預期。從解方程組到判斷矩陣可逆從特征值計算到Jaccobian矩陣再到深度學習中的分布變換你都能看到行列式的影子。把這一章學透后面很多內(nèi)容學起來都會順暢很多。