我正在使用 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))
答案 0 :(得分:0)
如果您使用“对角线”或球形协方差矩阵而不是完整,则可以加快处理速度。
使用:
covariance_type='diag'
或
covariance_type='spherical'
在GaussianMixture
另外,尝试降低高斯组件。
但是,请记住,这可能会影响结果,但我看不到其他方法来加快这一过程。
答案 1 :(得分:0)
我看到你的GMM中高斯分量的数量是1000,我认为这是一个非常大的数字,因为你的数据维数相对较低(3)。这可能是它运行缓慢的原因,因为它需要评估1000个单独的高斯。如果您的样本数量很少,那么这也很容易过度拟合。您可以尝试使用较少数量的组件,这些组件自然会更快,并且最有可能更好地概括。