복붙노트

[PYTHON] 공분산 행렬에서 퇴화 된 행 / 열을 찾는 법

PYTHON

공분산 행렬에서 퇴화 된 행 / 열을 찾는 법

numpy.cov를 사용하여 400 개 이상의 시계열 데이터 세트에서 공분산 행렬을 만듭니다. linalg.det를 사용하면 나에게 0의 값이 주어 지므로 행렬은 단수입니다. 나는 linalg.svd를 사용하여 순위가 열의 수보다 2가 적다는 것을 알 수 있으므로 공분산 행렬의 어딘가에 행렬을 퇴화시키는 선형 조합이 있습니다. 나는 근본적인 timeseries에 corrcoef를 사용했지만 상관 관계가 0.78을 넘지는 않았다. 누군가가 퇴행 열의 위치를 ​​결정하는 방법을 제안 할 수 있습니까? 고맙습니다.

해결법

  1. ==============================

    1.행렬 A의 QR 분해를 취하면 대각선을 따라 0이 아닌 값을 갖는 R의 열은 A의 선형 적으로 독립적 인 열에 해당합니다.

    행렬 A의 QR 분해를 취하면 대각선을 따라 0이 아닌 값을 갖는 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의 렬수와 같은지 확인합니다.

  2. from https://stackoverflow.com/questions/13312498/how-to-find-degenerate-rows-columns-in-a-covariance-matrix by cc-by-sa and MIT license