Sorun Ayarı
2D olarak görselleştirmeye çalıştığım yüksek boyutlu (4096) veri noktalarına (görüntüler) sahibim. Bu amaçla, Karpathy'nin aşağıdaki örnek koduna benzer bir şekilde t-sne kullanıyorum .
Scikit-öğrenme dokümantasyon ilk verilerin boyutunu düşürmek için PCA kullanılmasını önerir:
Özellik sayısının çok yüksek olması durumunda boyut sayısını makul bir miktara (örneğin 50) düşürmek için başka bir boyut azaltma yönteminin (ör. Yoğun veriler için PCA veya seyrek veriler için TruncatedSVD) kullanılması önemle tavsiye edilir.
Java'da PCA gerçekleştirmek için Darks.Liu tarafından bu kodu kullanıyorum:
//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);
Okuduğumdan orada en hızlı seçenek olması gereken doğrusal cebir işlemleri için jblas kullanıyor . Bununla birlikte, özvektörlerin ve özdeğerlerin (satır 3,4) hesaplanması büyük bir darboğaz (~ 10 dakika, bu aşama için alabileceğimden çok daha uzun) çıkıyor.
Boyutun çok büyük olduğu durumlar için iyi olması gereken Çekirdek PCA'yı okudum, ancak çalışma zamanı Ayrıca boyutun hem davalarına istedikleri için hangi sorunlu olabilir ve büyük olmanın örnekler sayısına.
Gördüğüm gibi, seçeneklerim ya PCA'yı "optimize etmek" ya da doğası gereği daha hızlı olan başka bir boyut azaltma yöntemini seçmek.
Sorularım
- PCA'nın "çevrimdışı" bir şekilde kullanılabileceğine dair bir umut var mı? yani, büyük bir veri seti kullanarak, üzerlerinde PCA gerçekleştirin ve sonra diğer (yeni!) veri noktalarının boyutunu azaltmak için hesaplanan temel bileşenleri kullanın ?
- Özvektör hesaplamasını hızlandırabilir miyim, sadece en iyi 100 temel bileşenle ilgilendiğimi önceden varsayarak?
- Benim durumumda (yani, t-sne uygulamadan önce) PCA'dan daha hızlı olacak alternatif bir boyutsal azaltma yöntemi var mı? Java ile kolayca uygulanabilecek bir şey arıyorum.