上一主题

numpy.linalg.det

下一主题

numpy.linalg.slogdet

numpy.linalg.matrix_rank

numpy.linalg.matrix_rank(M, tol=None)[source]

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

数组的等级是数组的SVD奇异值的数目大于tol

参数:

M:{(M,),(M,N)} array_like

数组

tol:{None,float},可选

阈值,在该阈值以下SVD值被认为是零。如果tol为无,并且S是具有M的奇异值的数组,并且eps对于S的数据类型,则将tol设置为S.max() * max(M.shape) * eps

笔记

The default threshold to detect rank deficiency is a test on the magnitude of the singular values of M. By default, we identify singular values less than S.max() * max(M.shape) * eps as indicating rank deficiency (with the symbols defined above). 这是MATLAB使用的算法[1]。它也出现在数值配方中讨论的SVD解的线性最小二乘法[2]。

该默认阈值被设计为检测SVD计算的数值误差的秩错误。假设在M中有一列,它是M中其他列的精确(在浮点中)线性组合。在M上计算SVD通常不会产生精确等于0的奇异值:最小SVD值与0的任何差异将由SVD的计算中的数值不精确引起。我们对小SVD值的阈值考虑了这种数值不精确性,并且默认阈值将检测这种数值秩缺陷。即使M的一些列的线性组合不完全等于M的另一列,但是阈值可以声明矩阵M只在数字上非常接近M的另一列。

我们选择了默认阈值,因为它被广泛使用。其他阈值是可能的。例如,在数字配方的2007版本的其他地方,存在S.max() * np.finfo(M.dtype).eps / 2. * np.sqrt(m t8 > + n + 1. )作者将此阈值描述为基于“预期四舍五入误差”(p 71)。

上述阈值在SVD的计算中处理浮点舍入误差。但是,您可能有更多关于M中的错误来源的信息,这将使您考虑其他容差值来检测有效排名缺陷。对公差的最有用的度量取决于你打算在矩阵上使用的操作。例如,如果您的数据来自不确定度大于浮点ε的不确定度,则选择接近该不确定度的容差可能更可取。如果不确定性是绝对的而不是相对的,容差可以是绝对的。

参考文献

[R39]MATLAB参考文档“Rank”http://www.mathworks.com/help/techdoc/ref/rank.html
[R40]W.K.Veterling和B.P.Flannery,“Numerical Recipes(3rd edition)”,Cambridge University Press,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