Diferença entre implementações scikit-learn do PCA e TruncatedSVD

12

Entendo a relação entre Análise de Componentes Principais e Decomposição de Valor Singular em um nível algébrico / exato. Minha pergunta é sobre a implementação do scikit-learn .

A documentação diz: " [TruncatedSVD] é muito semelhante ao PCA, mas opera diretamente em vetores de amostra, em vez de em uma matriz de covariância. ", O que refletiria a diferença algébrica entre as duas abordagens. No entanto, mais tarde, ele diz: " Este estimador [TruncatedSVD] suporta dois algoritmos: um solucionador SVD aleatório rápido e um algoritmo" ingênuo "que usa o ARPACK como um resolvedor automático em (X * XT) ou (XT * X), ​​o que for mais eficiente. " Em relação ao PCA, diz: "Redução linear da dimensionalidade usando a decomposição de valor singular dos dados para projetá-lo ...". E a implementação do PCA suporta os mesmos dois solucionadores de algoritmos (randomizados e ARPACK), além de outro, o LAPACK. Examinando o código, vejo que o ARPACK e o LAPACK no PCA e no TruncatedSVD fazem svd nos dados de amostra X, sendo o ARPACK capaz de lidar com matrizes esparsas (usando svds).

Portanto, além dos diferentes atributos e métodos, e que o PCA também pode decompor exatamente o valor singular usando as implementações de aprendizado de truque LAPACK, PCA e TruncatedSVD, parece ser exatamente o mesmo algoritmo. Primeira pergunta: isso está correto?

Segunda pergunta: mesmo que o LAPACK e o ARPACK usem scipy.linalg.svd (X) e scipy.linalg.svds (X), sendo X a matriz da amostra, eles calculam a decomposição de valor singular ou decomposição de ou internamente. Enquanto o solucionador "randomizado" não precisa calcular o produto. (Isso é relevante em relação à estabilidade numérica, consulte Por que o PCA de dados por meio do SVD dos dados? ). Isso está correto?XTXXXT

Código relevante: linha 415 do PCA . Linha 137 truncada do SVD .

drake
fonte
1
você pode adicionar um link para o código
seanv507
1
Drake - Acho que concordo com você no primeiro P. Não entendo o segundo. o que você quer dizer com 'eles calculam a decomposição de valor singular ou decomposição em si próprio de XT ∗ XXT ∗ X ou X ∗ XTX ∗ XT internamente' - você acabou de mostrar o código onde tudo é feito usando SVD em X? - questões numéricas referem-se a matriz de covariância primeira computação (chamemos-lhe C) em seguida, encontrar autovetores de C
seanv507
@ seanv507 Quanto segunda questão - Eu acho que scipy.linalg.svd (X) calcula a svd, fazendo o eigen-decomposição de e / ou . A mesma coisa para linalg.svds (X). Citação: "um solucionador SVD rápido e aleatório e um algoritmo" ingênuo "que usa o ARPACK como um resolvedor automático em (X * XT) ou (XT * X)". Veja também a última linha em docs.scipy.org/doc/scipy/reference/generated/… . A única maneira que eu posso compreender a primeira citação é que o algoritmo randomizado é o único que não computa a covariância / grama matrizXTXXXT
Drake
1
Eu acho que a abordagem ARPACK tem a ver com algo como a iteração Arnoldi , portanto, só tem a ver com produtos vetoriais matriciais. (Em princípio este tipo de métodos iterativos fazer nem mesmo uma explícita , apenas um par de rotinas e . Isso é comum para grandes matrizes esparsas em solucionadores PDE, por exemplo.)XXtimes()Xt_times()
GeoMatt22
@ GeoMatt22 Você pode elaborar seu comentário? Você quer dizer que as abordagens ARPACK ou LAPACK não sofrem instabilidades numéricas porque não precisam calcular a matriz de covariância?
drake

Respostas:

13

As implementações de aprendizado de scikit PCA e TruncatedSVD parecem ser exatamente o mesmo algoritmo.

Não: o PCA é SVD (truncado) em dados centralizados (por subtração média por recurso). Se os dados já estiverem centralizados, essas duas classes farão o mesmo.

Na prática, TruncatedSVDé útil em grandes conjuntos de dados esparsos que não podem ser centralizados sem fazer explodir o uso da memória.

  • numpy.linalg.svde scipy.linalg.svdambos contam com o LAPACK _GESDD descrito aqui: http://www.netlib.org/lapack/lug/node32.html (dividir e conquistar driver)

  • scipy.sparse.linalg.svdsdepende do ARPACK para fazer uma decomposição de valor próprio de XT. X ou X. XT (dependendo da forma dos dados) através do método de iteração Arnoldi. O guia do usuário HTML do ARPACK possui uma formatação quebrada que oculta os detalhes computacionais, mas a iteração Arnoldi está bem descrita na wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iteration

Aqui está o código para o SVD baseado em ARPACK no scipy:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (procure a string "def svds" no caso de alteração de linha no código fonte )

ogrisel
fonte
2
Um pode suportar dados esparsos com eficiência (TruncatedSVD), o outro não (PCA). É por isso que temos 2 classes.
Ogrisel
1
Se esse for o motivo, eu os chamaria de SVD e SparseSVD (ou similar) para evitar confusão.
drake
2
Mas as pessoas querem PCA e podem não saber que PCA é apenas SVD em dados centralizados.
ogrisel
5
@drake Não concordo que "os procedimentos sejam diferentes (o PCA usa a matriz de covariância e o SVD usa a matriz de dados)". PCA é um nome para o tipo de análise. Pode-se usar diferentes algoritmos e implementações para realizá-lo. O EIG da matriz cov é um método, o SVD da matriz de dados centralizada é outro método, e o EIG e o SVD também podem ser realizados por vários métodos. Não importa - tudo isso é PCA.
Ameba diz Reinstate Monica
1
@amoeba Obrigado pelo esclarecimento / correção da terminologia. O que você diz faz mais sentido para mim, dado que SVD e EIG são teoremas / métodos com um âmbito mais amplo do que o PCA algébricas
Drake