Pengaturan Masalah
Saya memiliki titik data (gambar) dimensi tinggi (4096), yang saya coba visualisasikan dalam 2D. Untuk tujuan ini, saya menggunakan t-sne dengan cara yang mirip dengan kode contoh berikut oleh Karpathy .
The scikit-belajar dokumentasi merekomendasikan menggunakan PCA untuk pertama menurunkan dimensi dari data:
Sangat disarankan untuk menggunakan metode pengurangan dimensionalitas lain (mis. PCA untuk data padat atau TruncatedSVD untuk data jarang) untuk mengurangi jumlah dimensi ke jumlah yang masuk akal (mis. 50) jika jumlah fitur sangat tinggi.
Saya menggunakan kode ini oleh Darks.Liu untuk melakukan PCA di 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);
Ini menggunakan jblas untuk operasi aljabar linier, yang dari apa yang saya baca seharusnya menjadi pilihan tercepat di luar sana. Namun, menghitung vektor eigen dan nilai eigen (baris 3,4) ternyata menjadi hambatan besar (~ 10 menit, yang jauh lebih lama daripada yang saya mampu untuk tahap ini).
Seperti yang saya lihat, pilihan saya adalah "mengoptimalkan" PCA atau memilih metode pengurangan dimensi lain yang secara inheren lebih cepat.
Pertanyaan saya
- Apakah ada harapan bahwa PCA dapat digunakan dalam mode "offline"? yaitu, menggunakan satu set data yang besar gambar, melakukan PCA pada mereka, dan kemudian menggunakan komponen utama dihitung bagi mereka untuk mengurangi dimensi lain (baru!) titik data?
- Dapatkah saya mempercepat perhitungan vektor eigen, dengan asumsi saya tahu sebelumnya bahwa saya hanya tertarik pada, katakanlah, 100 komponen utama teratas?
- Apakah ada metode pengurangan dimensi alternatif yang sesuai dalam kasus saya (yaitu, sebelum menerapkan t-sne) yang akan lebih cepat daripada PCA? Saya mencari sesuatu yang dapat diimplementasikan dengan mudah di Jawa.
sumber
mlib
sumber