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 的奇异值数组,并且eps是S数据类型的 epsilon 值,则 tol 设置为S.max() * max(M, N) * eps。- hermitianbool, optional
如果为 True,则假定 A 是厄米矩阵(实值时为对称矩阵),从而可以使用更有效的方法来查找奇异值。默认为 False。
- rtol(…) array_like, float, optional
相对容差分量的参数。一次只能设置
tol或rtol。默认为max(M, N) * eps。版本 2.0.0 中新增。
- 返回:
- rank(…) array_like
A 的秩。
备注
检测秩亏损的默认阈值是对 A 的奇异值大小的测试。默认情况下,我们将小于
S.max() * max(M, N) * eps的奇异值视为秩亏损(如上文所示)。这是 MATLAB 使用的算法 [1]。它也出现在Numerical recipes 关于线性最小二乘法的 SVD 解的讨论中 [2]。此默认阈值旨在考虑 SVD 计算的数值误差来检测秩亏损。设想 A 中有一列是 A 中其他列的精确(浮点数)线性组合。在一般情况下,计算 A 的 SVD 不会产生正好为 0 的奇异值:最小 SVD 值与 0 的任何差异都将由 SVD 计算中的数值精度引起。我们对小的 SVD 值的阈值考虑了这种数值精度,并且默认阈值将检测到这种数值秩亏损。即使 A 的某些列的线性组合不等于 A 的另一列,但仅在数值上非常接近 A 的另一列,该阈值也可能将矩阵 A 声明为秩亏损。
我们选择默认阈值是因为它被广泛使用。其他阈值也是可能的。例如,在Numerical recipes 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 and B. P. Flannery, “Numerical Recipes (3rd edition)”, Cambridge University Press, 2007, page 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