如何提高Sklearn GMM预测()性能速度?

时间:2017-07-06 17:03:00

标签: python scikit-learn multiprocessing

我正在使用 Sklearn 来估算某些数据的高斯混合模型(GMM)。

估计之后,我有很多查询点。我想获得属于每个估计高斯的概率。

以下代码有效。但是,0: 366.352801235 1: 386.216017627 2: 383.307741944 3: 359.598214393 4: 363.434228045 5: 397.255473919 6: 433.967095136 7: 407.806616677 8: 393.701390596 9: 379.542319143 0: 15.5258007875 1: 13.2543344563 2: 12.8754439597 3: 24.2303215372 4: 15.9684973291 5: 14.2023306048 6: 13.7465456437 7: 13.6964054484 8: 21.27484093 9: 13.2139143373 部分非常慢,因为我需要在100000套样本上多次运行它,其中每个样本包含1000个点。

我猜它发生的原因是它是连续的。有没有办法让它平行?或任何其他方式使其更快?也许在GPU上使用 TensorFlow

我看到 TensorFlow 有自己的 GMM 算法,但实现起来非常困难。

这是我写的代码:

gmm_sk.predict_proba(query_points)

我解决了!使用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

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

2 个答案:

答案 0 :(得分:0)

如果您使用“对角线”或球形协方差矩阵而不是完整,则可以加快处理速度。

使用:

covariance_type='diag'

covariance_type='spherical'

GaussianMixture

另外,尝试降低高斯组件

但是,请记住,这可能会影响结果,但我看不到其他方法来加快这一过程。

答案 1 :(得分:0)

我看到你的GMM中高斯分量的数量是1000,我认为这是一个非常大的数字,因为你的数据维数相对较低(3)。这可能是它运行缓慢的原因,因为它需要评估1000个单独的高斯。如果您的样本数量很少,那么这也很容易过度拟合。您可以尝试使用较少数量的组件,这些组件自然会更快,并且最有可能更好地概括。