9

numpy.covを使用して、400を超える時系列のデータセットから共分散行列を作成しています。linalg.detを使用すると、値がゼロになるため、行列は特異になります。linalg.svdを使用して、ランクが列の数より2少ないことを確認できます。したがって、共分散行列のどこかに、行列を縮退させるための線形結合がいくつかあります。基になる時系列でcorrcoefを使用しましたが、0.78を超える相関関係がないため、そこでは明らかではありません。誰かが縮退した列の場所を決定する方法を提案できますか?ありがとうございました。

4

1 に答える 1

8

行列をQR分解すると、対角線に沿ってゼロ以外の値を持つAの列は、 の線形に独立した列に対応します。RA


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.

于 2012-11-09T18:26:02.173 に答える