PCA her ikisi de n, p büyük olduğunda çok yavaş: Alternatifler?


9

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ı O(n3)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

  1. 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 ?
  2. Özvektör hesaplamasını hızlandırabilir miyim, sadece en iyi 100 temel bileşenle ilgilendiğimi önceden varsayarak?
  3. 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.

Yanıtlar:


8

Soru 1: Diyelim ki bir veri matrisi gözlemlediniz XRn×p. Bundan özdeğerlendirmeyi hesaplayabilirsinizXTX=QΛQT. Şimdi soru şudur: Aynı popülasyondan gelen, belki de bir matrise toplanan yeni veriler alırsakZRm×p, niyet ZQ ideal dik dönüşüne yakın olmak Z? Bu tür bir soru Davis-Kahan teoremi ve genel olarak matris pertürbasyon teorisi tarafından ele alınmaktadır (eğer bir kopyasını tutabiliyorsanız, Stewart ve Sun'ın 1990 ders kitabı standart referanstır).

Soru 2: Sadece en üste ihtiyacınız olduğunu biliyorsanız kesinlikle işleri hızlandırabilirsiniz közvektörler. Bunun için RI kullanımında rARPACK; Zaten Java eşdeğeri olduğundan eminim çünkü hepsi fortran sarmalayıcılar.

Soru 3: Java uygulamaları hakkında hiçbir şey bilmiyorum, ancak bu iş parçacığı, bu CV iş parçacığı gibi PCA'nın hızlandırılmasını tartışıyor . Bu tür bir şey üzerinde bir ton araştırma var ve orada düşük rütbe yaklaşımları veya randomizasyon gibi şeyleri kullanan tonlarca yöntem var.


3

Kullandığınız kod tüm matrisi ters çevirecektir. Bu muhtemelen O (p ^ 3) zaten. Sonucu O (p ^ 2) olarak tahmin edebilirsiniz, ancak bu yine de yavaş olacaktır (ancak muhtemelen 100 kat daha hızlı). Esasen, keyfi bir vektör alın ve güç yinelemeleri yapın. Yüksek olasılıkla, ilk özvektör hakkında iyi bir yaklaşım elde edersiniz. Sonra bu faktörü matristen çıkarın, ikincisini almak için tekrarlayın. Vb.

Ancak ELKI'deki hızlı Barnes Hut tSNE uygulamalarının verileriniz üzerinde sadece kapak ağacı gibi bir dizinle çalışıp çalışmayacağını denediniz mi? Diğerleri başarısız olduğunda bu uygulama iyi çalıştı.


3
"Whp" ne yapar. anlamına gelir?
Kodiologist

Yüksek olasılıkla. Bkz. İstatistik literatürü.
QUIT - Anony-Mousse

2

Hedefiniz yalnızca boyut küçültmeyi basit ve doğrudan bir şekilde uygulamaksa, alternatif en küçük kareler (ALS) tekniğini deneyebilirsiniz. Örneğin Apache Spark'ın mlibbir ALS uygulaması var ve bir Java api sunduğuna inanıyorum. Bu size birn×K matris ve bir K×pmatris. K×p matris görselleştirilebilir satır vektörleri içerecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.