我想在 MATLAB 中拟合高斯混合模型。具体来说,我想从不同的起点拟合数百个模型,并将它们拟合为几次 EM 迭代(例如 10 次)。最终目的是利用遗传算法寻找一个好的模型。
拟合混合模型非常耗时,所以我想知道是否有任何使用 MATLAB 的并行处理工具箱在 gpu 上运行的快速实现?我尝试通过将 gpuArray 传递给 gmcluster 函数并将 gmcluster 和相关文件中的适当变量更改为 gpuArray 来实现一个简单的 gpu 版本。这实际上使运行时变得更糟(在特定数据集 CPU 时间为 0.1 而 GPU 为 0.2)。
是否可以对天真的 gpu 实现进行任何改进?(我是 gpu 编程的新手)。
我知道有一些实现,例如这里的一个,但它不够灵活,无法接受均值和协方差起始参数。
我将不胜感激任何帮助/指针。
谢谢
编辑:这是需要相当长的时间的代码部分,我想在 GPU 上运行。代码计算 mu 中的平均值和 Sigma 中的协方差,给定每个 og k 高斯的概率隶属矩阵 post。
for j = 1:k
mu(j,:) = post(:,j)' * X / PComponents(j);
Xcentered = bsxfun(@minus, X, mu(j,:));
Xcentered = bsxfun(@times,sqrt(post(:,j)),Xcentered);
Sigma(:,:,j) = Xcentered'*Xcentered/S.PComponents(j)+ regVal*eye(d);
end
在哪里:
size(X) = [n,d]
size(mu) = [k,d]
size(Sigma) = [d,d,k]
size(PComponents) = [k]
对于我的目的,n 在 1000 到 10,000 之间,d 在 10 左右,k 在 2 到 15 之间。