【问题标题】:Gaussian Mixture Model - Matlab training for parameters高斯混合模型 - 参数的 Matlab 训练
【发布时间】: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 或类似)来计算这个?

【问题讨论】:

    标签: algorithm matlab signal-processing


    【解决方案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 个,则同样的想法也适用。

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2014-12-03
      • 2021-12-15
      • 2014-01-14
      • 1970-01-01
      • 2021-09-30
      • 2015-10-16
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多