2014-06-27 45 views
2

我正在運行基於高斯混合模型的語音增強算法。問題是估計算法在訓練處理期間下溢。 我想計算一個對數頻譜幀X的PDF,給出一個高斯聚類,它是每個頻率成分的PDF產品X_k(fft是爲k = 1..256完成的) 我得到的是256 exp(-v(k))這樣v(k)>=0高斯混合模型 - 參數的Matlab訓練

這裏是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,因爲這些數字是較小然後之一。有沒有一種方法可以通過引起下溢(如logsum或類似的)來計算?

回答

1

您可以在日誌域中執行計算。

將產品轉化爲總和很簡單。 另一方面,可以使用諸如logsumexp之類的東西進行轉換。 這適用使用下式:

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

loga在哪裏和logbab在對數域中的相應的表示。 的基本思想是那麼因式分解與最大的參數(如loga用於說明目的。)指數:

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

請注意,如果你有超過2項增加了同樣的想法適用。