Entiendo la relación entre el análisis de componentes principales y la descomposición del valor singular en un nivel algebraico / exacto. Mi pregunta es sobre la implementación de scikit-learn .
La documentación dice: " [TruncatedSVD] es muy similar a PCA, pero opera en vectores de muestra directamente, en lugar de en una matriz de covarianza ", lo que reflejaría la diferencia algebraica entre ambos enfoques. Sin embargo, más tarde dice: " Este estimador [TruncatedSVD] admite dos algoritmos: un solucionador SVD aleatorio rápido y un algoritmo" ingenuo "que usa ARPACK como un eigensolver en (X * XT) o (XT * X), lo que sea más eficiente ". Sobre PCA, dice: "Reducción de dimensionalidad lineal usando la Descomposición de valores singulares de los datos para proyectarlos ...". Y la implementación de PCA admite los mismos dos algoritmos (aleatorios y ARPACK) solucionadores más otro, LAPACK. Mirando el código, puedo ver que tanto ARPACK como LAPACK en PCA y TruncatedSVD hacen svd en los datos de muestra X, ARPACK puede lidiar con matrices dispersas (usando svds).
Por lo tanto, aparte de los diferentes atributos y métodos, y que PCA también puede hacer una descomposición exacta del valor singular completo usando LAPACK, PCA y TruncatedSVD, las implementaciones de scikit-learn parecen ser exactamente el mismo algoritmo. Primera pregunta: ¿es esto correcto?
Segunda pregunta: aunque LAPACK y ARPACK usan scipy.linalg.svd (X) y scipy.linalg.svds (X), siendo X la matriz de la muestra, calculan la descomposición en valores singulares o la descomposición propia de o internamente. Mientras que el solucionador "aleatorizado" no necesita calcular el producto. (Esto es relevante en relación con la estabilidad numérica, ver ¿Por qué PCA de datos mediante SVD de los datos? ). ¿Es esto correcto?X ∗ X T
Código relevante: PCA línea 415. TruncatedSVD línea 137.
Xtimes()
Xt_times()