numpy.linalg.matrix_rank

linalg.matrix_rank(M, tol=None, hermitian=False)[源代码]

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

数组的秩是数组中大于 tol .

在 1.14 版更改: 现在可以在矩阵的堆栈上操作

参数
M(m,),(…,m,n)类数组

输入向量或矩阵堆栈。

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

SVD值低于零的阈值。如果 tol 没有, S 是具有奇异值的数组 Meps 是数据类型的epsilon值 S 然后 tol 设置为 S.max() * max(M.shape) * eps .

在 1.14 版更改: 根据矩阵堆栈广播

hermitian可选的布尔

如果属实, M 假设为Hermitian(实值对称),从而可以更有效地找到奇异值。默认为false。

1.14 新版功能.

返回
rank(…)类似数组

军衔M。

笔记

检测等级不足的默认阈值是对 M . 默认情况下,我们识别的奇异值小于 S.max() * max(M.shape) * eps 表示等级不足(上面定义的符号)。这是Matlab使用的算法 [1] . 它也出现在 数字配方 线性最小二乘支持向量机解的讨论 [2] .

该默认阈值用于检测SVD计算中的数值误差导致的秩亏。假设有一列 M 这是其他列的精确(浮点)线性组合 M . 计算上的SVD M 一般不会产生完全等于0的奇异值:最小SVD值与0之间的任何差异都将由SVD计算中的数值不精确造成。我们对小SVD值的阈值考虑了这种数值不精确性,默认阈值将检测这种数值等级缺陷。阈值可以声明一个矩阵 M 即使某些列的线性组合 M 不完全等于的另一列 M 但只在数值上非常接近 M .

我们选择默认阈值是因为它被广泛使用。其他阈值也是可能的。例如,2007年版 数字配方 有一个可选的阈值 S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.) . 作者将此阈值描述为基于“预期的舍入误差”(第71页)。

上述阈值处理了SVD计算中的浮点舍入误差。但是,您可能有更多关于错误来源的信息 M 这会让你考虑其他的公差值来检测 有效的 等级不足。最有用的公差度量取决于您打算在矩阵上使用的操作。例如,如果您的数据来自不确定度大于浮点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页。

实例

>>> 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