Saya memahami hubungan antara Analisis Komponen Utama dan Dekomposisi Nilai Singular pada tingkat aljabar / eksak. Pertanyaan saya adalah tentang implementasi scikit-learning .
Dokumentasi mengatakan: " [TruncatedSVD] sangat mirip dengan PCA, tetapi beroperasi pada vektor sampel secara langsung, bukan pada matriks kovarians. ", Yang akan mencerminkan perbedaan aljabar antara kedua pendekatan. Namun, kemudian dikatakan: " Estimator ini [TruncatedSVD] mendukung dua algoritma: pemecah SVD acak cepat, dan algoritma" naif "yang menggunakan ARPACK sebagai eigensolver pada (X * XT) atau (XT * X), mana yang lebih efisien. " Tentang PCA, ia mengatakan: "Pengurangan dimensi linear menggunakan Dekomposisi Nilai Singular data untuk memproyeksikannya ...". Dan implementasi PCA mendukung dua algoritma (acak dan ARPACK) yang sama ditambah satu lagi, LAPACK. Melihat ke dalam kode saya dapat melihat bahwa baik ARPACK dan LAPACK di PCA dan TruncatedSVD melakukan svd pada data sampel X, ARPACK dapat menangani matriks yang jarang (menggunakan svds).
Jadi, selain dari atribut dan metode yang berbeda dan bahwa PCA juga dapat melakukan dekomposisi nilai singular penuh yang tepat menggunakan LAPACK, PCA dan implementasi scikit-learning TruncatedSVD tampaknya merupakan algoritma yang persis sama. Pertanyaan pertama: Apakah ini benar?
Pertanyaan kedua: meskipun LAPACK dan ARPACK menggunakan scipy.linalg.svd (X) dan scipy.linalg.svds (X), sebagai X matriks sampel, mereka menghitung dekomposisi nilai singular atau dekomposisi eigen dari atau internal. Sementara solver "acak" tidak perlu menghitung produk. (Ini relevan sehubungan dengan stabilitas numerik, lihat Mengapa PCA data melalui SVD data? ). Apakah ini benar?
Kode yang relevan: PCA line 415. terpotongSVD line 137.
sumber
Xtimes()
Xt_times()
Jawaban:
Tidak: PCA adalah (terpotong) SVD pada data terpusat (dengan substraksi rata-rata per-fitur). Jika data sudah terpusat, kedua kelas akan melakukan hal yang sama.
Dalam praktiknya
TruncatedSVD
berguna pada dataset jarang yang besar yang tidak dapat dipusatkan tanpa membuat penggunaan memori meledak.numpy.linalg.svd
danscipy.linalg.svd
keduanya mengandalkan LAPACK _GESDD yang dijelaskan di sini: http://www.netlib.org/lapack/lug/node32.html (bagi dan menaklukkan driver)scipy.sparse.linalg.svds
bergantung pada ARPACK untuk melakukan dekomposisi nilai eigen XT. X atau X. XT (tergantung pada bentuk data) melalui metode iterasi Arnoldi. Panduan pengguna HTML dari ARPACK memiliki format rusak yang menyembunyikan detail komputasi tetapi iterasi Arnoldi dijelaskan dengan baik di wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iterationBerikut adalah kode untuk SVD berbasis ARPACK di scipy:
https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (cari string untuk "def svds" jika terjadi perubahan baris pada kode sumber ).
sumber