關鍵詞:線性代數 / 矩陣 / 基本定義
矩陣對於算法就如同人對於食物般的關係,已經到了密不可分的狀態了,在神經網絡裡,矩陣代表了每層神經元之間的連結,在集成算法裡,矩陣記錄了每次分類器更新的殘差,在馬可夫鏈裡,矩陣表示了不同狀態下的條件轉移概率,矩陣的重要性已經是不言自明了。除了上集說到的方陣,子矩陣,對角矩陣,與單位矩陣之外,接著要進一步介紹一些常用且方便的矩陣,包含了以下幾種矩陣類型:
· 純量矩陣
· 三角矩陣
· 共軛矩陣
· 對稱矩陣
· 正交矩陣
當然矩陣的類型遠不止如此,而這幾種矩陣在了解的時候不需要太多先驗知識,因此才能在一開始率先登場!
矩陣基本定義
這篇文章裡的範例也都將沿用上篇文章中的定義,下面就來回顧一下標記符號的各種含義。
中的 稱為矩陣的元素,可以是數字,函數,實數,複數。在 python 代碼中的numpy模塊幾乎可以說是數值計算的唯一選擇。
import numpy as np
A = np.random.randint(0, 10, 72)
A = A.reshape(9, 8)
print(A)
輸出:
[[5 4 5 8 5 7 0 7]
[5 6 4 0 9 8 6 5]
[1 2 9 6 7 7 3 5]
[3 4 7 8 4 6 9 2]
[4 8 1 3 5 4 8 4]
[5 1 5 7 3 9 9 8]
[0 8 4 1 6 9 3 2]
[4 3 0 3 6 4 5 9]
[2 8 6 3 5 5 3 4]]
如果還沒安裝過numpy,可以使用下面指令在終端快速安裝。
pip install numpy
11. 純量矩陣 - Scalar matrix
在對角矩陣中,主對角線上的元素皆為某一常數 C 時,則稱之為純量矩陣。
c = 5
print(np.diag([c, c, c]))
輸出:
[[5, 0, 0],
[0, 5, 0],
[0, 0, 5]]
12. 上三角矩陣 - Upper triangular matrix
在方陣的前提下,主對角線以下元素皆為 0 時,則稱之為上三角矩陣。
print(np.triu(A))
輸出:
[[5, 4, 5, 8, 5, 7, 0, 7],
[0, 6, 4, 0, 9, 8, 6, 5],
[0, 0, 9, 6, 7, 7, 3, 5],
[0, 0, 0, 8, 4, 6, 9, 2],
[0, 0, 0, 0, 5, 4, 8, 4],
[0, 0, 0, 0, 0, 9, 9, 8],
[0, 0, 0, 0, 0, 0, 3, 2],
[0, 0, 0, 0, 0, 0, 0, 9],
[0, 0, 0, 0, 0, 0, 0, 0]]
p.s. 即便一個矩陣不是方陣,同樣可以取上下三角矩陣。
13. 下三角矩陣 - Lower triangular matrix
在方陣的前提下,主對角線以上元素皆為 0 時,則稱之為下三角矩陣。
print(np.tril(A))
輸出:
[[5, 0, 0, 0, 0, 0, 0, 0],
[5, 6, 0, 0, 0, 0, 0, 0],
[1, 2, 9, 0, 0, 0, 0, 0],
[3, 4, 7, 8, 0, 0, 0, 0],
[4, 8, 1, 3, 5, 0, 0, 0],
[5, 1, 5, 7, 3, 9, 0, 0],
[0, 8, 4, 1, 6, 9, 3, 0],
[4, 3, 0, 3, 6, 4, 5, 9],
[2, 8, 6, 3, 5, 5, 3, 4]]
14. 共軛矩陣 - Conjugate matrix
把 A 矩陣的元素皆取共軛複數後,該新的矩陣為 A 矩陣的共軛矩陣,以 表示。
B = np.array([[1+1.j, 2-1.j],
[3-2.j, 4+5.j]])
print(np.conj(B))
輸出:
[[1.-1.j, 2.+1.j],
[3.+2.j, 4.-5.j]]
15. 轉置矩陣 - Transpose matrix
把 A 矩陣中的行列編號互換,元素不變,只變位置後的結果稱為 A 矩陣的轉置矩陣,以 表示。
print(A.T)
輸出:
[[5, 5, 1, 3, 4, 5, 0, 4, 2],
[4, 6, 2, 4, 8, 1, 8, 3, 8],
[5, 4, 9, 7, 1, 5, 4, 0, 6],
[8, 0, 6, 8, 3, 7, 1, 3, 3],
[5, 9, 7, 4, 5, 3, 6, 6, 5],
[7, 8, 7, 6, 4, 9, 9, 4, 5],
[0, 6, 3, 9, 8, 9, 3, 5, 3],
[7, 5, 5, 2, 4, 8, 2, 9, 4]]
16. 共軛轉置矩陣 - Conjugate transpose matrix
把 A 矩陣的元素皆取共軛複數後,再取轉置;或將 A 矩陣的元素先取轉置後,再取共軛複數,所得到的新矩陣即為共軛轉置矩陣,以 表示。
print(np.matrix(B).H)
輸出:
matrix([[1.-1.j, 3.+2.j],
[2.+1.j, 4.-5.j]])
print(np.conj(B).T)
輸出:
[[1.-1.j, 3.+2.j],
[2.+1.j, 4.-5.j]]
17. 對稱矩陣 - Symmetrix matrix
在方陣的前提下,如果矩陣 A 的轉置等於 A 本身,稱之為對稱矩陣。
def symmetrixIO(mat):
return np.sum(mat != mat.T) == 0
print(symmetrixIO(C))
輸出:
False
18. 反對稱矩陣 - Skew symmetrix matrix
在方陣的前提下,如果矩陣 A 的轉置矩陣恰為 A 的相反矩陣 -A,則稱之為反對稱矩陣。
def skew_symmetrixIO(mat):
return np.sum(-mat != mat.T) == 0
print(skew_symmetrixIO(
np.array([[ 0, 2, 5],
[-2, 0, -7],
[-5, 7, 0]])
))
輸出:
True
19. 厄米特矩陣 - Hermitian matrix
在方陣的前提下,矩陣 A 的共軛轉置矩陣恰好等於原矩陣 A,則稱之為厄米特矩陣。
def hermitianIO(mat):
return np.sum(mat != np.conj(mat).T) == 0
print(hermitianIO(
np.array([[ 1, 1+1.j, 5],
[1-1.j, 2, 1.j],
[ 5, -1.j, 7]])
))
輸出:
True
20. 正交矩陣 - Orthogonal matrix
正交的意思就是指兩個向量彼此互相垂直,而正交矩陣則進一步把垂直的概念拓展到矩陣中,矩陣裡的每一個行和列向量必須彼此互相垂直,而且向量長度是1的情況下,才稱之為正交矩陣。總結矩陣的規則後,我們得到在方陣的前提下,滿足以下條件則稱之為正交矩陣:
因此很明顯的,一個正交矩陣必定是個方陣,而這一系列的條件判斷同樣可以被寫成一個函數用來檢測矩陣是否正交。
from Code.linalg import *
def orthogonalIO(mat, decimal=4):
# A^T = A^(-1)
cond1 = np.sum(np.round(mat.T, decimal) !=
np.round(inverse(mat), decimal)) == 0
# A^T . A = A . A^T
cond2 = np.sum(np.round(np.dot(mat.T, mat), decimal) !=
np.round(np.dot(mat, mat.T), decimal)) == 0
# |A| = +-1
cond3 = np.round(np.abs(determinant(mat)), decimal) == 1
return np.sum([cond1, cond2, cond3]) == 3
B = np.array([[-0.23939017, 0.58743526, -0.77305379],
[ 0.81921268, -0.30515101, -0.48556508],
[-0.52113619, -0.74953498, -0.40818426]])
print(orthogonalIO(B, decimal=4))
輸出:
True
為了更深入了解矩陣的底層運算,行列式值和逆矩陣都用的是我們自定義的函數,如果想看具體實現方法,歡迎持續關注發布的文章!在這個函數中我們首先就遇到了一個很簡單的理論與實際代碼之間的差異,那就是小數點近似問題。由於任意行列向量必須是單位向量,常常在實際情況是一個近似的結果,因此在檢測正交與否的時候也必須採用近似的方式操作。