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.
Xtimes()
Xt_times()