Entiendo la relación entre el Análisis de Componentes Principales y la Descomposición de Valores Singulares a 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 sobre los vectores de muestra directamente, en lugar de sobre una matriz de covarianza. ", lo que reflejaría la diferencia algebraica entre ambos enfoques. Sin embargo, más adelante dice: " Este estimador [TruncatedSVD] admite dos algoritmos: un solucionador aleatorio rápido de SVD, y un algoritmo "ingenuo" que utiliza ARPACK como eigensolver en (X * X.T) o (X.T * X), lo que sea más eficiente. ". En cuanto a PCA dice: "Reducción lineal de la dimensionalidad utilizando la descomposición del valor singular de los datos para proyectarlos...". Y la implementación de PCA soporta los mismos dos algoritmos (randomized y ARPACK) solvers más otro, LAPACK. Mirando en el código puedo ver que tanto ARPACK como LAPACK tanto en PCA como en TruncatedSVD hacen svd en los datos de muestra X, siendo ARPACK capaz de tratar con matrices dispersas (usando svds).
Así que, aparte de los diferentes atributos y métodos y de que PCA puede hacer adicionalmente la descomposición de valor singular completa exacta usando LAPACK, las implementaciones de PCA y TruncatedSVD de scikit-learn parecen ser exactamente el mismo algoritmo. Primera pregunta: ¿Es esto correcto?
Segunda cuestión: aunque LAPACK y ARPACK utilizan scipy.linalg.svd(X) y scipy.linalg.svds(X), siendo X la matriz de muestra, calculan la descomposición de valores singulares o la descomposición de valores propios de $X^T*X$ o $X*X^T$ internamente. Mientras que el solucionador "aleatorio" no necesita calcular el producto. (Esto es relevante en relación con la estabilidad numérica, véase ¿Por qué el ACP de los datos mediante la SVD de los datos? ). ¿Es esto correcto?
Código correspondiente: PCA línea 415. TruncatedSVD línea 137.