2017-07-06 5 views
3

J'utilise Sklearn pour estimer le modèle de mélange gaussien (GMM) sur certaines données.Comment augmenter Sklearn GMM prédire() la vitesse de performance?

Après l'estimation, j'ai beaucoup de points de requête. Je voudrais obtenir leurs probabilités d'appartenance à chacun des estimés gaussiens.

Le code ci-dessous fonctionne. Cependant, la partie gmm_sk.predict_proba(query_points) est très lente car j'ai besoin de l'exécuter plusieurs fois sur 100000 ensembles d'échantillons, où chaque échantillon contient 1000 points. Je suppose que ça arrive parce que c'est séquentiel. Y a-t-il un moyen de le rendre parallèle? Ou tout autre moyen de le rendre plus rapide? Peut-être sur GPU en utilisant TensorFlow?

J'ai vu tensorflow a son propre GMM algorithme, mais il était très difficile à mettre en œuvre.

Voici le code que je l'ai écrit:

import numpy as np 
from sklearn.mixture import GaussianMixture 
import time 


n_gaussians = 1000 
covariance_type = 'diag' 
points = np.array(np.random.rand(10000, 3), dtype=np.float32) 
query_points = np.array(np.random.rand(1000, 3), dtype=np.float32) 
start = time.time() 

#GMM with sklearn 
gmm_sk = GaussianMixture(n_components = n_gaussians, covariance_type=covariance_type) 
gmm_sk.fit(points) 
mid_t = time.time() 
elapsed = time.time() - start 
print("learning took "+ str(elapsed)) 

temp = [] 
for i in range(2000): 
    temp.append(gmm_sk.predict_proba(query_points)) 

end_t = time.time() - mid_t 
print("predictions took " + str(end_t))  

Je l'ai résolu! en utilisant multiprocessing. vient de remplacer

temp = [] 
for i in range(2000): 
    temp.append(gmm_sk.predict_proba(query_points)) 

avec

import multiprocessing as mp 
    query_points = query_points.tolist() 
    parallel = mp.Pool() 
    fv = parallel.map(par_gmm, query_points) 
    parallel.close() 
    parallel.join() 

Répondre

0

Vous pouvez accélérer le processus si vous correspondez à la « diagonale » ou matrice de covariance sphérique au lieu de plein.

Utilisation:

covariance_type='diag'

ou

covariance_type='spherical'

intérieur GaussianMixture

Aussi, essayez de diminution la gaussienne composants . Cependant, gardez à l'esprit que cela peut affecter les résultats mais je ne vois pas d'autre moyen d'accélérer le processus.

+0

Notez que j'utilise déjà "diag". C'est encore lent. peut-être paralléliser? –

+0

@itzikBenShabat La fonction GaussianMixture n'a pas de paramètre n_jobs (Le nombre de processeurs à utiliser pour effectuer le calcul) mais si vous trouvez un autre moyen de le publier, cela sera intéressant :) En outre, envisagez d'effectuer cette tâche en utilisant un autre module, par exemple. tensorflow ou même d'autres logiciels comme Matlab – sera

+0

@itzikBenShabat avez-vous essayé de diminuer les composants gaussiens? – sera

0

Je vois que votre nombre de composants gaussiens dans le GMM est 1000, ce qui, je pense est un très grand nombre, étant donné que la dimension de vos données est relativement faible (3). C'est probablement la raison pour laquelle il fonctionne lentement, puisqu'il doit évaluer 1000 gaussiennes séparées. Si votre nombre d'échantillons est faible, il est également très sujet à surapprentissage. Vous pouvez essayer un plus petit nombre de composants, ce qui sera naturellement plus rapide et généralisera probablement mieux.

+0

Merci pour la suggestion mais le nombre de gaussiennes est une contrainte que je ne peux pas changer –

+0

Alors peut-être vous pouvez paralléliser naïvement sur les ensembles d'échantillons, exécuter chaque ensemble sur un fil différent par exemple. Bien sûr, vous devez faire attention si vous devez écrire les résultats dans un conteneur partagé. –

+0

C'est une bonne idée, comment feriez-vous cela? –