使用scipy计算矩阵秩

问题描述 投票:40回答:7

我想用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的答案。

python matrix numpy scipy
7个回答
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

14
投票

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

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)

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)


2
投票

这个答案已经过时了。

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


1
投票

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

基本类中的内容往往是可以以独特和直接的方式执行的事情,例如最复杂的矩阵乘法。


1
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.