Impostazione del problema
Ho punti dati (immagini) di alta dimensione (4096), che sto cercando di visualizzare in 2D. A tal fine, sto usando t-sne in un modo simile al seguente codice di esempio di Karpathy .
La documentazione di scikit-learn consiglia di utilizzare PCA per ridurre prima la dimensione dei dati:
Si consiglia vivamente di utilizzare un altro metodo di riduzione della dimensionalità (ad esempio PCA per dati densi o TruncatedSVD per dati sparsi) per ridurre il numero di dimensioni a un importo ragionevole (ad esempio 50) se il numero di funzioni è molto elevato.
Sto usando questo codice di Darks.Liu per eseguire PCA in Java:
//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);
Usa jblas per le operazioni di algebra lineare, che da quello che ho letto dovrebbe essere l'opzione più veloce là fuori. Tuttavia, il calcolo degli autovettori e degli autovalori (righe 3,4) risulta essere un enorme collo di bottiglia (~ 10 minuti, che è molto più lungo di quello che posso permettermi in questa fase).
Ho letto del Kernel PCA che dovrebbe essere buono per i casi in cui la dimensione è molto grande, ma il suo tempo di esecuzione è che potrebbe essere problematico poiché voglio anche occuparmi di casi sia di dimensione che di numero di esempi di grandi dimensioni.
A mio avviso, le mie opzioni sono o "ottimizzare" la PCA o optare per un altro metodo di riduzione della dimensionalità che è intrinsecamente più veloce.
Le mie domande
- C'è qualche speranza che la PCA possa essere utilizzata in modo "offline"? cioè, usando un ampio set di dati di immagini, esegui PCA su di esse e quindi utilizza i componenti principali calcolati per loro per ridurre la dimensione di altri (nuovi!) punti dati?
- Posso accelerare il calcolo degli autovettori, supponendo di sapere in anticipo che sono interessato solo, diciamo, ai primi 100 componenti principali?
- Esiste un metodo di riduzione della dimensionalità alternativo appropriato nel mio caso (cioè prima di applicare t-sne) che sarà più veloce di PCA? Sto cercando qualcosa che possa essere implementato facilmente in Java.