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

时间:2014-06-27 12:54:13

标签: algorithm matlab signal-processing

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

以下是MATLAB计算的片段: 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。有没有办法可以通过导致下溢(如logum或类似物)计算出来?

1 个答案:

答案 0 :(得分: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个,则同样适用。