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.A∈RN×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 .C∈RM×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