使用scipy计算矩阵秩

43 投票
7 回答
42166 浏览
提问于 2025-04-15 20:35

我想用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

7 个回答

8

如果 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)。

16

这里提供了一个简单的代码示例,供需要实际操作的人参考。欢迎大家进行改进。

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

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

撰写回答