Melhore a velocidade da implementação do t-sne em python para obter grandes dados

18

Eu gostaria de fazer uma redução de dimensionalidade em quase 1 milhão de vetores, cada um com 200 dimensões ( doc2vec). Estou usando a TSNEimplementação do sklearn.manifoldmódulo para ele e o grande problema é a complexidade do tempo. Mesmo com method = barnes_hut, a velocidade da computação ainda é baixa. Algum tempo até fica sem memória.

Estou executando-o em um processador de 48 núcleos com 130G de RAM. Existe um método para executá-lo paralelamente ou usar o recurso abundante para acelerar o processo.

yazhi
fonte
Você tentou reduzir o mapa em uma estrutura como o Spark?
Dawny33
Não .. como isso funciona e você pode, por favor, me dirigir ..
yazhi
Pl percorrer a documentação da faísca para entendê-lo :)
Dawny33
1
Veja se esta implementação do Spark funciona.
Emre 11/02
1
É Scala para Spark. Se você deseja uma implementação python, poderá traduzi-la; O Spark também roda em python.
Emre

Respostas:

7

Confira t-SNE baseado em interpolação acelerada por FFT ( papel , código e pacote Python ).

Do resumo:

Apresentamos t-SNE baseado em interpolação acelerada por transformação de Fourier rápida (FIt-SNE), que acelera drasticamente o cálculo do t-SNE. A etapa mais demorada do t-SNE é uma convolução que aceleramos interpolando em uma grade com espaço equidistante e subsequentemente usando a rápida transformação de Fourier para realizar a convolução. Também otimizamos o cálculo das semelhanças de entrada em altas dimensões usando vizinhos mais próximos aproximados multithread.

O artigo também inclui um exemplo de um conjunto de dados com um milhão de pontos e 100 dimensões (semelhante à configuração do OP), e parece levar aproximadamente 1 hora.

The_Anomaly
fonte
5

Como não há respostas no SO, perguntei-me na página do github e o problema foi encerrado com a seguinte resposta de GaelVaroquaux ..

Se você deseja apenas paralelizar a operação vetorial, deve usar uma compilação de numpy compilada com MKL (não tente fazer isso sozinho, é um desafio).

Poderia haver abordagens para o paralelismo de alto nível no próprio algoritmo, o que provavelmente levaria a ganhos maiores. No entanto, após uma rápida olhada no código, não vi nenhuma maneira clara de fazer isso.

Vou adiante e encerro esta questão, pois é mais uma lista de desejos do céu azul. Concordo plenamente, gostaria que o TSNE fosse mais rápido e seria ótimo se o paralelismo fosse fácil. Mas, no estado atual, é necessário mais trabalho em um estado em que possamos lidar com essa lista de desejos.

yazhi
fonte