43

我想使用 scipy 计算矩阵的数学秩。最明显的函数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

4

7 回答 7

62

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
于 2011-08-01T15:32:57.597 回答
15

为需要在实践中完成这项工作的人提供粗略的代码片段。随意改进。

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
于 2010-07-28T18:24:14.433 回答
7

如果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](与第一行线性相关)答案是二(“零”特征值为 4.9960E-16)

于 2010-07-28T18:36:57.750 回答
3

这个答案已经过时了。

答案是否定的——目前没有专门用于计算 scipy 中数组/矩阵的矩阵秩的函数。之前已经讨论过添加一个,但如果它会发生,我不相信它还没有。

于 2010-03-19T00:21:28.833 回答
1

我不特别了解 Numpy,但这不太可能是矩阵上的内置操作;它涉及相当密集的数值计算(以及与浮点舍入误差等相关的问题)和阈值选择,在给定的上下文中可能合适也可能不合适,算法选择对于准确快速地计算很重要。

内置在基本类中的东西往往是可以以独特而直接的方式执行的东西,例如最复杂的矩阵乘法。

于 2010-03-18T23:22:58.197 回答
1

线性代数函数通常分组numpy.linalg在. (它们也可以从scipy.linalg具有更多功能的 中获得。)这允许多态性:这些函数可以接受 SciPy 处理的任何类型。

所以,是的,numpy.linalg.lstsq功能可以满足您的要求。为什么这还不够?

于 2010-03-18T23:25:41.327 回答
1

scipy现在包含一种有效的插值方法,用于使用随机方法估计矩阵/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
于 2018-02-19T14:01:58.517 回答