PCA zu langsam, wenn beide n, p groß sind: Alternativen?

9

Problemeinrichtung

Ich habe Datenpunkte (Bilder) mit hoher Dimension (4096), die ich in 2D visualisieren möchte. Zu diesem Zweck verwende ich t-sne auf ähnliche Weise wie der folgende Beispielcode von Karpathy .

In der Scikit-Learn-Dokumentation wird empfohlen, PCA zu verwenden, um zunächst die Dimension der Daten zu verringern :

Es wird dringend empfohlen, eine andere Methode zur Reduzierung der Dimensionalität zu verwenden (z. B. PCA für dichte Daten oder TruncatedSVD für spärliche Daten), um die Anzahl der Dimensionen auf einen angemessenen Betrag (z. B. 50) zu reduzieren, wenn die Anzahl der Features sehr hoch ist.

Ich verwende diesen Code von Darks.Liu, um PCA in Java durchzuführen:

//C=X*X^t / m
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//Sort sigen vector from big to small by eigen values 
List<PCABean> beans = new ArrayList<PCA.PCABean>();
for (int i = 0; i < eigVectors.columns; i++) {
    beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; i < dimension; i++) {
    ComplexDoubleMatrix dm = beans.get(i).vector;
    DoubleMatrix real = dm.getReal();
    newVec.putRow(i, real);
}
return newVec.mmul(source);

Es verwendet jblas für die linearen Algebraoperationen , die nach dem, was ich gelesen habe, die schnellste Option da draußen sein sollen. Die Berechnung der Eigenvektoren und Eigenwerte (Zeilen 3,4) stellt sich jedoch als großer Engpass heraus (~ 10 Minuten, was viel länger ist, als ich mir für diese Phase leisten kann).

Ich habe über Kernel PCA gelesen, das für Fälle gut sein soll, in denen die Dimension sehr groß ist, aber seine Laufzeit ist was problematisch sein könnte, da ich auch Fälle sowohl der Dimension als auch der Anzahl behandeln möchte von Beispielen, die groß sind.O(n3)

Aus meiner Sicht besteht meine Option entweder darin, die PCA zu "optimieren" oder sich für eine andere Methode zur Reduzierung der Dimensionalität zu entscheiden, die von Natur aus schneller ist.

Meine Fragen

  1. Gibt es eine Hoffnung, dass PCA "offline" verwendet werden kann? dh mit einem großen Datensatz von Bildern eine PCA durchführen und dann die für sie berechneten Hauptkomponenten verwenden, um die Dimension anderer (neuer!) Datenpunkte zu verringern ?
  2. Kann ich die Eigenvektorberechnung beschleunigen, vorausgesetzt, ich weiß im Voraus, dass ich beispielsweise nur an den 100 wichtigsten Komponenten interessiert bin?
  3. Gibt es eine alternative Methode zur Reduzierung der Dimensionalität, die in meinem Fall angemessen ist (dh vor der Anwendung von t-sne) und die schneller als PCA ist? Ich suche etwas, das leicht in Java implementiert werden kann.
galoosh33
quelle

Antworten:

8

Frage 1: Angenommen, Sie haben eine Datenmatrix . Daraus können Sie die Eigenzerlegung berechnen . Die Frage ist nun: Wenn wir neue Daten aus derselben Population erhalten, die möglicherweise in einer Matrix , liegt dann nahe an der idealen orthogonalen Rotation von ? Diese Art von Frage wird im Davis-Kahan-Theorem und in der Matrixstörungstheorie im Allgemeinen behandelt (wenn Sie eine Kopie erhalten können, ist das Lehrbuch von Stewart und Sun aus dem Jahr 1990 die Standardreferenz). X T X = Q Q T Z R m × p Z Q Z.X.R.n×pX.T.X.=Q.ΛQ.T.Z.R.m×pZ.Q.Z.

Frage 2: Sie können die Dinge definitiv beschleunigen, wenn Sie wissen, dass Sie nur die Top- Eigenvektoren benötigen . In RI verwenden Sie dafür; Ich bin mir sicher, dass es ein Java-Äquivalent gibt, da sie sowieso alle fortran-Wrapper sind.krARPACK

Frage 3: Ich weiß nichts über Java-Implementierungen, aber dieser Thread beschreibt die Beschleunigung der PCA ebenso wie dieser CV-Thread. Es gibt eine Menge Forschung über diese Art von Dingen und es gibt Unmengen von Methoden, die Dinge wie Annäherungen mit niedrigem Rang oder Randomisierung verwenden.

jld
quelle
3

Der von Ihnen verwendete Code invertiert die gesamte Matrix. Dies ist wahrscheinlich bereits O (p ^ 3). Sie können das Ergebnis in O (p ^ 2) approximieren, aber das ist immer noch langsam (aber wahrscheinlich 100x schneller). Nehmen Sie im Wesentlichen einen beliebigen Vektor und führen Sie Leistungsiterationen durch. Mit hoher Wahrscheinlichkeit erhalten Sie eine gute Annäherung an den ersten Eigenvektor. Entfernen Sie dann diesen Faktor aus der Matrix und wiederholen Sie den Vorgang, um den zweiten zu erhalten. Etc.

Aber haben Sie versucht, ob die schnellen tSNE-Implementierungen von Barnes Hut in ELKI möglicherweise nur mit einem Index wie dem Deckbaum für Ihre Daten funktionieren? Ich habe diese Implementierung gut funktionieren lassen, als andere fehlgeschlagen sind.

Hat aufgehört - Anony-Mousse
quelle
3
Was bedeutet "whp"? stehen für?
Kodiologe
Mit hoher Wahrscheinlichkeit. Siehe Statistikliteratur.
Hat aufgehört - Anony-Mousse
2

mlibn×K.K.×pK.×p

Vermutungen
quelle