Differenza tra implementazioni di scikit-learning di PCA e TruncatedSVD


12

Comprendo la relazione tra l'analisi delle componenti principali e la decomposizione del valore singolare a livello algebrico / esatto. La mia domanda riguarda l' implementazione di scikit-learn .

La documentazione dice: " [TruncatedSVD] è molto simile al PCA, ma opera direttamente sui vettori di campione, anziché su una matrice di covarianza ", che rifletterebbe la differenza algebrica tra entrambi gli approcci. Tuttavia, in seguito dice: " Questo stimatore [TruncatedSVD] supporta due algoritmi: un risolutore SVD randomizzato veloce e un algoritmo" ingenuo "che utilizza ARPACK come eigensolver su (X * XT) o (XT * X), ​​a seconda di quale sia più efficiente ". Per quanto riguarda PCA, dice: "Riduzione della dimensionalità lineare usando la scomposizione del valore singolare dei dati per proiettarli ...". E l'implementazione di PCA supporta gli stessi due solutori di algoritmi (randomizzati e ARPACK) più un altro, LAPACK. Esaminando il codice posso vedere che sia ARPACK che LAPACK sia in PCA che in TruncatedSVD svd sui dati di esempio X, ARPACK essendo in grado di gestire matrici sparse (usando svds).

Quindi, a parte diversi attributi e metodi e che PCA può anche eseguire esattamente la decomposizione del valore singolare completo usando le implementazioni LAPACK, PCA e TruncatedSVD scikit-learning sembrano essere esattamente lo stesso algoritmo. Prima domanda: è corretto?

Seconda domanda: anche se LAPACK e ARPACK usano scipy.linalg.svd (X) e scipy.linalg.svds (X), essendo X la matrice del campione, calcolano la decomposizione del valore singolare o la decomposizione degli eigen di o internamente. Mentre il solutore "randomizzato" non ha bisogno di calcolare il prodotto. (Ciò è rilevante in relazione alla stabilità numerica, vedi Perché PCA dei dati mediante SVD dei dati? ). È corretto?XTXXXT

Codice pertinente: linea PCA 415. Troncata linea SVD 137.


1
potresti aggiungere un link al codice
seanv507,

1
drake - Penso di essere d'accordo con te sul primo Q. non capisco il secondo. cosa intendi con "calcolano la decomposizione del valore singolare o la decomposizione degli automi di XT ∗ XXT ∗ X o X ∗ XTX ∗ XT internamente" - hai appena mostrato il codice in cui tutto è fatto usando SVD su X? - i problemi numerici si riferiscono alla prima matrice di covarianza informatica (chiamatela C), quindi alla ricerca di autovettori di C
seanv507,

@ seanv507 Per quanto riguarda la seconda domanda - Immagino che scipy.linalg.svd (X) Calcola la SVD facendo l'Eigen-decomposizione di e / o . Stessa cosa per linalg.svds (X). Citando: "un risolutore SVD randomizzato veloce e un algoritmo" ingenuo "che usa ARPACK come eigensolver su (X * XT) o (XT * X)". Vedi anche l'ultima riga in docs.scipy.org/doc/scipy/reference/generated/… . L'unico modo in cui posso capire la prima citazione è che l'algoritmo randomizzato è l'unico che non calcola la matrice di covarianza / grammoXTXXXT
drake,

1
Immagino che l'approccio ARPACK abbia a che fare con qualcosa come l' iterazione di Arnoldi , quindi deve solo fare prodotti a matrice vettoriale. (In linea di principio questo tipo di metodi iterativi non ha nemmeno una esplicita , solo una coppia di routine e . Questo è comune per le grandi matrici sparse nei solutori PDE, per esempio.)XXtimes()Xt_times()
GeoMatt22

@ GeoMatt22 Puoi approfondire il tuo commento? Vuoi dire che gli approcci ARPACK o LAPACK non soffrono di instabilità numeriche perché non hanno bisogno di calcolare la matrice di covarianza?
Drake,

Risposte:


13

Le implementazioni PCA e TruncatedSVD scikit-learn sembrano essere esattamente lo stesso algoritmo.

No: PCA è (troncato) SVD su dati centrati (per sottrazione media per caratteristica). Se i dati sono già centrati, queste due classi faranno lo stesso.

In pratica TruncatedSVDè utile su grandi set di dati sparsi che non possono essere centrati senza far esplodere l'utilizzo della memoria.

  • numpy.linalg.svded scipy.linalg.svdentrambi fanno affidamento su LAPACK _GESDD descritto qui: http://www.netlib.org/lapack/lug/node32.html (divide e conquista il driver)

  • scipy.sparse.linalg.svdssi affida ad ARPACK per eseguire una decomposizione del valore di autovettore di XT. X o X. XT (a seconda della forma dei dati) tramite il metodo di iterazione di Arnoldi. La guida per l'utente HTML di ARPACK ha una formattazione interrotta che nasconde i dettagli computazionali ma l'iterazione di Arnoldi è ben descritta su wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iteration

Ecco il codice per lo SVD basato su ARPACK in scipy:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (cerca la stringa per "def svds" in caso di cambio di riga nel codice sorgente ).


2
Uno può supportare dati sparsi in modo efficiente (TruncatedSVD), l'altro no (PCA). Questo è il motivo per cui abbiamo 2 classi.
Ogrisel,

1
Se questo è il motivo, allora li chiamerei SVD e SparseSVD (o simili) per evitare confusione.
drake,

2
Ma le persone vogliono PCA e potrebbero non sapere che PCA è solo SVD su dati centrati.
Ogrisel,

5
@drake Non sono d'accordo sul fatto che "le procedure sono diverse (PCA utilizza la matrice di covarianza e SVD utilizza la matrice di dati)". PCA è un nome per il tipo di analisi. Si possono usare algoritmi e implementazioni diverse per eseguirlo. L'EIG della matrice cov è un metodo, SVD della matrice di dati centrata è un altro metodo, quindi EIG e SVD possono essere eseguiti anche con vari metodi. Non importa: tutto ciò è PCA.
ameba dice di reintegrare Monica il

1
@amoeba Grazie per il chiarimento / correzione sulla terminologia. Quello che dici ha più senso per me, dato che SVD ed EIG sono teoremi / metodi algebrici con un ambito più ampio rispetto alla PCA
drake,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.