2017-07-06 10 views
3

いくつかのデータでガウス混合モデル(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() 

答えて

0

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

を置き換えます。

用途:GaussianMixture

内部

covariance_type='diag'

または

covariance_type='spherical'

また、減少ガウスコンポーネントにしてみてください。

しかし、これは結果に影響する可能性があることに留意してください。ただし、プロセスをスピードアップする方法は他にありません。

+0

私はすでに「diag」を使っています。それはまだ遅いです。多分並列化しますか? –

+0

@itzikBenShabat GaussianMixture関数には、n_jobsパラメータ(計算を行うために使用するCPUの数)はありませんが、それ以外の方法でポストすると面白くなります:)また、他のモジュールを使用してこのタスクを実行することを検討してください。テンソルフロー、またはMatlab – sera

+0

@itzikBenShabatのような他のソフトウェアでさえ、ガウス成分を減らそうとしましたか? – sera

0

GMMのガウス成分の数が1000であることがわかります。データ次元が比較的低い(3)と仮定すれば、非常に大きな数値です。これはおそらく1000の別々のGaussiansを評価する必要があるため、遅く実行される理由です。サンプル数が少ない場合は、オーバーフィットする可能性も非常に高くなります。当然のことながら、より少ない数のコンポーネントを試すことができます。これは当然高速であり、より一般化する可能性が高くなります。

+0

提案をお寄せいただきありがとうございますが、ガウス分布の数は、私は多分あなたは単純に各セットを実行し、サンプルのセットの上に並列化することができます次に –

+0

を変更することはできません制約であるを使用して他の方法を見つけることができません@itzikBenShabat –

+0

は良いアイデアを厥、あなたはそれをどのように行うのでしょうか? –

関連する問題