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, 可选
低于此阈值的奇异值将被视为零。如果tol为 None,并且
S
是具有M奇异值的数组,并且eps
是S
数据类型的 epsilon 值,则tol设置为S.max() * max(M, N) * eps
。- hermitianbool, 可选
如果为 True,则假定A为 Hermitian 矩阵(如果为实值,则为对称矩阵),从而可以采用更有效的方法查找奇异值。默认为 False。
- rtol(…) array_like, float, 可选
相对容差分量的参数。一次只能设置
tol
或rtol
。默认为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 的奇异值:最小奇异值与 0 的任何差异都是由 SVD 计算中的数值不精确引起的。我们对小奇异值的阈值考虑了这种数值不精确,默认阈值将检测这种数值秩亏缺。即使一些列的A的线性组合并不完全等于A的另一列,而只是数值上非常接近A的另一列,该阈值也可能声明矩阵A秩亏缺。
我们选择默认阈值是因为它被广泛使用。其他阈值也是可能的。例如,《数值方法》2007 年版的其他地方有一个替代阈值
S.max() * np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.)
。作者将此阈值描述为基于“预期的舍入误差”(第 71 页)。上述阈值处理了 SVD 计算中的浮点舍入误差。但是,您可能拥有更多关于A中误差来源的信息,这将使您考虑其他容差值来检测有效秩亏缺。容差最有用的度量取决于您打算对矩阵执行的操作。例如,如果您的数据来自不确定性大于浮点 epsilons 的不确定测量,则选择接近该不确定性的容差可能更好。如果误差是绝对误差而不是相对误差,则容差可能是绝对误差。
参考文献
[1]MATLAB 参考文档,“秩” https://www.mathworks.com/help/techdoc/ref/rank.html
[2]W. H. Press、S. A. Teukolsky、W. T. Vetterling 和 B. P. Flannery,“数值方法(第三版)”,剑桥大学出版社,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