Algoritmo PCA mais rápido para dados de alta dimensão

11

Eu gostaria de executar um PCA em um conjunto de dados composto por aproximadamente 40.000 amostras, cada uma exibindo cerca de 10.000 recursos.

O uso da função princomp do Matlab leva consistentemente mais de meia hora; nesse ponto, eu mato o processo. Gostaria de encontrar uma implementação / algoritmo que seja executado em menos de 10 minutos. Qual seria o algoritmo mais rápido? Quanto tempo levaria em um i7 dual core / 4GB de RAM?

maduro
fonte
Sim, você está certo, eu deveria ser mais preciso. Demora mais de meia hora, então eu decidi matar o processo. Eu tenho que fazer isso pelo menos dez vezes, não seria bom ter algo que funciona em menos de 10 minutos
mellow
Quão escassa é a sua matriz?
Arnold Neumaier
A porcentagem de zeros na matriz está acima de 80%
suave
Confira também kernal-PCA.
meawoppl 7/09/12

Respostas:

11

Primeiro de tudo, você deve especificar se deseja todos os componentes ou os mais significativos?

Indique sua matriz sendo N o número de amostras e a dimensionalidade M.ARN×MNM

Caso você deseje todos os componentes, o caminho clássico a seguir é calcular a matriz de covariância (que possui complexidade de tempo de O ( N M 2 ) ) e depois aplicar SVD a ela ( O ( M 3 adicional ) ). Em termos de memória isso levaria O ( 2 H 2 ) (matriz de covariância + vectores singulares e valores que formam base ortogonal) ou 1,5 GB de dupla precisão para o seu determinado Um .CRM×MO(NM2)O(M3)O(2M2)1.5A

Você pode aplicar SVD diretamente à matriz se normalizar cada dimensão anterior a essa e pegar vetores singulares à esquerda. No entanto, praticamente eu esperaria que o SVD da matriz A levasse mais tempo.AA

Se você precisar de apenas uma fração dos componentes (talvez o mais significativo), convém aplicar o PCA iterativo . Até onde eu sei, todos esses algoritmos estão intimamente relacionados ao processo de Lanczos, portanto, você depende do espectro do e praticamente será difícil obter a precisão do SVD para os vetores obtidos e se degradará com o número de vetores singulares.C

Alexander
fonte
2

Eu acho que você só precisa de alguns (ou algumas centenas) pares de valores / vetores singulares dominantes. Então é melhor usar um método iterativo, que será muito mais rápido e consumirá muito menos memória.

No Matlab, consulte

help svds

Arnold Neumaier
fonte
Sim, parece que os métodos iterativos são muito mais rápidos se eu precisar apenas dos primeiros cem componentes.
maduro
No que diz respeito ao svds, tentei colocar minha matriz em um formato esparso e modifique a função princomp para colocar svds em vez de svd, e para minha surpresa, demorou muito mais tempo em uma matriz 2000 * 4000 (180 s em vez de 15s ) Estranho ...
mellow
1
Não há necessidade de mudar para o formato esparso. Além disso, você precisa reduzir o número de vetores singulares que deseja calcular. Para calcular o svd completo, o svds não é adequado.
Arnold Neumaier
2
Também digno de nota para os modos dominantes são mais recentes métodos svd randomizados, como em stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger
2

Você pode verificar minha resposta em Validação cruzada . Eu não queria copiá-lo aqui. Basicamente, você pode usar SVD rápido e aleatório para calcular a base e os coeficientes do PCA.

petrichor
fonte