python - 如何在协方差矩阵中找到退化的行/列

标签 python matrix numpy singular

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

最佳答案

如果您对矩阵 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.

关于python - 如何在协方差矩阵中找到退化的行/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312498/

相关文章:

python - 根据对角线项对矩阵进行排序

python - 如何在 python 抽象类中创建抽象属性

python - 类似于 Flask 蓝图的横向扩展 celery 应用程序

matlab - 如何在 MATLAB 中计算 99% 的覆盖率?

java - OpenCV Mat 处理时间

python - 根据列的第一个数字对数据框进行排序

python - Unix(Linux、FreeBSD)上如何获取系统库路径

python - 前几行值的总和

python - Python中数据点的平均趋势曲线

python - 来自 numpy.linalg.svd 的大型矩阵的 MemoryError