numpy.linalg.matrix_rank#

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

使用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,可选

如果为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 的不确定测量,则选择接近该不确定性的容差可能是更可取的. 如果不确定性是绝对的而不是相对的,则容差可能是绝对的.

参考文献

[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