2017-07-06 4 views
3

Ich verwende Sklearn, um das Gaussian Mixture Model (GMM) für einige Daten zu schätzen.Wie Sklearn GMM() Leistung Geschwindigkeit erhöhen?

Nach der Schätzung habe ich viele Abfragepunkte. Ich möchte ihre Wahrscheinlichkeiten der Zugehörigkeit zu jedem der geschätzten Gaußschen erhalten.

Der folgende Code funktioniert. Allerdings ist der gmm_sk.predict_proba(query_points) Teil sehr langsam, da ich ihn mehrmals auf 100000 Probensätzen ausführen muss, wobei jede Probe 1000 Punkte enthält.

Ich denke, dass es passiert, weil es sequenziell ist. Gibt es eine Möglichkeit, es parallel zu machen? Oder eine andere Möglichkeit, es schneller zu machen? Vielleicht auf GPU mit TensorFlow?

Ich sah TensorFlow seinen eigenen GMM Algorithmus hat, aber es war sehr schwer zu implementieren.

Hier ist der Code, den ich geschrieben habe:

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))  

ich es gelöst! mit multiprocessing. ersetzt nur

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

mit

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

Antwort

0

Sie den Prozess beschleunigen könnte, wenn Sie mit der ‚diagonal‘ oder sphärischer Kovarianzmatrix statt Voll passen.

Verwendung:

covariance_type='diag'

oder

covariance_type='spherical'

innen GaussianMixture

Versuchen Sie auch, zu Abnahme der Gaußschen Komponenten .

Beachten Sie jedoch, dass dies die Ergebnisse beeinflussen kann, aber ich sehe keinen anderen Weg, um den Prozess zu beschleunigen.

+0

Beachten Sie, dass ich bereits "Diag" verwende. Es ist immer noch langsam. vielleicht parallelisieren? –

+0

@itzikBenShabat die GaussianMixture-Funktion hat keinen n_jobs-Parameter (Die Anzahl der CPUs zu verwenden, um die Berechnung zu tun), aber wenn Sie einen anderen Weg nach es finden, wird es interessant sein :) Denken Sie auch, diese Aufgabe mit anderen Modul z. Tensorflow oder auch andere Software wie Matlab – sera

+0

@itzikBenShabat haben Sie versucht, die Gauß-Komponenten zu verringern? – sera

0

Ich sehe, dass Ihre Anzahl von Gauß-Komponenten in der GMM 1000 ist, was, denke ich, eine sehr große Zahl ist, da Ihre Datendimensionalität relativ niedrig ist (3). Dies ist wahrscheinlich der Grund, dass es langsam läuft, da es 1000 separate Gauß-Werte auswerten muss. Wenn die Anzahl Ihrer Proben niedrig ist, ist dies auch sehr anfällig für Überanpassungen. Sie können eine geringere Anzahl von Komponenten ausprobieren, was natürlich schneller ist und sich wahrscheinlich besser verallgemeinern wird.

+0

Danke für den Vorschlag, aber die Anzahl der Gaußschen ist eine Einschränkung, die ich nicht ändern kann –

+0

Dann können Sie vielleicht naiv parallel über die Sätze von Proben, führen Sie jeden Satz auf einem anderen Thread zum Beispiel. Natürlich müssen Sie vorsichtig sein, wenn Sie die Ergebnisse in einen gemeinsamen Container schreiben müssen. –

+0

Das ist eine gute Idee, wie würdest du das machen? –

Verwandte Themen