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

Posted

技术标签:

【中文标题】高斯混合模型 - 参数的 Matlab 训练【英文标题】:Gaussian Mixture Model - Matlab training for parameters 【发布时间】:2014-06-27 12:54:12 【问题描述】:

我正在运行基于高斯混合模型的语音增强算法。问题是估计算法在训练处理期间下溢。 我正在尝试计算对数频谱框架X 的PDF,给定一个高斯簇,它是每个频率分量X_k 的PDF 的乘积(fft 为k=1..256 完成) 我得到的是256 exp(-v(k)) 的产品,这样v(k)>=0

这是 MATLAB 计算的 sn-p: N - 帧数; M- 混合数; c_i 每种混合物的重量;

gamma(n,i) = c_i*f(X_n|I = i)

 for i=1 : N
    rep_DataMat(:,:,i) = repmat(DataMat(:,i),1,M); 
    gamma_exp(:,:) = (1./sqrt((2*pi*sigmaSqr_curr))).*exp(((-1)*((rep_DataMat(:,:,i) - mue_curr).^2)./(2*sigmaSqr_curr)));
    gamma_curr(i,:) = c_curr.*(prod(10*gamma_exp(:,:),1));
    alpha_curr(i,:) = gamma_curr(i,:)./sum(gamma_curr(i,:));
end

由于 K = 256,乘积很快变为零,因为数字小于 1。有没有办法可以通过导致下溢(如 logsum 或类似)来计算这个?

【问题讨论】:

【参考方案1】:

您可以在日志域中执行计算。

将乘积转换为总和非常简单。 另一方面,总和可以用诸如logsumexp 之类的东西进行转换。 这使用公式:

log(a + b) = log(exp(log(a)) + exp(log(b)))
           = log(exp(loga) + exp(logb))

其中logalogb 分别是ab 在日志域中的表示。 基本思想是分解具有最大参数的指数(例如,loga 以方便说明):

 log(exp(loga)+exp(logb)) = log(exp(loga)*(1+exp(logb-loga)))
                          = loga + log(1+exp(logb-loga))

请注意,如果您要添加的术语超过 2 个,则同样的想法也适用。

【讨论】:

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

语音识别基于高斯混合模型(GMM)的语音识别matlab源码

如何使用混合高斯模型获得可能性

Coursera高斯混合模型

使用高斯混合模型的二元分类

使用经过训练的高斯混合模型标记新数据

Matlab中的无环高斯混合模型