機器學習中會用到大量的數學操作,而 Numpy 計算庫使這些操作變得簡單,這其中就涉及到了 Numpy 的矩陣操作,下面我們就來一起學習如何在 Numpy 科學計算庫中進行矩陣的一些基本運算。
1 矩陣的定義
定義矩陣使用 Numpy 科學計算庫中的 mat 函數,如下所示:
numpy.mat(data, dtype=None)- data,表示矩陣的資料。
- dtype,表示矩陣中的資料類型,預設是浮點數。
應用示例:
# (1) 定義一個3 X 3的矩陣,資料類型為 int
import numpy as np
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
A = np.mat(data, int)
print(A, type(A))
# 輸出結果:
#[[1 2 3]
# [4 5 6]
# [7 8 9]] <class 'numpy.matrix'>
# (2) 定義一個3 X 3的矩陣,矩陣元素全為0,資料類型為 int
import numpy as np
A = np.mat(np.zeros((3, 3)), int)
print(A)
# 輸出結果:
#[[0 0 0]
# [0 0 0]
# [0 0 0]]
# (3) 定義一個3 X 3的矩陣,矩陣元素全為1
import numpy as np
A = np.mat(np.ones((3, 3)))
print(A)
# 輸出結果:
#[[1. 1. 1.]
# [1. 1. 1.]
# [1. 1. 1.]]
# (4) 定義一個3 X 3的機關矩陣
import numpy as np
A = np.mat(np.eye(3, 3), int)
print(A)
# 輸出結果:
#[[1 0 0]
# [0 1 0]
# [0 0 1]]
# (5) 定義一個3 X 3的對角矩陣,主對角線之外的元素皆為0
import numpy as np
A = np.mat(np.diag([1, 2, 3]), int)
print(A)
# 輸出結果:
#[[1 0 0]
# [0 2 0]
# [0 0 3]]
# (6) 定義一個3 X 3的矩陣,把100作為所有元素初始值
import numpy as np
A = np.mat(np.full((3, 3), 100), int)
print(A)
# 輸出結果:
#[[100 100 100]
# [100 100 100]
# [100 100 100]]
2 矩陣的線性代數運算
2.1 矩陣的加法與減法
隻有兩個矩陣的行數和列數相等時,才可以進行矩陣的加法和減法運算,否則程式會抛出 ValueError 異常。
應用示例:
# 定義兩個矩陣 A 和 B,分别進行矩陣的加法和減法運算
import numpy as np
A = np.mat(np.full((3, 3), 100), int)
B = np.mat(np.full((3, 3), 200), int)
print(A+B)
print(A-B)
# 輸出結果:
#[[300 300 300]
# [300 300 300]
# [300 300 300]]
#[[-100 -100 -100]
# [-100 -100 -100]
# [-100 -100 -100]]
2.2 矩陣的數乘
某個實數乘以矩陣稱作矩陣的數乘。
應用示例:
# 定義矩陣 A 和浮點數 a,進行矩陣的數乘運算
import numpy as np
a = 0.1
A = np.mat(np.full((3, 3), 100), int)
print(a*A)
# 輸出結果:
#[[10. 10. 10.]
# [10. 10. 10.]
# [10. 10. 10.]]
2.3 矩陣的點乘
隻有在第一個矩陣的列數與第二個矩陣的行數相等時,兩個矩陣才能相乘,否則程式會抛出 ValueError 異常。
應用示例:
# 定義矩陣 A 和矩陣 B,進行矩陣的乘法運算
import numpy as np
A = np.mat(np.full((2, 3), 10), int)
B = np.mat(np.full((3, 3), 10), int)
print(A*B) # 求矩陣相乘形式一
print(A.dot(B)) # 求矩陣相乘形式二
print(np.dot(A, B)) # 求矩陣相乘形式三
# 輸出結果:
#[[300 300 300]
# [300 300 300]]
#[[300 300 300]
# [300 300 300]]
2.4 矩陣的轉置
把矩陣的每一行轉換為列,稱為矩陣的轉置。
應用示例:
# 定義矩陣 A,進行矩陣轉置運算
import numpy as np
data = [[1,2,3],[4,5,6],[7,8,9]]
A = np.mat(data, int)
print(A.T)
# 輸出結果:
#[[1 4 7]
# [2 5 8]
# [3 6 9]]
2.5 矩陣的求逆
非奇異矩陣下,可以對矩陣進行求逆運算。(非奇異矩陣就是行列式不為 0 的矩陣)
應用示例:
# 定義矩陣 A,進行矩陣求逆運算
import numpy as np
data = [[1, 2], [3, 4]]
A = np.mat(data, int)
print(A.I)
# 輸出結果:
#[[-2. 1. ]
# [ 1.5 -0.5]]
2.6 矩陣的行列式
對于矩陣 A,均可對應一個标量 det(A),它的值将告訴我們矩陣是否為非奇異的。
應用示例:
# 求矩陣 A 的行列式 det(A)
import numpy as np
A = np.mat([[1, 2],[3, 4]], int)
det = np.linalg.det(A)
print(det)
# 輸出結果:
# -2.0000000000000004
計算結果不等于-2,是因為浮點數運算存在精度損失。
2.7 矩陣的秩
如果把矩陣看成一個向量組,那麼秩就是線性無關向量的個數,也就是向量組的次元,概念比較複雜,有興趣的讀者可以繼續探索。矩陣的秩應該是小于等于行數與列數的最小值。
# 求矩陣 A 的秩 rank(A)
import numpy as np
A = np.mat([[1, 2],[3, 4]], int)
rank = np.linalg.matrix_rank(A)
print(rank)
# 輸出結果:
# 2
2.8 矩陣特征值和特征向量
A 為 n 階矩陣,若數 λ 和 n 維非0列向量 x 滿足 Ax=λx,那麼數 λ 稱為 A 的特征值,x 稱為 A 的對應于特征值 λ的特征向量。
應用示例:
# 求矩陣 A 的特征值和其對應的特征向量
import numpy as np
A = np.mat([[1, 2],[3, 4]], int)
value, vector = np.linalg.eig(A)
print(value)
print(vector)
# 輸出結果:
#[-0.37228132 5.37228132]
#[[-0.82456484 -0.41597356]
# [ 0.56576746 -0.90937671]]
2.9 矩陣的線性方程解
求解形如 Ax = b 的線性方程組,其中 A 為矩陣,b 為一維或二維的數組,x 是未知變量。
應用舉例:
# 求解如下線性方程組的解:
# x + y + z = 3
# 3x + y + 4z = 8
# 8x + 9y + 5z = 22
import numpy as np
A = np.mat([[1, 1, 1], [3, 1, 4], [8, 9, 5]], int)
b = np.mat([[3], [8], [22]], int)
x = np.linalg.solve(A,b)
print(x)
# 輸出結果:
#[[1.]
# [1.]
# [1.]]