我正在运行基于高斯混合模型的语音增强算法。问题是估计算法在训练处理期间下溢。
我正在尝试计算一个对数谱帧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或类似物)计算出来?
答案 0 :(得分: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个,则同样适用。