numpy.linalg.matrix_rank #
- 利纳尔格。matrix_rank ( A , tol = None , Hermitian = False ) [来源] #
使用 SVD 方法返回数组的矩阵秩
数组的秩是数组中大于tol的奇异值的数量。
版本 1.14 中的更改:现在可以对矩阵堆栈进行操作
- 参数:
- 一个{(M,), (…, M, N)} 类似数组
输入向量或矩阵堆栈。
- tol (…) 类似数组,浮点数,可选
低于该阈值的 SVD 值被视为零。如果tol为 None,并且是具有M
S
奇异值的数组,并且 是 数据类型的 epsilon 值,则tol设置为。eps
S
S.max() * max(M, N) * eps
版本 1.14 中更改:针对矩阵堆栈进行广播
- Hermitian布尔值,可选
如果为真,则 A被假定为 Hermitian(如果为实值则对称),从而可以使用更有效的方法来查找奇异值。默认为 False。
1.14 版本中的新增功能。
- 返回:
- 排名(...) 类似数组
等级A。
笔记
检测排名不足的默认阈值是对A奇异值大小的测试。默认情况下,我们将小于的奇异值识别为指示等级不足(使用上面定义的符号)。这是 MATLAB 使用的算法 [1]。它也出现在讨论线性最小二乘的 SVD 解决方案的数值配方中 [2]。
S.max() * max(M, N) * eps
此默认阈值旨在检测考虑 SVD 计算数值错误的排名缺陷。想象一下A中的一列是A中其他列的精确(以浮点形式)线性组合。一般来说,计算A上的 SVD不会产生完全等于 0 的奇异值:最小 SVD 值与 0 的任何差异都将由 SVD 计算中的数值不精确引起。我们针对小 SVD 值的阈值考虑了这种数值不精确性,默认阈值将检测这种数值排名缺陷。即使A的某些列的线性组合不完全等于A的另一列,而只是在数值上非常接近 A的另一列,阈值也可以声明矩阵A秩不足。
我们选择默认阈值是因为它被广泛使用。其他阈值也是可能的。例如,2007 年版《数值食谱》中的其他地方有一个替代阈值。作者将这个阈值描述为基于“预期舍入误差”(第 71 页)。
S.max() * np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.)
上述阈值处理 SVD 计算中的浮点舍入误差。但是,您可能有关于A中的错误来源的更多信息,这将使您考虑其他容差值来检测有效的排名缺陷。最有用的容差度量取决于您打算在矩阵上使用的操作。例如,如果您的数据来自不确定性测量,且不确定性大于浮点 epsilon,则选择接近该不确定性的容差可能更好。如果不确定性是绝对的而不是相对的,则容差可以是绝对的。
参考
[ 1 ]MATLAB 参考文档,“Rank” https://www.mathworks.com/help/techdoc/ref/rank.html
[ 2 ]WH Press、SA Teukolsky、WT Vetterling 和 BP Flannery,“数值食谱(第 3 版)”,剑桥大学出版社,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