Estou executando uma tarefa de classificação de texto com R e obtenho uma matriz de termo de documento com tamanho 22490 por 120.000 (apenas 4 milhões de entradas diferentes de zero, menos de 1%). Agora, quero reduzir a dimensionalidade utilizando o PCA (Principal Component Analysis). Infelizmente, R não pode lidar com essa matriz enorme, então eu armazeno essa matriz esparsa em um arquivo no "Matrix Market Format", esperando usar algumas outras técnicas para executar o PCA.
Então, alguém poderia me dar algumas dicas para bibliotecas úteis (qualquer que seja a linguagem de programação), que poderiam fazer o PCA com essa matriz de grande escala com facilidade ou fazer um PCA de mão longa sozinho, ou seja, calcular a matriz de covariância primeiro e calcule os autovalores e autovetores para a matriz de covariância .
O que eu quero é calcular todos os PCs (120.000) e escolher apenas os N PCs principais, responsáveis por 90% de variação . Obviamente, neste caso, eu tenho que dar um limiar a priori para definir alguns valores de variância muito pequenos para 0 (na matriz de covariância), caso contrário, a matriz de covariância não será esparsa e seu tamanho será de 120.000 a 120.000, o que é impossível de manusear com uma única máquina. Além disso, os carregamentos (vetores próprios) serão extremamente grandes e devem ser armazenados em formato esparso.
Muito obrigado por qualquer ajuda !
Nota: estou usando uma máquina com 24 GB de RAM e 8 núcleos de CPU.
fonte
Respostas:
Eu sugiro o pacote irlba - ele produz praticamente os mesmos resultados que o svd, mas você pode definir um número menor de valores singulares para resolver. Um exemplo, usando matrizes esparsas para resolver o prêmio da Netflix, pode ser encontrado aqui: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html
fonte
Sugiro usar o SLEPc para calcular um SVD parcial. Consulte o capítulo 4 do manual do usuário e as páginas de manual do SVD para obter detalhes.
fonte
Eu voto no mahout, o que também é bom para outras tarefas da PNL / TA e implementa o map / red.
fonte
Eu sugeriria o uso de uma decomposição de valor singular incremental, da qual existem muitos na literatura. Por exemplo:
Todas essas abordagens se reduzem ao seguinte:
fonte
Você ainda pode usar R.
Revolution R
é uma compilação do R que lida com conjuntos de dados maiores que a RAM. Use a funçãoprincomp
.Ele também possui uma gama completa de funções estatísticas, especialmente projetadas para problemas de estilo de big data que não se encaixam na RAM, por exemplo, regressão linear, regressão logística, quantis, etc.
Você pode fazer o download gratuito da versão acadêmica com todos os recursos, marcando a caixa "Eu sou acadêmico".
fonte