使用scipy计算matrix排名

我想用scipy来计算一个matrix的math等级 。 最明显的函数numpy.rank计算数组的维数(即标量具有维0,向量1,matrix2等)。 我知道numpy.linalg.lstsq模块有这个function,但是我想知道这样一个基本的操作是否内置到matrix类的某处。

这是一个明确的例子:

 from numpy import matrix, rank A = matrix([[1,3,7],[2,8,3],[7,8,1]]) print rank(A) 

这给了2维度,我正在寻找答案3

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 

为需要在实践中完成的人提供一个粗略的代码片段。 随意改善。

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

如果numpy不提供排名设施,为什么不写自己的?

计算秩的有效方法是通过奇异值分解 – matrix的秩等于非零奇异值的数目。

 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,6,14 [2, 6, 14] (与第一行成线性关系),则答案为2(“零”特征值为4.9960E-16)

这个答案已经过时了。

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

特别是我不太了解Numpy,但是这不太可能是一个matrix的内置操作。 它涉及相当密集的数值计算(以及有关浮点舍入误差等的相关问题)和阈值select,在给定的上下文中可能适用也可能不适合,并且algorithmselect对于准确快速地计算它是重要的。

内build于基本类中的东西往往是可以以独特而直接的方式执行的事情,例如最复杂的matrix乘法。

线性代数函数一般分为numpy.linalg 。 (它们也可以从scipy.linalg ,它有更多的function。)这允许多态:这些函数可以接受SciPy处理的任何types。

所以,是的, numpy.linalg.lstsq函数完成你所要求的function。 为什么这不够?