numpy.linalg.matrix_rank#

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

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

数组的秩是数组中大于 tol 的奇异值的数量.

在 1.14 版本发生变更: 现在可以在矩阵堆栈上操作

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

输入向量或矩阵堆栈.

tol(…) 类数组, 浮点数, 可选

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

在 1.14 版本发生变更: 针对矩阵堆栈进行广播

hermitianbool, 可选

如果为真,则假定 A 是厄米特矩阵(如果为实值则为对称矩阵),这样可以更有效地找到奇异值.默认为 False.

在 1.14 版本加入.

rtol(…) 类数组, 浮点数, 可选

相对容差分量的参数.一次只能设置 tolrtol .默认为 max(M, N) * eps .

在 2.0.0 版本加入.

返回:
rank(…) 类数组

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 秩亏.

我们选择我们的默认阈值是因为它被广泛使用.其他阈值也是可能的.例如,在2007年版的《Numerical recipes》的其他地方,有一个替代阈值 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