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