Schnellster PCA-Algorithmus für hochdimensionale Daten

11

Ich möchte eine PCA für einen Datensatz durchführen, der aus ungefähr 40 000 Proben besteht, wobei jede Probe ungefähr 10 000 Merkmale aufweist.

Die Verwendung der Matlab-Princomp-Funktion dauert durchweg über eine halbe Stunde. An diesem Punkt beende ich den Prozess. Ich möchte eine Implementierung / einen Algorithmus finden, der / der in weniger als 10 Minuten ausgeführt wird. Was wäre der schnellste Algorithmus? Wie lange würde ein i7 Dual Core / 4 GB RAM dauern?

sanft
quelle
Ja, Sie haben Recht, ich sollte genauer sein. Es dauert mehr als eine halbe Stunde, dann habe ich beschlossen, den Prozess abzubrechen. Ich muss das mindestens zehn Mal machen, wäre es schön, wenn etwas in weniger als 10 Minuten funktioniert
sanft
Wie spärlich ist Ihre Matrix?
Arnold Neumaier
Der Prozentsatz der Nullen in der Matrix liegt über 80%
milder
Schauen Sie sich auch kernal-PCA an.
Meawoppl

Antworten:

11

Zunächst sollten Sie angeben, ob Sie alle oder die wichtigsten Komponenten möchten.

Bezeichnen Sie Ihre Matrix wobei N die Anzahl der Abtastwerte und die M- Dimensionalität ist.ARN×MNM

Wenn Sie alle Komponenten möchten, besteht der klassische Weg darin, die Kovarianzmatrix (mit einer Zeitkomplexität von O ( N M 2 ) ) zu berechnen und dann SVD darauf anzuwenden (zusätzliches O ( M 3 ) ). In Bezug auf den Speicher würde dies O ( 2 M 2 ) (Kovarianzmatrix + singuläre Vektoren und Werte, die eine orthogonale Basis bilden) oder 1,5 GB mit doppelter Genauigkeit für Ihr spezielles A benötigen .CRM×MO(NM2)O(M3)O(2M2)1.5A

Sie können SVD direkt auf die Matrix anwenden, wenn Sie jede Dimension zuvor normalisieren und linke Singularvektoren verwenden. Praktisch würde ich jedoch erwarten, dass die SVD der Matrix A länger dauert.AA

Wenn Sie nur einen Bruchteil der (möglicherweise wichtigsten) Komponenten benötigen, möchten Sie möglicherweise iterative PCA anwenden . Soweit ich weiß, sind alle diese Algorithmen eng mit dem Lanczos-Prozess verbunden, daher sind Sie vom Spektrum des abhängig, und es wird praktisch schwierig sein, die Genauigkeit der SVD für erhaltene Vektoren zu erreichen, und sie wird sich mit der Anzahl der singulären Vektoren verschlechtern.C

Alexander
quelle
2

Ich denke, Sie brauchen nur ein paar (oder ein paar hundert) dominante Singularwert / Vektor-Paare. Dann ist es am besten, eine iterative Methode zu verwenden, die viel schneller ist und viel weniger Speicher verbraucht.

In Matlab siehe

Hilfe svds

Arnold Neumaier
quelle
Ja, es scheint, dass iterative Methoden viel schneller sind, wenn ich nur die ersten hundert Komponenten benötige.
Mellow
Was die svds betrifft, habe ich versucht, meine Matrix in ein spärliches Format zu bringen und die Princomp-Funktion so zu ändern, dass svds anstelle von svd eingefügt werden. Zu meiner Überraschung dauerte es bei einer 2000 * 4000-Matrix viel länger (180 s statt 15 s) ). Bizarr ...
Mellow
1
Es ist nicht erforderlich, zum Sparse-Format zu wechseln. Außerdem müssen Sie die Anzahl der zu berechnenden Singularvektoren reduzieren. Für die Berechnung der vollständigen DVD ist SVDS nicht geeignet.
Arnold Neumaier
2
Bemerkenswert für die dominanten Modi sind auch neuere randomisierte SVD-Methoden, wie in stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger
2

Sie können meine Antwort auf Cross Validated überprüfen . Ich wollte es hier nicht kopieren. Grundsätzlich können Sie eine schnelle, randomisierte SVD verwenden, um die PCA-Basis und -Koeffizienten zu berechnen.

Petrichor
quelle