2016-11-21 46 views
2

N次元データセットの次元数を減らすためにPCAを使用していますが、大きな外れ値に頑健に構築したいのでロバストPCAコードを調べています。従来のPCAの主成分(固有ベクトル)ベクトルとしてRobust PCA出力を使用する方法

従来のPCAの場合、私はpythonのsklearn.decomposition.PCAを使用しています。これは主成分をベクターとしてうまく返し、そこでデータを投影することができます(明確にするために、私はSVD私はその方法がどのように機能するかを知っています)。私はそこにいくつかの事前にコード化されたRPCAのPythonコードを見つけました(https://github.com/dganguli/robust-pcahttps://github.com/jkarnows/rpcaADMMなど)。

最初のコードは、Candes et al。第2のコードは、行列分解のADMM法(Parikh、N.、& Boyd、S。2013)を使用し、X_1、X_2、X_3行列を返す。私は、標準的なPCMアルゴリズムによって返される主軸にこれらをどのように接続するかを考え出すのは非常に困難です。誰でもガイダンスを提供できますか?

特に、1つのデータセットXでは、N 3次元の点群があります。私はPCAを通して実行します:

pca=sklean.decompose.PCA(n_components=3) 
pca.fit(X) 
comps=pca.components_ 

これらの3つのコンポーネントは、私がすべてのポイントを投影する新しい基盤を定義します。ロバストPCAでは、行列L + S = Xを得る。 pca.fit(L)を実行しますか?私はRPCAが私に固有ベクトルを返すが、共分散行列の構築やSVDの実行の一部としてアウトライアを外すための内部的なステップを持っていると思っていただろう。

「ロバストPCA」とは、ほかの人がどのように使用しているのか/コーディングしているのではないかと思いますか? robust-pca code

+0

は、私はあなたが説明したならば、それが役立つと思うもののベクトルにそれらの行列を接続する問題標準のPCMアルゴリズムがあります。 – ImportanceOfBeingErnest

+0

私は、より明確になるように質問に追加しました。 – AstroBen

答えて

2

は、二つの行列にデータ行列D因子「低階数」及び「疎」行列(詳細はthe paperを参照)であるLSLは、さまざまな観測の間ではほとんど一定ですが、Sはさまざまです。 the paperの図2と図3は、静的な背景(L)と人を渡すような多様性(S)を選んで、2つのセキュリティカメラから本当に素晴らしい例を示しています。

固有ベクトルが必要な場合は、Sをジャンク(「大きなアウトライアー」)として扱い、Lマトリックスで固有分析を行います。

は、ここで使用した例ですrobust-pca code:ここでは

L, S = RPCA(data).fit() 
    rcomp, revals, revecs = pca(L) 
    print("Normalised robust eigenvalues: %s" % (revals/np.sum(revals),)) 

pca機能は次のとおりです。

def pca(data, numComponents=None): 
    """Principal Components Analysis 

    From: http://stackoverflow.com/a/13224592/834250 

    Parameters 
    ---------- 
    data : `numpy.ndarray` 
     numpy array of data to analyse 
    numComponents : `int` 
     number of principal components to use 

    Returns 
    ------- 
    comps : `numpy.ndarray` 
     Principal components 
    evals : `numpy.ndarray` 
     Eigenvalues 
    evecs : `numpy.ndarray` 
     Eigenvectors 
    """ 
    m, n = data.shape 
    data -= data.mean(axis=0) 
    R = np.cov(data, rowvar=False) 
    # use 'eigh' rather than 'eig' since R is symmetric, 
    # the performance gain is substantial 
    evals, evecs = np.linalg.eigh(R) 
    idx = np.argsort(evals)[::-1] 
    evecs = evecs[:,idx] 
    evals = evals[idx] 
    if numComponents is not None: 
     evecs = evecs[:, :numComponents] 
    # carry out the transformation on the data using eigenvectors 
    # and return the re-scaled data, eigenvalues, and eigenvectors 
    return np.dot(evecs.T, data.T).T, evals, evecs 
関連する問題