2016-11-21 3 views
2

Ich verwende PCA, um die Dimensionalität eines N-dimensionalen Datensatzes zu reduzieren, aber ich möchte robust zu großen Ausreißern bauen, also habe ich habe nach robusten PCA-Codes gesucht.Verwendung der robusten PCA-Ausgabe als Principal-Komponente (Eigen) Vektoren von traditionellen PCA

Für traditionelle PCA verwende ich Pythons sklearn.decomposition.PCA, die die Hauptkomponenten als Vektoren zurückgibt, auf die ich dann meine Daten projizieren kann (um klar zu sein, ich habe auch meine eigenen Versionen mit SVD codiert also ich weiß, wie die Methode funktioniert). Ich habe ein paar vorcodierte RPCA-Python-Codes gefunden (wie https://github.com/dganguli/robust-pca und https://github.com/jkarnows/rpcaADMM).

Der erste Code basiert auf Candes et al. (2009) -Methode und gibt niedrigrangige L- und dünn besetzte S-Matrizen für einen Datensatz D zurück. Der zweite Code verwendet die ADMM-Methode der Matrixzerlegung (Parikh, N., & Boyd, S. 2013) und gibt X_1, X_2, X_3 Matrizen zurück . Ich muss zugeben, es fällt mir sehr schwer herauszufinden, wie man diese mit den Hauptachsen verbindet, die von einem Standard-PCM-Algorithmus zurückgegeben werden. Kann jemand irgendeine Anleitung geben?

Insbesondere in einem Datensatz X habe ich eine Wolke von N 3-D-Punkten. Ich betreibe es durch PCA:

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

und diese drei Komponenten sind 3-D-Vektoren, die die neue Basis definieren, auf die ich alle meine Punkte projizieren. Mit Robust PCA bekomme ich Matrizen L + S = X. Läuft man dann pca.fit (L)? Ich hätte gedacht, dass RPCA mir die Eigenvektoren zurückgegeben hätte, aber interne Schritte haben würde, um Ausreißer als Teil des Aufbaus der Kovarianzmatrix oder SVD auszuführen.

Vielleicht, was ich als "Robust PCA" denke, ist nicht, wie andere Leute es verwenden/codieren?

+0

Ich denke, es würde helfen, wenn Sie erklärt, was das Problem der diese Matrizen auf die Vektoren der Verbindungs Standard-PCM-Algorithmus ist. – ImportanceOfBeingErnest

+0

Ich habe zu der Frage hinzugefügt, um klarer zu sein. – AstroBen

Antwort

2

Die robust-pca code Faktoren die Datenmatrix D in zwei Matrizen, L und S der "low-rank" und "spärlich" Matrizen (siehe the paper für weitere Details) sind. L ist, was zwischen den verschiedenen Beobachtungen meistens konstant ist, während S ist, was variiert. Abbildungen 2 und 3 in the paper geben ein wirklich schönes Beispiel von ein paar Sicherheitskameras, den statischen Hintergrund (L) und die Verschiedenartigkeit wie das Übergeben von Leuten (S) herausnehmend.

Wenn Sie nur die Eigenvektoren wollen, behandeln Sie die S als Junk (die "großen Ausreißer", die Sie ausschneiden wollen) und eine Eigenanalyse auf der L Matrix.

Hier ist ein Beispiel der Verwendung von robust-pca code:

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

Hier ist die pca Funktion ist:

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 
Verwandte Themen