いくつかのデータでガウス混合モデル(GMM)を推定するには、Sklearnをと使用しています。Sklearn GMM predict()パフォーマンススピードを上げる方法
推定後、私は多くのクエリポイントを持っています。推定されたガウスのそれぞれに帰属する確率を取得したいと思います。
以下のコードは機能します。しかし、gmm_sk.predict_proba(query_points)
の部分は、各サンプルが1000ポイントを含む100000セットのサンプルに対して複数回実行する必要があるため、非常に遅いです。
私はそれが逐次であるために起こると思います。それを平行にする方法はありますか?それをもっと速くするための方法は他にありますか?おそらくGPUを使用してTensorFlow?
私はTensorFlowは独自のGMMアルゴリズムを持っていますが、実現するのは非常に困難だった見ました。ここで
私が書いたコードです:
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))
は、私はそれを解決! multiprocessing
を使用してください。 はちょうどあなたが代わりにフルの「対角」や球状の共分散行列に収まる場合は、プロセスをスピードアップすることができ
import multiprocessing as mp
query_points = query_points.tolist()
parallel = mp.Pool()
fv = parallel.map(par_gmm, query_points)
parallel.close()
parallel.join()
私はすでに「diag」を使っています。それはまだ遅いです。多分並列化しますか? –
@itzikBenShabat GaussianMixture関数には、n_jobsパラメータ(計算を行うために使用するCPUの数)はありませんが、それ以外の方法でポストすると面白くなります:)また、他のモジュールを使用してこのタスクを実行することを検討してください。テンソルフロー、またはMatlab – sera
@itzikBenShabatのような他のソフトウェアでさえ、ガウス成分を減らそうとしましたか? – sera