Je comprends la relation entre l'analyse en composantes principales et la décomposition en valeurs singulières à un niveau algébrique / exact. Ma question concerne l' implémentation de scikit-learn .
La documentation dit: " [TruncatedSVD] est très similaire à l'ACP, mais fonctionne directement sur des vecteurs d'échantillonnage, plutôt que sur une matrice de covariance. ", Ce qui refléterait la différence algébrique entre les deux approches. Cependant, il dit plus tard: " Cet estimateur [TruncatedSVD] prend en charge deux algorithmes: un solveur SVD aléatoire rapide et un algorithme" naïf "qui utilise ARPACK comme solveur sur (X * XT) ou (XT * X), selon le plus élevé des deux. efficace. ". Concernant PCA, il dit: "Réduction de dimensionnalité linéaire en utilisant la décomposition en valeur singulière des données pour les projeter ...". Et l'implémentation PCA prend en charge les deux mêmes algorithmes (randomisés et ARPACK) solveurs plus un autre, LAPACK. En examinant le code, je peux voir que les deux ARPACK et LAPACK dans PCA et TruncatedSVD font svd sur des exemples de données X, ARPACK étant capable de traiter des matrices clairsemées (en utilisant svds).
Ainsi, mis à part les différents attributs et méthodes et que PCA peut en outre effectuer une décomposition complète des valeurs singulières en utilisant les implémentations scapkit-learning LAPACK, PCA et TruncatedSVD, il semble que ce soit exactement le même algorithme. Première question: est-ce correct?
Deuxième question: même si LAPACK et ARPACK utilisent scipy.linalg.svd (X) et scipy.linalg.svds (X), étant X la matrice d'échantillon, ils calculent la décomposition en valeurs singulières ou la décomposition propre de ou X ∗ X T en interne. Le solveur "randomisé" n'a pas besoin de calculer le produit. (Ceci est pertinent en relation avec la stabilité numérique, voir Pourquoi l'ACP des données au moyen de la SVD des données? ). Est-ce correct?
Code pertinent: PCA ligne 415. TruncatedSVD ligne 137.