我想用scipy计算矩阵的mathematical rank。最明显的函数numpy.rank
计算数组的维数(即标量有维度0,向量1,矩阵2等)。我知道numpy.linalg.lstsq
模块具有此功能,但我想知道这样的基本操作是否内置于某个矩阵类中。
这是一个明确的例子:
from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)
这会给2
维度,我正在寻找3
的答案。
答案 0 :(得分:55)
Numpy提供numpy.linalg.matrix_rank()
:
>>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3
答案 1 :(得分:14)
为需要在实践中完成此操作的人提供粗略的代码段。随意改进。
u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
答案 2 :(得分:5)
如果numpy
没有提供等级设施,为什么不自己编写?
计算秩的有效方法是通过奇异值分解 - 矩阵的秩等于非零奇异值的数量。
def rank(A, eps=1e-12):
u, s, vh = numpy.linalg.svd(A)
return len([x for x in s if abs(x) > eps])
请注意,eps
取决于您的应用程序 - 大多数人会同意1e-12对应于零,但即使是eps = 1e-9,您也可能会看到数值不稳定。
使用您的示例,答案是三。如果将第二行更改为[2, 6, 14]
(与第一行线性相关),则答案为2(“零”特征值为4.9960E-16)
答案 3 :(得分:2)
此答案已过期。
答案是否定的 - 目前还没有专门用于计算scipy中数组/矩阵的矩阵等级的函数。之前已经讨论过添加一个,但如果它会发生,我认为它还没有。
答案 4 :(得分:1)
我特别不了解Numpy,但这不太可能是矩阵的内置操作;它涉及相当密集的数值计算(以及关于浮点舍入误差等的相关问题)和在给定上下文中可能适合或可能不适合的阈值选择,并且算法选择对于准确和快速地计算它很重要。
基本类中的内容往往是可以以独特和直接的方式执行的事情,例如最复杂的矩阵乘法。
答案 5 :(得分:1)
线性代数函数通常分为numpy.linalg
。 (它们也可以从scipy.linalg
获得,它具有更多功能。)这允许多态:函数可以接受SciPy处理的任何类型。
所以,是的, numpy.linalg.lstsq
函数可以满足您的要求。为什么不够?
答案 6 :(得分:1)
scipy
现在包含一个有效的interpolative method,用于使用随机方法估算矩阵/ LinearOperator的等级,这通常足够准确:
>>> from numpy import matrix
>>> A = matrix([[1,3,7],[2,8,3],[7,8,1]], dtype=float) # doesn't accept int
>>> import scipy.linalg.interpolative as sli
>>> sli.estimate_rank(A, eps=1e-10)
3