Aplique o PCA em uma matriz esparsa muito grande

16

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.

Ensom Hodder
fonte
Quão esparsa é a matriz? Como você usa o SVD resultante? Se você precisar apenas de uma parte, provavelmente poderá aproximar muito mais barato.
Arnold Neumaier
@ ArnoldNeumaier Com licença, esqueci de adicionar as informações esparsas. Atualizei a postagem, juntamente com minha ideia completa.
Ensom Hodder
cada SLEPc, mahout e irlba sugeridos nas respostas até agora parecem adequados para o seu problema.
Arnold Neumaier
11
Por que você deseja calcular todos os 120k? Parece que você quer apenas os responsáveis ​​por 90% da variação, o que deve ser muito mais barato para calcular.
Jed Brown
@JedBrown Hey Jed, você está totalmente certo! Estou interessado apenas nos responsáveis ​​por 90% de variação e também nos autovetores correspondentes (por transformar o conjunto de dados de teste posteriormente). Você poderia me informar seus métodos mais baratos ?
Ensom Hodder

Respostas:

4

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

Marc na caixa
fonte
Obrigado por seus comentários. Na verdade, eu assisti esse vídeo e também tentei o pacote irlba ontem, mas parecia que ele poderia ser usado apenas para calcular alguns valores singulares. No entanto, conforme declarado no post, desejo calcular TODOS os valores singulares (120.000), para escolher um número adequado de PCs de acordo com as variações que eles representam. Nesse caso, acho que o irlba não é mais adequado.
Ensom Hodder
Você pode usar os resultados do SVD de maneira semelhante ao PCA? Você não precisa centralizar os dados ANTES de executar o SVD, para executar o PCA?
Zach
@Zach - SVD é o principal algoritmo por trás do PCA (consulte prcomp - stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ). A centralização de dados também é um procedimento padrão antes de submeter ao PCA, embora haja uma grande variedade de opções, dependendo da sua pergunta (por exemplo, diferentes tipos de escala também podem ser aplicados).
Marc na caixa
Qual o tamanho de um acordo, se eu não centralizar os dados antes do SVD? Eu tenho uma matriz esparsa que se encaixa na memória, mas a centralização a tornaria densa e grande demais para caber na memória.
Zach
@ Zach - Depende realmente de como você deseja relacionar suas amostras entre si. Se você não pode trabalhar com dados centralizados devido a limites de memória, acho que a decisão foi tomada por você. Geralmente, os dados de centralização fazem o PCA operar em uma matriz de covariância das amostras, enquanto a centralização e dimensionamento de dados fazem o PCA operar em uma matriz de correlação. Para obter mais informações sobre essas decisões, considere fazer uma pergunta em stats.stackexchange.com ou pesquise as respostas existentes sobre o PCA.
Marc na caixa
8

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.

Jed Brown
fonte
11
Como ele deseja PCA, ele deve centralizar os dados antes de calcular o SVD. Isso destruirá a esparsidade. Existe alguma maneira de o SLEPc acomodar isso?
Dranxo 24/05
3
Isso é apenas escasso + classificação baixa. O SLEPc não precisa de entradas de matriz, apenas um operador linear, que pode ser aplicado como uma matriz esparsa mais uma correção.
Jed Brown 24/05
2

Eu voto no mahout, o que também é bom para outras tarefas da PNL / TA e implementa o map / red.

danas.zuokas
fonte
Sim, você está certo, o mahout está exatamente no meu roteiro. Mas prefiro criar um protótipo com algumas técnicas "simples" (suponho) com antecedência.
Ensom Hodder
1

Eu sugeriria o uso de uma decomposição de valor singular incremental, da qual existem muitos na literatura. Por exemplo:

  • os relatórios técnicos de Matthew Brand 1 e 2 são bastante fáceis de seguir
  • A tese de mestrado de Chris Baker , seu software IncPACK e seu trabalho posterior sobre o método incremental de SVD
  • Bunch e Nielsen publicaram o primeiro artigo conhecido
  • Artigos de Hall sobre a atualização dos problemas de autovalores 1 e 2
  • Análise seqüencial de Karhunen-Loeve por Levy et al., Que é basicamente a mesma coisa

Todas essas abordagens se reduzem ao seguinte:

  • comece com um pequeno conjunto de dados
  • calcular um SVD de alguma forma (esta etapa é trivial para uma única matriz de coluna)
  • repita até terminar:
    • adicionar novo conjunto de dados
    • usar regras existentes de SVD e atualização para calcular o SVD do novo conjunto de dados

N

Geoff Oxberry
fonte
0

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ção princomp.

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".

Contango
fonte