高斯混合模型 - 参数的 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))
其中loga
和logb
分别是a
和b
在日志域中的表示。
基本思想是分解具有最大参数的指数(例如,loga
以方便说明):
log(exp(loga)+exp(logb)) = log(exp(loga)*(1+exp(logb-loga)))
= loga + log(1+exp(logb-loga))
请注意,如果您要添加的术语超过 2 个,则同样的想法也适用。
【讨论】:
以上是关于高斯混合模型 - 参数的 Matlab 训练的主要内容,如果未能解决你的问题,请参考以下文章