Améliorez la vitesse de mise en œuvre de t-sne en python pour les énormes données

18

Je voudrais faire une réduction de dimensionnalité sur près d'un million de vecteurs chacun avec 200 dimensions ( doc2vec). j'utiliseTSNE implémentation du sklearn.manifoldmodule pour cela et le problème majeur est la complexité du temps. Même avec method = barnes_hut, la vitesse de calcul est encore faible. Un certain temps, même il manque de mémoire.

Je l'exécute sur un processeur à 48 cœurs avec 130 Go de RAM. Existe-t-il une méthode pour l'exécuter en parallèle ou utiliser la ressource abondante pour accélérer le processus.

yazhi
la source
Avez-vous essayé de réduire la carte dans un cadre comme Spark?
Dawny33
Non .. comment ça marche et pouvez-vous s'il vous plaît me diriger ..
yazhi
Veuillez consulter la documentation de Spark pour le comprendre :)
Dawny33
1
Vérifiez si cette implémentation Spark fonctionne.
Emre
1
C'est Scala pour Spark. Si vous voulez une implémentation python, vous pourrez peut-être la traduire; Spark fonctionne également sur python.
Emre

Réponses:

7

Consultez le t-SNE basé sur l'interpolation accélérée par FFT ( papier , code et package Python ).

Du résumé:

Nous présentons le t-SNE basé sur l'interpolation accélérée par transformée de Fourier rapide (FIt-SNE), qui accélère considérablement le calcul du t-SNE. L'étape la plus longue de t-SNE est une convolution que nous accélérons en interpolant sur une grille équidistante et en utilisant ensuite la transformée de Fourier rapide pour effectuer la convolution. Nous optimisons également le calcul des similitudes d'entrée dans les dimensions élevées en utilisant les voisins les plus proches approximatifs multithreads.

L'article comprend également un exemple d'un ensemble de données avec un million de points et 100 dimensions (similaire au paramètre OP), et cela semble prendre environ 1 heure.

The_Anomaly
la source
5

Depuis, il n'y a pas de réponses dans SO, je me suis posé la question dans la page github et le problème a été clos en énonçant la réponse suivante de GaelVaroquaux ..

Si vous souhaitez uniquement paralléliser l'opération vectorielle, vous devez utiliser une version de numpy compilée avec MKL (n'essayez pas de le faire vous-même, c'est difficile).

Il pourrait y avoir des approches de parallélisme de haut niveau dans l'algorithme lui-même, ce qui conduirait probablement à des gains plus importants. Cependant, après un rapide coup d'œil au code, je n'ai pas vu de moyen clair de le faire.

Je vais aller de l'avant et clore ce problème, car il s'agit plutôt d'une liste de souhaits bleu ciel. Je suis tout à fait d'accord, j'aimerais que TSNE aille plus vite, et ce serait génial si le parallélisme était facile. Mais dans l'état actuel des choses, plus de travail est nécessaire pour être dans un état où nous pouvons aborder une telle liste de souhaits.

yazhi
la source