Matlab中的无环高斯混合模型

Posted

技术标签:

【中文标题】Matlab中的无环高斯混合模型【英文标题】:Loopless Gaussian mixture model in Matlab 【发布时间】:2015-12-07 16:16:45 【问题描述】:

我有几个高斯分布,我想同时从所有这些分布中提取不同的值。因为这基本上是 GMM 所做的,所以我研究了 Matlab GMM 实现 (gmrnd),我发现它对所有组件执行了一个简单的循环。

我想以更快的方式实现它,但问题是涉及 3d 矩阵。一个简单的代码(带循环)将是

n = 10; % number of Gaussians
d = 2; % dimension of each Gaussian
mu = rand(d,n); % init some means
U = rand(d,d,n); % init some covariances with their Cholesky decomposition (Cov = U'*U)
I = repmat(triu(true(d,d)),1,1,n);
U(~I) = 0;
r = randn(d,n); % random values for drawing samples

samples = zeros(d,n);
for i = 1 : n
    samples(:,i) = U(:,:,i)' * r(:,i) + mu(:,i);
end

可以加快速度吗?我不知道如何处理 3d 协方差矩阵(不使用cellfun,这要慢得多)。

【问题讨论】:

【参考方案1】:

这里可以提出一些改进(希望是改进)。

PARTE #1你可以替换下面这段代码-

I = repmat(triu(true(d,d)),[1,1,n]);
U(~I) = 0;

bsxfun(@times,..) 单线 -

U = bsxfun(@times,triu(true(d,d)),U)

PARTE #2您可以杀死代码中的循环部分,像这样使用bsxfun(@times,..) -

samples = squeeze(sum(bsxfun(@times,U,permute(r,[1 3 2])),2)) + mu

【讨论】:

谢谢!不过,总和必须沿第一维进行。使用更高的n(在我的计算机内存不足之前最多提高 10 倍),速度会显着提高,但如果我也增加d,那么情况就会相反。在循环和bsxfun之间如何选择,似乎真的要视情况而定,我认为没有一个普遍的规律。尽管如此,再次感谢!除了您的建议之外,我认为没有其他方法可以杀死循环。【参考方案2】:

我不完全相信这会更快,但它摆脱了循环。如果可以的话,看看基准测试结果会很有趣。我也认为这段代码相当丑陋,很难推断发生了什么,但我会让你在可读性和性能之间做出决定。

无论如何,我决定定义一个大的n*d 维高斯,其中每个变量块d 彼此独立(如原始版本一样)。这允许将协方差定义为块对角矩阵,我使用blkdiag。从那里开始,只需应用bsxfun 即可消除循环的需要。

使用相同的随机种子,我可以恢复与您的代码相同的样本:

%// sampling with block diagonal covariance matrix
rng(1) %// set random seed
Ub = mat2cell(U, d, d, ones(n,1)); %// 1-by-1-by-10 cell of 2-by-2 matrices
C = blkdiag(Ub:);
Ns = 1; %// number of samples
joint_samples = bsxfun(@plus, C'*randn(d*n, Ns), mu(:));
new_samples = reshape(joint_samples, [d n]); %// or [d n Ns] if Ns > 1

%//Compare to original
rng(1) %// set same seed for repeatability
r = randn(d,n); % random values for drawing samples
samples = zeros(d,n);
for i = 1 : n
    samples(:,i) = U(:,:,i)' * r(:,i) + mu(:,i);
end

isequal(samples, new_samples) %// true

【讨论】:

感谢您的回复!不幸的是,您的解决方案速度较慢(至少 10 倍,甚至更多增加 nm),并且比循环更快地耗尽内存(因为 zeros(...) 的预分配)。

以上是关于Matlab中的无环高斯混合模型的主要内容,如果未能解决你的问题,请参考以下文章

高斯混合模型 - 参数的 Matlab 训练

在 MATLAB 中可视化高斯混合模型集群

从 sklearn 中的高斯混合模型中获取 PDF

MATLAB教程案例33基于高斯混合模型的视频背景提取算法的matlab仿真实现

基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真

高斯混合模型GMM核心参数高斯混合模型GMM的数学形式