在線性代數、科學計算以及機器學習中,經常需要進行矩陣乘法、求解線性方程組、矩陣分解以及向量與矩陣范數計算等操作。NumPy 提供了一組線性代數函數,主要集中在 numpy.linalg 模塊中,用于完成這些運算。
這些函數采用高度向量化實現,并調用底層高性能數學庫(如 BLAS 與 LAPACK),能夠高效處理向量與矩陣計算任務。
按照功能劃分,NumPy 中常用的線性代數函數通常可以分為以下幾類:
(1)矩陣與向量乘法及冪運算
(2)矩陣分解
(3)線性方程組求解
(4)矩陣特征值與特征向量
(5)矩陣范數與條件數
(6)矩陣逆與偽逆
(7)矩陣行列式與秩
一、矩陣與向量乘法及冪運算
matmul()
用于執行矩陣乘法運算(Matrix Multiplication)。與 Python 的 @ 運算符等價。
numpy.matmul(a, b)參數說明:
? a:輸入數組或矩陣
? b:輸入數組或矩陣
函數行為說明:
當輸入為高維數組時,matmul() 會對最后兩個維度執行矩陣乘法,其余維度作為批處理維度。
示例:
# [43 50]]等價寫法:
A @ Bdot()
計算向量點積或矩陣乘法(Dot Product)。
numpy.dot(a, b)函數行為說明:
? 對一維數組執行向量點積
? 對二維數組執行矩陣乘法
? 對更高維數組按照最后一維與倒數第二維進行乘法運算
參數說明:
? a:輸入數組或矩陣
? b:輸入數組或矩陣
示例 1:向量點積
# 32解釋:
1×4 + 2×5 + 3×6 = 32示例 2:矩陣乘法
# [43 50]]在二維矩陣場景下,dot() 與 matmul() 的結果通常一致;但在更高維數組上,兩者的廣播與乘法語義并不完全相同,實際使用中通常更推薦使用 matmul() 或 @ 表達矩陣乘法。
multi_dot()
計算多個矩陣的連乘,并自動選擇較優的乘法順序。
numpy.linalg.multi_dot(arrays)參數說明:
? arrays:由多個數組組成的序列
示例:
# [143]]該運算等價于:
(A @ B) @ Cmulti_dot() 會自動選擇更高效的矩陣乘法順序,特別適用于多個矩陣連乘的場景。
matrix_power()
計算方陣的整數次冪(Matrix Power)。
numpy.linalg.matrix_power(a, n)參數說明:
? a:輸入方陣
? n:整數冪,可以為正整數、負整數或 0
返回:
a 的 n 次冪,結果形狀與原矩陣相同。
函數行為說明:
? 當 n > 0 時,計算 a 的正整數次冪
? 當 n = 0 時,返回與 a 同形狀的單位矩陣
? 當 n < 0 時,先計算 a 的逆矩陣,再求其 |n| 次冪
? 若 a 不是方陣,或 n < 0 且矩陣不可逆,則會報錯
示例 1:
# [15 22]]示例 2:
# [0 1]]示例 3:
# 等價于 np.linalg.inv(A)matrix_power() 適用于狀態轉移矩陣、遞推關系、圖路徑計數等問題。它計算的是矩陣乘法意義下的冪,不是元素逐個求冪;若需要逐元素冪運算,應使用 ** 或 np.power()。
二、矩陣分解
svd()
奇異值分解(Singular Value Decomposition)。
完整形式:
numpy.linalg.svd(a, full_matrices=True, compute_uv=True)常用形式:
numpy.linalg.svd(a)參數說明:
? a:輸入矩陣
返回:
U, S, Vt其中:
? U:左奇異向量矩陣
? S:奇異值數組
? Vt:右奇異向量矩陣的轉置
示例:
U, S, Vt = np.linalg.svd(A)奇異值分解廣泛應用于:
? 主成分分析(PCA)
? 降維
? 矩陣近似
svdvals()
計算矩陣的奇異值,但不返回奇異向量。
numpy.linalg.svdvals(a)參數說明:
? a:輸入矩陣
示例:
np.linalg.svdvals(A)若只需要奇異值而不需要奇異向量,可直接使用該函數。
qr()
QR 分解。
numpy.linalg.qr(a)參數說明:
? a:輸入矩陣
返回:
Q, R其中:
? Q:正交矩陣
? R:上三角矩陣
示例:
Q, R = np.linalg.qr(A)QR 分解常用于最小二乘問題以及數值穩定的線性方程求解。
cholesky()
Cholesky 分解。
numpy.linalg.cholesky(a)參數說明:
? a:輸入方陣,必須是對稱正定矩陣
返回:
L滿足:
A = L @ L.T示例:
L = np.linalg.cholesky(A)Cholesky 分解常用于:
? 協方差矩陣分解
? 數值優化
? 高效求解線性方程組
三、線性方程組求解
solve()
用于求解滿秩方陣對應的線性方程組。若系數矩陣奇異或不是方陣,應考慮 lstsq() 等方法。
numpy.linalg.solve(a, b)參數說明:
? a:系數矩陣
? b:常數向量
求解:
Ax = b示例:
# [2. 3.]結果即為:
y = 3lstsq()
最小二乘解(Least Squares Solution)。
numpy.linalg.lstsq(a, b, rcond=None)參數說明:
? a:系數矩陣
? b:目標向量
? rcond:截斷閾值
示例:
x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)最小二乘法常用于:
? 線性回歸
? 數據擬合
四、矩陣特征值與特征向量
eig()
計算矩陣特征值與特征向量。
numpy.linalg.eig(a)參數說明:
? a:方陣
返回:
w, v其中:
? w:特征值
? v:特征向量
示例:
# [2. 3.]特征值分解常用于:
? PCA
? 動態系統分析
? 馬爾可夫鏈
eigh()
計算實對稱矩陣或 Hermitian 矩陣的特征值與特征向量。
numpy.linalg.eigh(a)參數說明:
? a:實對稱矩陣或 Hermitian 矩陣
返回:
w, v其中:
? w:特征值
? v:特征向量
eigh() 專門用于實對稱矩陣或 Hermitian 矩陣,通常比 eig() 更適合這類問題,數值上也更穩定。常用于:
? 協方差矩陣分析
? 主成分分析(PCA)
eigvals()
計算矩陣特征值,但不返回特征向量。
numpy.linalg.eigvals(a)參數說明:
? a:輸入方陣
示例:
# [2. 3.]eigvals() 返回一般方陣的特征值,不返回特征向量。結果通常不保證排序;對于實矩陣,特征值也可能為復數。
eigvalsh()
計算實對稱矩陣或 Hermitian 矩陣的特征值,但不返回特征向量。
numpy.linalg.eigvalsh(a, UPLO='L')參數說明:
? a:實對稱矩陣或 Hermitian 矩陣
? UPLO:指定使用矩陣的哪一部分參與計算
- 'U':使用上三角部分返回:
按升序排列的特征值數組。
示例:
# array([1., 3.])eigvalsh() 與 eigh() 類似,適用于實對稱矩陣或復 Hermitian 矩陣。二者的區別在于:
? eigh():返回特征值和特征向量
? eigvalsh():只返回特征值
因此,當只關心特征值而不需要特征向量時,eigvalsh() 更直接,也更節省計算開銷。
五、矩陣范數與條件數
norm()
計算向量或矩陣范數(Norm)。
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)參數說明:
? x:輸入向量或矩陣
? ord:范數類型。ord 的具體含義取決于輸入對象(向量或矩陣)
對于矩陣,ord=None 時通常對應默認矩陣范數;ord 的具體解釋應結合輸入維度理解? axis:指定沿哪個軸計算范數
? keepdims:是否保留被約簡的維度
示例:
# 5.0這里計算的是向量長度(歐幾里得范數): 。
cond()
計算矩陣條件數(Condition Number)。默認計算基于 2-范數的條件數。
numpy.linalg.cond(x, p=None)參數說明:
? x:輸入矩陣
? p:范數類型,默認使用 2-范數條件數
示例:
np.linalg.cond(A)條件數用于衡量矩陣的數值穩定性:條件數越大,數值誤差越容易放大。
六、矩陣逆與偽逆
inv()
計算矩陣的逆矩陣。
numpy.linalg.inv(a)參數說明:
? a:方陣
示例:
np.linalg.inv(A)輸入必須是方陣,且該方陣可逆;否則會引發線性代數錯誤。
在數值計算中,若目的是求解線性方程組,通常優先使用 solve(),而不是先求逆再相乘。
pinv()
計算矩陣的偽逆(Moore-Penrose Pseudoinverse)。
numpy.linalg.pinv(a)參數說明:
? a:輸入矩陣
示例:
np.linalg.pinv(A)偽逆常用于:
? 不可逆矩陣
? 線性回歸
? 最小二乘問題
七、矩陣行列式與秩
det()
計算矩陣行列式(Determinant)。
numpy.linalg.det(a)參數說明:
? a:方陣
示例:
# -2.0行列式為 0 表示矩陣不可逆。
matrix_rank()
計算矩陣秩(Matrix Rank)。
numpy.linalg.matrix_rank(a)參數說明:
? a:輸入矩陣
示例:
# 1矩陣秩表示矩陣中線性無關行(或列)的數量。
slogdet()
以更穩定的方式計算矩陣行列式的符號與對數絕對值。
numpy.linalg.slogdet(a)參數說明:
? a:輸入方陣
返回:
? sign:行列式的符號
? logabsdet:行列式絕對值的自然對數,即 log(abs(det(a)))
示例:
print(logabsdet) # 約 0.693147...因為 det(A) = -2,所以其符號 sign = -1;又因為 abs(det(A)) = 2,故 logabsdet = log(2) ≈ 0.693147。
補充說明:
slogdet() 適合處理行列式絕對值很大或很小的矩陣。與直接計算 det() 相比,它在數值上更穩定,更不容易因為浮點數范圍限制而產生上溢或下溢。若需要恢復原行列式,可利用:
det = sign * np.exp(logabsdet)當矩陣行列式為 0 時,返回結果中 sign 為 0,logabsdet 為 -inf。
對復數矩陣,sign 可能是模長為 1 的復數,而不只是 -1、0、1。
小結
NumPy 在 numpy.linalg 模塊中提供了一組用于線性代數計算的函數體系,包括矩陣與向量乘法及冪運算(matmul、dot、multi_dot、matrix_power)、矩陣分解(svd、qr、cholesky)、線性方程組求解(solve、lstsq)、特征值與特征向量計算(eig、eigh、eigvals、eigvalsh),以及范數、條件數、逆矩陣、偽逆、行列式、對數行列式和矩陣秩等分析工具。這些函數廣泛應用于科學計算、機器學習、信號處理與數值優化等領域。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.