代码之家  ›  专栏  ›  技术社区  ›  Hooked

用scipy计算矩阵秩

  •  38
  • Hooked  · 技术社区  · 16 年前

    我想计算一下 mathematical rank 使用scipy的矩阵。最明显的功能 numpy.rank 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 回复  |  直到 16 年前
        1
  •  61
  •   Simon    14 年前

    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
    
        2
  •  15
  •   Stefan van der Walt    15 年前

    u, s, v = np.linalg.svd(A)
    rank = np.sum(s > 1e-10)
    
        3
  •  7
  •   Praveen    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] (与第一行线性相关)答案是2(“零”特征值是4.9960E-16)

        4
  •  2
  •   Mike Graham    13 年前

    这个答案已经过时了。

    答案是否定的,目前没有函数专门用于计算scipy中数组/矩阵的矩阵秩。添加一个之前已经讨论过了,但是如果它要发生的话,我认为还没有。

        5
  •  1
  •   Brooks Moses    16 年前

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

    构建到基本类中的东西往往是可以以独特和直接的方式执行的东西,例如最复杂的矩阵乘法。

        6
  •  1
  •   bignose    16 年前

    这个 numpy.linalg . (他们也可以从 scipy.linalg 这允许多态性:函数可以接受SciPy处理的任何类型。

    这个 numpy.linalg.lstsq 功能 照你说的做。为什么这还不够?

        7
  •  1
  •   jawknee    8 年前

    scipy interpolative method

    >>> 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