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.
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
- 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 ?
- Kann ich die Eigenvektorberechnung beschleunigen, vorausgesetzt, ich weiß im Voraus, dass ich beispielsweise nur an den 100 wichtigsten Komponenten interessiert bin?
- 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.