numpy.linalg.matrix_rank#

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

使用 SVD 方法返回数组的矩阵秩

数组的秩是数组中大于 tol 的奇异值的个数。

在版本 1.14 中更改: 现在可以对矩阵堆栈进行操作

参数:
A{(M,), (…, M, N)} array_like

输入向量或矩阵堆栈。

tol(…) array_like, float, 可选

低于该阈值的 SVD 值被认为是零。如果 tol 为 None,并且 S 是一个包含 M 奇异值的数组,并且 epsS 数据类型的 epsilon 值,那么 tol 将设置为 S.max() * max(M, N) * eps

在版本 1.14 中更改: 广播到矩阵堆栈上

hermitianbool, 可选

如果为 True,则假定 A 为 Hermitian(如果为实值则为对称),从而可以使用更有效的方法来查找奇异值。默认为 False。

在版本 1.14 中新增。

rtol(…) array_like, float, 可选

相对容差分量的参数。一次只能设置 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 参考文档,“秩” 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