使用scipy计算矩阵秩
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用scipy计算矩阵秩相关的知识,希望对你有一定的参考价值。
我想用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
的答案。
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
不提供排名设施,为什么不自己编写?
计算秩的有效方法是通过奇异值分解 - 矩阵的秩等于非零奇异值的数量。
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)
这个答案已经过时了。
答案是否定的 - 目前没有专门用于计算scipy中阵列/矩阵的矩阵等级的函数。之前已经讨论过添加一个,但如果它会发生,我不相信它还没有。
我不太了解Numpy,但这不太可能是矩阵的内置操作;它涉及相当密集的数值计算(以及关于浮点舍入误差等的相关问题)和在给定上下文中可能适合或可能不适合的阈值选择,并且算法选择对于准确且快速地计算它是重要的。
基本类中的内容往往是可以以独特和直接的方式执行的事情,例如最复杂的矩阵乘法。
线性代数函数通常分组在numpy.linalg
中。 (它们也可以从scipy.linalg
获得,它具有更多功能。)这允许多态:函数可以接受SciPy处理的任何类型。
所以,是的,numpy.linalg.lstsq
功能可以满足您的要求。为什么那不足?
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
以上是关于使用scipy计算矩阵秩的主要内容,如果未能解决你的问题,请参考以下文章