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