【问题标题】:How to find degenerate rows/columns in a covariance matrix如何在协方差矩阵中找到退化的行/列
【发布时间】:2012-10-30 00:49:08
【问题描述】:

我正在使用 numpy.cov 从超过 400 个时间序列的数据集中创建协方差矩阵。使用 linalg.det 给我一个零值,所以矩阵是奇异的。我可以使用 linalg.svd 来查看秩比列数少 2,因此在协方差矩阵的某处,我有一些线性组合可以使矩阵退化。我在基础时间序列上使用了 corrcoef,但没有相关性 > 0.78,所以在那里并不明显。有人可以建议一种方法来确定退化列的位置。谢谢。

【问题讨论】:

    标签: python matrix numpy singular


    【解决方案1】:

    如果您对矩阵A 进行QR 分解,沿对角线具有非零值的R 的列对应于A 的线性独立列。


    import numpy as np
    linalg = np.linalg
    
    def independent_columns(A, tol = 1e-05):
        """
        Return an array composed of independent columns of A.
    
        Note the answer may not be unique; this function returns one of many
        possible answers.
    
        http://stackoverflow.com/q/13312498/190597 (user1812712)
        http://math.stackexchange.com/a/199132/1140 (Gerry Myerson)
        http://mail.scipy.org/pipermail/numpy-discussion/2008-November/038705.html
            (Anne Archibald)
    
        >>> A = np.array([(2,4,1,3),(-1,-2,1,0),(0,0,2,2),(3,6,2,5)])
        >>> independent_columns(A)
        np.array([[1, 4],
                  [2, 5],
                  [3, 6]])
        """
        Q, R = linalg.qr(A)
        independent = np.where(np.abs(R.diagonal()) > tol)[0]
        return A[:, independent]
    
    def matrixrank(A,tol=1e-8):
        """
        http://mail.scipy.org/pipermail/numpy-discussion/2008-February/031218.html
        """
        s = linalg.svd(A,compute_uv=0)
        return sum( np.where( s>tol, 1, 0 ) )
    
    
    matrices = [
        np.array([(2,4,1,3),(-1,-2,1,0),(0,0,2,2),(3,6,2,5)]),
        np.array([(1,2,3),(2,4,6),(4,5,6)]).T,
        np.array([(1,2,3,1),(2,4,6,2),(4,5,6,3)]).T,
        np.array([(1,2,3,1),(2,4,6,3),(4,5,6,3)]).T,
        np.array([(1,2,3),(2,4,6),(4,5,6),(7,8,9)]).T
        ]
    
    for A in matrices:
        B = independent_columns(A)
        assert matrixrank(A) == matrixrank(B) == B.shape[-1]
    

    assert matrixrank(A) == matrixrank(B) 检查independent_columns 函数是否返回与A 相同秩的矩阵。

    assert matrixrank(B) == B.shape[-1] 检查B 的等级是否等于B 的列数。

    【讨论】:

    • 假设我已经将矩阵简化为它的独立矩阵,它有一个完整的秩(对于列) - 然后如果我在它上面运行一个 LR 模型并且仍然得到错误,我假设公差应该更高。但是,您的代码实际上是在 linalg 之上构建的,我应该增加上面“independent_columns”中的容差吗? linalg.py 中的默认 tol 是什么?执行 Logit(Statsmodels)文件“/usr/local/lib/python2.7/site-packages/numpy/linalg/linalg.py”时的错误日志,第 328 行,解决 raise LinAlgError, 'Singular matrix' LinAlgError: Singular matrix
    • 补充一点,我通读了 linalg.py 文件,但无法确定它所依赖的“tol”。这是文件(为了节省您的查找时间,以防您考虑回答)github.com/numpy/numpy/blob/master/numpy/linalg/linalg.py。在这里,github.com/numpy/numpy/issues/4715 还在 git 中记录了整个场景(虽然不认为这是一个问题)
    • 我不确定我是否能帮助你,但你能发布代码来证明这个问题吗?特别是由于代码在 cmets 中格式不正确,请为此提出一个新问题。
    • 在努力调试问题后,我在这里发布了问题。请看你能不能一刀切? stackoverflow.com/questions/23848003/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2016-05-03
    • 1970-01-01
    • 2021-01-03
    • 2011-05-23
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多