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?


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


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


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.