使用scipy计算矩阵秩
我想用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