numpy.linalg.matrix_rank#

linalg.matrix_rank(A, tol=None, hermitian=False, *, rtol=None)[source]#

使用 SVD 方法回傳陣列的矩陣秩

陣列的秩是陣列中大於 tol 的奇異值數量。

參數:
A{(M,), (…, M, N)} array_like

輸入向量或矩陣堆疊。

tol(…) array_like, float, optional

低於此閾值的 SVD 值會被視為零。如果 tol 為 None,且 S 是具有 M 奇異值的陣列,且 epsS 資料類型的 epsilon 值,則 tol 會設定為 S.max() * max(M, N) * eps

hermitianbool, optional

如果為 True,則假設 A 為 Hermitian(若為實值則為對稱),從而能夠使用更有效率的方法來尋找奇異值。預設為 False。

rtol(…) array_like, float, optional

相對容差元件的參數。一次只能設定 tolrtol。預設為 max(M, N) * eps

2.0.0 版本新增。

回傳值:
rank(…) array_like

A 的秩。

註解

偵測秩不足的預設閾值是對 A 的奇異值大小進行測試。依預設,我們將小於 S.max() * max(M, N) * eps 的奇異值識別為指示秩不足(符號如上定義)。這是 MATLAB 使用的演算法 [1]。它也出現在數值食譜中關於線性最小平方法 SVD 解的討論 [2]。

此預設閾值旨在偵測考量 SVD 計算數值誤差的秩不足。想像一下,A 中有一列是 A 中其他列的精確(在浮點數中)線性組合。在 A 上計算 SVD 通常不會產生完全等於 0 的奇異值:最小 SVD 值與 0 的任何差異都將是由於 SVD 計算中的數值不精確性所造成的。我們用於小 SVD 值的閾值考慮了這種數值不精確性,而預設閾值將偵測到這種數值秩不足。即使 A 的某些列的線性組合不完全等於 A 的另一列,而僅在數值上非常接近 A 的另一列,該閾值也可能宣告矩陣 A 秩不足。

我們選擇預設閾值是因為它被廣泛使用。其他閾值也是可能的。例如,在 2007 年版的數值食譜的其他地方,還有一個替代閾值 S.max() * np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.)。作者將此閾值描述為基於「預期的捨入誤差」(第 71 頁)。

上述閾值處理 SVD 計算中的浮點捨入誤差。但是,您可能有關於 A 中誤差來源的更多資訊,這會讓您考慮其他容差值來偵測有效秩不足。容差的最有用度量取決於您打算在矩陣上使用的運算。例如,如果您的資料來自不確定性大於浮點 epsilon 的不確定性測量,則選擇接近該不確定性的容差可能更佳。如果不確定性是絕對的而不是相對的,則容差可能是絕對的。

參考文獻

[1]

MATLAB 參考文件,「Rank」 https://www.mathworks.com/help/techdoc/ref/rank.html

[2]

W. H. Press、S. A. Teukolsky、W. T. Vetterling 和 B. P. Flannery,「Numerical Recipes (第 3 版)」,Cambridge University Press,2007 年,第 795 頁。

範例

>>> import numpy as np
>>> from numpy.linalg import matrix_rank
>>> matrix_rank(np.eye(4)) # Full rank matrix
4
>>> I=np.eye(4); I[-1,-1] = 0. # rank deficient matrix
>>> matrix_rank(I)
3
>>> matrix_rank(np.ones((4,))) # 1 dimension - rank 1 unless all 0
1
>>> matrix_rank(np.zeros((4,)))
0