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.
fuente
Xtimes()
Xt_times()
Respuestas:
No: PCA es SVD (truncado) en datos centrados (por sustracción media por característica). Si los datos ya están centrados, esas dos clases harán lo mismo.
En la práctica,
TruncatedSVD
es útil en grandes conjuntos de datos dispersos que no pueden centrarse sin hacer explotar el uso de la memoria.numpy.linalg.svd
yscipy.linalg.svd
ambos confían en LAPACK _GESDD descrito aquí: http://www.netlib.org/lapack/lug/node32.html (dividir y conquistar el controlador)scipy.sparse.linalg.svds
se basa en ARPACK para hacer una descomposición de valor propio de XT. X o X XT (dependiendo de la forma de los datos) a través del método de iteración Arnoldi. La guía de usuario HTML de ARPACK tiene un formato roto que oculta los detalles computacionales, pero la iteración de Arnoldi está bien descrita en wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iterationAquí está el código para el SVD basado en ARPACK en scipy:
https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (busque la cadena para "def svds" en caso de cambio de línea en el código fuente )
fuente