使用EM计算GMM参数时处理欠流量

时间:2014-07-01 12:39:42

标签: algorithm matlab signal-processing

我目前正在使用matlab上的logpecrum样本矩阵进行训练我经常处理下溢问题。我知道我需要使用log来处理下溢问题。 我仍在使用uderflow,当我计算平均值(mue)因为它是negetive我不能使用日志所以我需要下溢的实际值。 这些是我正在使用的等式: enter image description here

在MATLAB代码中,我在函数中计算log_tau避免下溢,但在计算mue时我需要exp(log(tau)),它变为零。 我附加了相关的MATLAB代码 **我在代码中称为变量alpha是tau ...

for i = 1 : 50
        log_c = Logsum(log_alpha,1) - log(N);
        c = exp(log_c);
        mue = DataMat*alpha./(repmat(exp(Logsum(log_alpha,1)),FrameSize,1));
        log_abs_mue = log(abs(mue));
        log_SigmaSqr = log((DataMat.^2)*alpha) - repmat(Logsum(log_alpha,1),FrameSize,1) - 2*log_abs_mue;
        SigmaSqr = exp(log_SigmaSqr);
        for j=1:N
            rep_DataMat(:,:,j) = repmat(DataMat(:,j),1,M);
            log_gamma(j,:) = log_c - 0.5*(FrameSize*log(2*pi)+sum(log_SigmaSqr)) + sum((rep_DataMat(:,:,j) - mue).^2./(2*SigmaSqr));
        end
        log_alpha = log_gamma - repmat(Logsum(log_gamma,2),1,M);
        alpha = exp(log_alpha);
    end        
    c = exp(log_c);
    SigmaSqr = exp(log_SigmaSqr);

有没有人知道我怎么能避免这种情况?或者需要在代码中修复什么?

1 个答案:

答案 0 :(得分:0)

我所做的是将这一行添加到MATLAB代码中:

mue(isnan(mue))=0; %fix 0/0 problem

和这一个:

SigmaSqr(SigmaSqr==0)=1;%fix if mue_k = x_k

不确定这是否是最佳解决方案,但似乎有效...... 谁有更好的主意?