NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.linalg.matrix_rank
numpy.linalg.
matrix_rank
(M,tol = None,hermitian = False )[源代码] ¶使用SVD方法返回数组的矩阵秩
数组的秩是大于tol的数组奇异值的数量。
在版本1.14中更改:现在可以在矩阵堆栈上进行操作
输入向量或矩阵堆栈。
低于此阈值的SVD值被视为零。如果tol为None,并且S
是具有M的奇异值的数组,并且
eps
是数据类型为的epsilon值S
,则tol设置为。S.max() * max(M.shape) * eps
在版本1.14中更改:在矩阵堆栈中广播
如果为True,则M假定为Hermitian(如果为实值,则为对称),从而可以更有效地找到奇异值。默认为False。
1.14版的新功能。
M的等级
笔记
检测秩不足的默认阈值是对M的奇异值的大小的测试。默认情况下,我们识别出小于表示秩不足的奇异值(使用上面定义的符号)。这是MATLAB使用的算法[1]。它也出现在针对线性最小二乘的SVD解决方案讨论中的数值配方中[2]。S.max() * max(M.shape) * eps
此默认阈值旨在检测由于SVD计算的数值误差而导致的秩不足。想象有在一列中号线性在其他列的组合是一种精确(浮点)中号。通常,在M上计算SVD 不会产生精确等于0的奇异值:最小SVD值与0的任何差异将由SVD计算中的数值不精确性引起。我们的小SVD值阈值考虑了此数字不精确性,默认阈值将检测到此类数字秩不足。该阈值可以声明一个矩阵中号秩亏即使某些列的线性组合中号不完全等于M的另一列,而在数值上仅非常接近M的另一列 。
我们选择默认阈值是因为它已被广泛使用。其他阈值也是可能的。例如,在2007年版《数字食谱》的其他地方,还有一个替代阈值。作者将这个阈值描述为基于“预期的舍入误差”(第71页)。S.max() *
np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.)
上面的阈值处理SVD计算中的浮点舍入误差。但是,您可能具有有关M中误差源的更多信息,这将使您考虑其他公差值来检测有效等级不足。公差最有用的度量取决于要在矩阵上使用的运算。例如,如果您的数据来自不确定性测量,其不确定性大于浮点ε,那么选择接近该不确定性的容差可能会更好。如果不确定性是绝对的而不是相对的,则公差可能是绝对的。
参考文献
MATLAB参考文献“ Rank” https://www.mathworks.com/help/techdoc/ref/rank.html
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