Perbedaan antara implementasi scikit-learn PCA dan TruncatedSVD

12

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?XTXXXT

Kode yang relevan: PCA line 415. terpotongSVD line 137.

itik jantan
sumber
1
dapatkah Anda menambahkan tautan ke kode
seanv507
1
drake - saya pikir saya setuju dengan Anda pada Q. pertama tidak mengerti yang kedua. apa maksudmu 'mereka menghitung dekomposisi nilai singular atau dekomposisi eigen dari XT ∗ XXT ∗ X atau X ∗ XTX ∗ XT secara internal' - Anda baru saja menunjukkan kode di mana semuanya dilakukan dengan menggunakan SVD pada X? - masalah numerik merujuk pada matriks kovarians komputasi pertama (sebut saja C) kemudian temukan vektor eigen dari C
seanv507
@ seanv507 Mengenai pertanyaan 2 - saya rasa itu scipy.linalg.svd (X) menghitung svd dengan melakukan eigen-dekomposisi atau / dan . Hal yang sama untuk linalg.svds (X). Mengutip: "pemecah SVD acak cepat, dan algoritma" naif "yang menggunakan ARPACK sebagai eigensolver pada (X * XT) atau (XT * X)". Lihat juga baris terakhir di docs.scipy.org/doc/scipy/reference/generated/… . Satu-satunya cara saya dapat memahami kutipan pertama adalah bahwa algoritma acak adalah satu-satunya yang tidak menghitung matriks kovarians / gramXTXXXT
drake
1
Saya kira pendekatan ARPACK ada hubungannya dengan sesuatu seperti iterasi Arnoldi , jadi hanya harus melakukan produk-produk matriks-vektor. (Pada prinsipnya metode iteratif semacam ini bahkan tidak eksplisit , hanya sepasang rutin dan . Ini umum untuk matriks jarang besar dalam pemecah PDE, misalnya.)XXtimes()Xt_times()
GeoMatt22
@ GeoMatt22 Bisakah Anda menguraikan komentar Anda? Apakah maksud Anda bahwa pendekatan ARPACK atau LAPACK tidak menderita dari ketidakstabilan numerik karena mereka tidak perlu menghitung matriks kovarian?
drake

Jawaban:

13

Implementasi scikit-learning PCA dan TruncatedSVD tampaknya persis sama dengan algoritma.

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 TruncatedSVDberguna pada dataset jarang yang besar yang tidak dapat dipusatkan tanpa membuat penggunaan memori meledak.

  • numpy.linalg.svddan scipy.linalg.svdkeduanya mengandalkan LAPACK _GESDD yang dijelaskan di sini: http://www.netlib.org/lapack/lug/node32.html (bagi dan menaklukkan driver)

  • scipy.sparse.linalg.svdsbergantung 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_iteration

Berikut 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 ).

ogrisel
sumber
2
Satu dapat mendukung data jarang secara efisien (TruncatedSVD), yang lain tidak bisa (PCA). Inilah sebabnya kami memiliki 2 kelas.
ogrisel
1
Jika itu alasannya, maka saya akan memanggil mereka SVD dan SparseSVD (atau serupa) untuk menghindari kebingungan.
drake
2
Tetapi orang menginginkan PCA dan mereka mungkin tidak tahu bahwa PCA hanya SVD pada data terpusat.
ogrisel
5
@drake Saya tidak setuju bahwa "prosedurnya berbeda (PCA menggunakan matriks kovarians dan SVD menggunakan matriks data)". PCA adalah nama untuk jenis analisis. Seseorang dapat menggunakan algoritma dan implementasi yang berbeda untuk melakukannya. EIG dari matriks cov adalah satu metode, SVD dari matriks data terpusat adalah metode lain, dan kemudian EIG dan SVD dapat dilakukan dengan berbagai metode juga. Tidak masalah - semua itu PCA.
Amuba mengatakan Reinstate Monica
1
@amoeba Terima kasih atas klarifikasi / koreksi pada terminologinya. Apa yang Anda katakan lebih masuk akal bagi saya, mengingat bahwa SVD dan EIG adalah teorema / metode aljabar dengan cakupan yang lebih luas daripada PCA
drake