Wie wird eine PCA für Daten mit sehr hoher Dimensionalität durchgeführt?

12

Um eine Hauptkomponentenanalyse (PCA) durchzuführen, müssen Sie die Mittelwerte jeder Spalte von den Daten subtrahieren, die Korrelationskoeffizientenmatrix berechnen und dann die Eigenvektoren und Eigenwerte finden. Nun, vielmehr habe ich dies getan, um es in Python zu implementieren, außer dass es nur mit kleinen Matrizen funktioniert, da die Methode zum Ermitteln der Korrelationskoeffizientenmatrix (Corrcoef) es mir nicht erlaubt, ein Array mit hoher Dimensionalität zu verwenden. Da ich es für Bilder verwenden muss, hilft mir meine aktuelle Implementierung nicht wirklich.

Ich habe gelesen, dass es möglich ist, einfach Ihre Datenmatrix und D D / n anstelle von D D / n zu berechnen , aber das funktioniert bei mir nicht. Nun, ich bin mir nicht ganz sicher, ob ich verstehe, was es bedeutet, abgesehen von der Tatsache, dass es eine n × n- Matrix anstelle von p × p sein soll (in meinem Fall p n ). Ich habe in den Eigengesichts-Tutorials darüber gelesen, aber keiner von ihnen schien es so zu erklären, dass ich es wirklich verstehen konnte.DDD/nDD/nn×np×ppn

Kurz gesagt, gibt es eine einfache algorithmische Beschreibung dieser Methode, damit ich ihr folgen kann?

Amöbe sagt Reinstate Monica
quelle
Was Sie lesen, ist richtig. Die Matrix heißt Gram-Matrix. Seine Eigenvektoren sind (skalierte) Hauptkomponenten. Seine Eigenwerte sind bis zum Faktor 1 / n genau identisch mit den Eigenwerten der Kovarianzmatrix D D / n . DD1/nDD/n
Amöbe sagt Reinstate Monica

Antworten:

10

Der einfachste Weg, eine Standard-PCA durchzuführen, besteht darin, die Spalten Ihrer Datenmatrix zu zentrieren (vorausgesetzt, die Spalten entsprechen verschiedenen Variablen), indem Sie die Spaltenmittelwerte subtrahieren und dann eine SVD durchführen. Die linken Singularvektoren, multipliziert mit dem entsprechenden Singularwert, entsprechen den (geschätzten) Hauptkomponenten. Die rechten Singularvektoren entsprechen den (geschätzten) Hauptkomponentenrichtungen - diese sind die gleichen wie die von PCA gegebenen Eigenvektoren. Die Singularwerte entsprechen den Standardabweichungen der Hauptkomponenten (multipliziert mit einem Faktor der Wurzel n, wobei n die Anzahl der Zeilen in Ihrer Datenmatrix ist) - genau wie die Quadratwurzel der von PCA angegebenen Eigenwerte.

Wenn Sie PCA für die Korrelationsmatrix durchführen möchten, müssen Sie die Spalten Ihrer Datenmatrix standardisieren, bevor Sie die SVD anwenden. Dies läuft darauf hinaus, die Mittelwerte zu subtrahieren (Zentrierung) und dann durch die Standardabweichungen (Skalierung) zu dividieren.

Dies ist der effizienteste Ansatz, wenn Sie die vollständige PCA wünschen. Sie können mit etwas Algebra überprüfen, ob dies die gleiche Antwort liefert wie die spektrale Zerlegung der Probenkovarianzmatrix.

Es gibt auch effiziente Methoden zur Berechnung einer partiellen SVD, wenn Sie nur einige der PCs benötigen. Einige davon sind Varianten der Leistungsiteration. Der Lanczos-Algorithmus ist ein Beispiel, das sich auch auf partielle kleinste Quadrate bezieht. Wenn Ihre Matrix sehr groß ist, sind Sie möglicherweise mit einer ungefähren Methode besser dran. Es gibt auch statistische Gründe für die Regularisierung von PCA, wenn dies der Fall ist.

vqv
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, der Lanczos-Algorithmus führt eine Eigendekomposition und keine SVD durch.
Amöbe sagt Reinstate Monica
1
Ein interessierter Leser kann hier nach weiteren Details zur Durchführung von PCA über SVD suchen: Beziehung zwischen SVD und PCA. Wie verwende ich SVD, um PCA durchzuführen?
Amöbe sagt Reinstate Monica
8

Es hört sich so an, als ob Sie den NIPALS-Algorithmus für die Durchführung von PCA wollen. Es ist ein sehr beliebter Algorithmus unter Statistikern. Es hat viele Vorteile:

  • Rechnerisch kostengünstiger als SVD- oder Eigenwertzerlegungsmethoden, wenn nur die ersten Komponenten erforderlich sind.
  • Hat im Allgemeinen geringere Speicheranforderungen, da die Kovarianzmatrix niemals gebildet wird. Dies ist eine sehr wichtige Eigenschaft für sehr große Datenmengen.
  • Kann mit fehlenden Daten im Dataset umgehen (obwohl dies bei Ihrem Problem kein Problem darstellt, da es sich um Bilder handelt).

Beschreibung
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Algorithmus
Hier ist eine einfache und ausgezeichnete Beschreibung des Algorithmus (in Abschnitt 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Denken Sie daran, zuerst die mittlere Mitte zu skalieren, bevor Sie PCA durchführen, da diese skalierungsempfindlich ist.

Gilead
quelle
8

Was Sie gerade tun, ist nah, aber Sie müssen sicherstellen, dass Sie die Eigenvektoren von (data . data.T) / lineslinks mit multiplizieren data.T, um die Eigenvektoren von zu erhalten (data.T . data) / lines. Dies wird manchmal als "Transponierungs-Trick" bezeichnet.

Hier sind einige weitere Details. Angenommen, Sie haben eine Matrix , für die Sie PCA ausführen möchten. Nehmen wir der Einfachheit halber an, dass die Spalten von A bereits auf den Mittelwert Null normiert wurden, so dass wir nur die Eigenvektoren der Kovarianzmatrix A T A berechnen müssen .EINAATA

Am×nn>>mATAn×nATAm×mAATATAAAT

vAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

vAATATvATAAATAvAATATATvATA

raegtin
quelle
1
Dies klingt wie der "Kernel-Trick", der auf PCA angewendet wird. en.wikipedia.org/wiki/Kernel_PCA Es ist eine sehr gute Möglichkeit, mit bestimmten großen Matrizen umzugehen.
Gilead
AA
4

Um Gileads Antwort zu ergänzen, handelt es sich um rechnerisch kostengünstigere Algorithmen für abgeschnittene PCAs. NIPALS ist in der Tat sehr beliebt, aber ich habe viel Erfolg mit ungefähren Methoden gehabt, die eine Folge von Anpassungen an Teildaten durchführen (was oft als PCA durch zufällige Projektion bezeichnet wird). Dies wurde in einem Metaoptimierungs- Thread diskutiert .

Lassen Sie mich, wie Sie Python erwähnen, darauf hinweisen, dass der Algorithmus im scikit-learn implementiert ist : der PCA- Klasse. Insbesondere wird es in einem Beispiel verwendet, das Eigengesichter demonstriert .

Gael Varoquaux
quelle