Diferencia entre las implementaciones scikit-learn de PCA y TruncatedSVD

12

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 TXTXXXT

Código relevante: PCA línea 415. TruncatedSVD línea 137.

pato
fuente
1
¿podría agregar un enlace al código
seanv507
1
drake - Creo que estoy de acuerdo contigo en la primera P. No entiendo la segunda. ¿Qué quiere decir con 'ellos calculan la descomposición de valores singulares o la descomposición propia de XT ∗ XXT ∗ X o X ∗ XTX ∗ XT internamente' - acaba de mostrar el código donde se hace todo usando SVD en X? - los problemas numéricos se refieren a la primera matriz de covarianza computacional (
llámela
@ seanv507 Respecto segunda pregunta - supongo que scipy.linalg.svd (X) calcula la SVD haciendo el eigen-descomposición de y / o . Lo mismo para linalg.svds (X). Cita: "un solucionador SVD aleatorio rápido y un algoritmo" ingenuo "que usa ARPACK como un eigensolver en (X * XT) o (XT * X)". Vea también la última línea en docs.scipy.org/doc/scipy/reference/generated/… . La única forma en que puedo entender la primera cita es que el algoritmo aleatorio es el único que no calcula la matriz de covarianza / gramoX X TXTXXXT
Drake
1
Supongo que el enfoque ARPACK tiene que ver con algo como la iteración de Arnoldi , por lo que solo tiene que hacer productos de vectores de matriz. (En principio, este tipo de métodos iterativos ni siquiera tienen una explícita , solo un par de rutinas y . Esto es común para matrices dispersas grandes en solucionadores PDE, por ejemplo).XXtimes()Xt_times()
GeoMatt22
@ GeoMatt22 ¿Puedes dar más detalles sobre tu comentario? ¿Quiere decir que los enfoques ARPACK o LAPACK no sufren inestabilidades numéricas porque no necesitan calcular la matriz de covarianza?
Drake

Respuestas:

13

Las implementaciones de PCA y TruncatedSVD scikit-learn parecen ser exactamente el mismo algoritmo.

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, TruncatedSVDes útil en grandes conjuntos de datos dispersos que no pueden centrarse sin hacer explotar el uso de la memoria.

  • numpy.linalg.svdy scipy.linalg.svdambos confían en LAPACK _GESDD descrito aquí: http://www.netlib.org/lapack/lug/node32.html (dividir y conquistar el controlador)

  • scipy.sparse.linalg.svdsse 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_iteration

Aquí 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 )

ogrisel
fuente
2
Uno puede admitir datos dispersos de manera eficiente (TruncatedSVD), el otro no (PCA). Por eso tenemos 2 clases.
Ogrisel
1
Si esa es la razón, entonces los llamaría SVD y SparseSVD (o similar) para evitar confusiones.
Drake
2
Pero la gente quiere PCA y puede que no sepan que PCA es solo SVD en datos centrados.
Ogrisel
55
@drake No estoy de acuerdo con que "los procedimientos son diferentes (PCA usa matriz de covarianza y SVD usa matriz de datos)". PCA es un nombre para el tipo de análisis. Se pueden usar diferentes algoritmos e implementaciones para llevarlo a cabo. El EIG de la matriz cov es un método, la SVD de la matriz de datos centrada es otro método, y luego EIG y SVD también se pueden realizar por varios métodos. No importa, todo eso es PCA.
ameba dice Reinstate Monica
1
@amoeba Gracias por la aclaración / corrección en la terminología. Lo que usted dice tiene más sentido para mí, dado que SVD y EIG son teoremas / métodos algebraicos con un alcance más amplio que PCA
Drake