線性代數精華1——從行列式開始

線性代數是機器學習領域當中非常重要的基礎知識,但是很遺憾的是,在真正入門之前很少有人能認識到它的重要性,將它學習紮實,在入門之後,再認識到想要補課也不容易。

而我也是一樣,學完課程之後就沒怎麼看線性代數了,所以現在開始重新學習這門課程。
本文全部轉載於這篇文章
因爲微信查看文章較爲麻煩,因此將其轉載至博客以便回顧。

行列式定義

維基百科中的定義是,行列式是一個函數,將一個n * n的矩陣映射到一個標量。這個標量表示經過這個矩陣所代表的的線性變幻之後,矩陣的“體積”在空間當中發生的變化。

也就是說,行列式的輸入是一個n * n的方陣,輸出是一個具體的數。我們把行列式用det來表示,假設A是某一個n * n的矩陣,那麼det(A)即表示該矩陣的行列式。

行列式計算

二階行列式


在這裏插入圖片描述

那麼,
在這裏插入圖片描述
即爲對角線乘積的差。
再來看三階的情況:

在這裏插入圖片描述
那麼
在這裏插入圖片描述
光看公式非常複雜,如果我們把所有正項的乘積用紅線相連,把負項的成績用藍線相連,那麼我們可以得到下面這張圖。

在這裏插入圖片描述
其實本質上來說,還是對角線的乘積差,即所有正向(從左上往右下)對角線的乘積和減去反向(從右上往左下)對角線的乘積和。
我們列出了二項以及三項行列式的式子,自然而然,我們下面就要寫出n項行列式的計算方法。但在此之前,我們先要引入另外一個相關的概念——逆序數。

逆序數

逆序數本身主要就是應用在行列式的計算當中,不過除此之外在面試題當中經常出現,許多面試題會讓求職者寫出或口述逆序數的計算算法。關於這點,會在之後的算法專欄當中單獨講解。

假設我們有一個數組A,它當中有n個各不相同的元素。在理想情況下,A當中的元素應該都是有序的。比如說都是從小到大排列,但理想情況很少發生。大多數情況下,數組當中的元素都是無序的。

假如我們想要知道,數組當前的排序距離理想情況的升序究竟有多大的差距。很正常地可以想到,我們可以遍歷這個數組當中所有Ai和Aj的組合,看看究竟有多少數的次序有誤。在這個序列所有兩兩元素的組合當中,有誤的次序的組合總數就叫做逆序數。
光看概念有些拗口,但是直接看代碼的話其實非常簡單:

reverse = 0
for i in range(n):
  for j in range(i):
    if A[i] < A[j]:
      reverse += 1

也就是說我們對於數組當中的每一個元素,都計算出了排在它前面並且比它大的元素個數。考慮一般情況,假設A數組的排列爲p1,p2,p3,…,pn,對於每一個pi我們都求出它前面比較大的元素個數,定義爲ti,那麼全體的逆序數之和:
在這裏插入圖片描述

n階行列式

我們再回到n階行列式來,理解了逆序數的概念之後,我們就很方便地可以寫出n階行列式的公式了。首先,先定義出矩陣D,是一個n階的方陣:
在這裏插入圖片描述
假設自然數1,2,3…n的一個排列爲p1,p2,p3,…,pn,這個排列的逆序數爲t。那麼我們可以寫出D的行列式:
在這裏插入圖片描述
由於長度爲n的序列的全排列一共有n!種,所以n階方陣的行列式一共含有n!項。
除此之外,行列式還有另外一種計算方法。
在n階行列式當中,把(i,j)元素所在的行和列的所有元素全部去除之後,剩下的新的n-1階的行列式稱爲(i,j)元的代數餘子式,記爲Mij列入4階行列式:
在這裏插入圖片描述
其中(2,2)元的代數餘子式爲:
在這裏插入圖片描述
代數餘子式可以用來表示行列式。
A矩陣的行列式可以寫成
在這裏插入圖片描述
證明也很簡單,其實這只不過是行列式表達式的一個變形。我們用三階行列式舉例:
在這裏插入圖片描述
我們把這些值用代數餘子式表示出來:
在這裏插入圖片描述
化簡一下,顯然就是上面公式的結果。

克拉默法則

行列式的定義和計算都不太直觀,那麼這麼一個相對比較複雜的概念究竟有什麼作用呢?除了用在機器學習的模型當中之外,另一個非常經典的用途就是判斷線性方程組是否有解。
對於一個含有n個未知數的n個線性方程組
在這裏插入圖片描述
它的解可以用n階行列式表示。
如果這個n階的行列式不等於0,即:
在這裏插入圖片描述
那麼這個n階方程組有唯一解,並且它的解爲:
在這裏插入圖片描述
其中Dj(j=1,2,…n)是把D中第j列替換成方程常數項得到的新的行列式:
在這裏插入圖片描述
行列式除了上面提到的內容之外,還有很多很好用的性質以及一些變種的計算方法。不過,對於算法領域的幫助不多,所以這裏不多枚舉,感興趣的同學可以自己查閱相關資料。

行列式幾何意義

行列式除了代數上的作用之外,也是有它的幾何意義的。
以二階行列式舉例,假設我們有A,B兩個向量,其中A向量寫作(a1,b1),B向量寫作(b1,b2),AB兩個向量組合成的矩陣寫作:
在這裏插入圖片描述
如果我們將它畫出來,它其實表示這兩個向量的平行四邊形面積。
在這裏插入圖片描述
所以,當我們把行列式當中的某一行或者是某一列同時乘上一個係數k之後,它的行列式增大了k倍。
在這裏插入圖片描述

代碼實現

從上文行列式的定義很容易得出結論,行列式的計算比較複雜,如果我們自己實現,需要的代碼至少在100行以上。不過好在Python的Numpy庫當中爲我們提供了非常豐富的矩陣相關操作,包括行列式的計算在內,因此,我們可以非常簡單的實現行列式的計算。

如果沒有裝過Numpy的,可以通過pip很方便地安裝:

pip install numpy

通過調用numpy.linalg中的det函數,我們可以直接求出矩陣行列式的值。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章